Speedometer: Restructure Ember example
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 25 Aug 2017 21:59:29 +0000 (21:59 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 25 Aug 2017 21:59:29 +0000 (21:59 +0000)
https://bugs.webkit.org/show_bug.cgi?id=175926

Patch by Mathias Bynens <mathias@qiwi.be> on 2017-08-25
Reviewed by Ryosuke Niwa.

This patch removes an unused stylesheet from the output, and gets rid of the unneeded intermediate `source` folder.

* Speedometer/resources/tests.js: Update path to Ember benchmark.
* Speedometer/resources/todomvc/architecture-examples/emberjs/source/*: Moved to `../`.
* Speedometer/resources/todomvc/architecture-examples/emberjs/app/index.html: Removed stylesheet reference.
* Speedometer/resources/todomvc/architecture-examples/emberjs/app/styles/.gitkeep: Added.
* Speedometer/resources/todomvc/architecture-examples/emberjs/dist/*: Regenerated per build instructions.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@221206 268f45cc-cd09-0410-ab3c-d52691b4dbfc

62 files changed:
PerformanceTests/ChangeLog
PerformanceTests/Speedometer/resources/tests.js
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/.bowerrc [moved from PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/source/.bowerrc with 100% similarity]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/.editorconfig [moved from PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/source/.editorconfig with 100% similarity]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/.ember-cli [moved from PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/source/.ember-cli with 100% similarity]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/.gitignore [moved from PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/source/.gitignore with 91% similarity]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/.jshintrc [moved from PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/source/.jshintrc with 100% similarity]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/README.md
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/app/app.js [moved from PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/source/app/app.js with 100% similarity]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/app/components/todo-item.js [moved from PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/source/app/components/todo-item.js with 100% similarity]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/app/components/todo-list.js [moved from PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/source/app/components/todo-list.js with 100% similarity]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/app/controllers/active.js [moved from PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/source/app/controllers/active.js with 100% similarity]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/app/controllers/application.js [moved from PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/source/app/controllers/application.js with 100% similarity]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/app/controllers/completed.js [moved from PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/source/app/controllers/completed.js with 100% similarity]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/app/helpers/gt.js [moved from PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/source/app/helpers/gt.js with 100% similarity]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/app/helpers/pluralize.js [moved from PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/source/app/helpers/pluralize.js with 100% similarity]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/app/index.html [moved from PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/source/app/index.html with 90% similarity]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/app/resolver.js [moved from PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/source/app/resolver.js with 100% similarity]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/app/router.js [moved from PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/source/app/router.js with 100% similarity]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/app/routes/application.js [moved from PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/source/app/routes/application.js with 100% similarity]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/app/services/memory.js [moved from PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/source/app/services/memory.js with 100% similarity]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/app/services/repo.js [moved from PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/source/app/services/repo.js with 100% similarity]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/app/styles/.gitkeep [new file with mode: 0644]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/app/templates/active.hbs [moved from PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/source/app/templates/active.hbs with 100% similarity]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/app/templates/application.hbs [moved from PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/source/app/templates/application.hbs with 100% similarity]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/app/templates/completed.hbs [moved from PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/source/app/templates/completed.hbs with 100% similarity]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/app/templates/components/todo-item.hbs [moved from PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/source/app/templates/components/todo-item.hbs with 100% similarity]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/app/templates/components/todo-list.hbs [moved from PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/source/app/templates/components/todo-list.hbs with 100% similarity]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/app/templates/index.hbs [moved from PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/source/app/templates/index.hbs with 100% similarity]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/assets/todomvc.js [deleted file]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/assets/vendor.css [deleted file]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/assets/vendor.js [deleted file]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/bower.json [moved from PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/source/bower.json with 100% similarity]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/config/environment.js [moved from PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/source/config/environment.js with 100% similarity]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/dist/assets/todomvc-677491ba42e10b5fa16875d8bcaf1c6c.js [moved from PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/source/dist/assets/todomvc-7601ffca6150ed633f0f333fe76bfaf2.js with 99% similarity]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/dist/assets/vendor-7b5c98520910afa58d74e05ec86cd873.css [moved from PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/source/dist/assets/vendor-7b5c98520910afa58d74e05ec86cd873.css with 100% similarity]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/dist/assets/vendor-820919567eb7bd4d9fac358a90a5aac4.js [moved from PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/source/dist/assets/vendor-820919567eb7bd4d9fac358a90a5aac4.js with 100% similarity]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/dist/crossdomain.xml [moved from PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/crossdomain.xml with 100% similarity]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/dist/index.html [moved from PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/source/dist/index.html with 67% similarity]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/dist/robots.txt [moved from PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/robots.txt with 100% similarity]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/ember-cli-build.js [moved from PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/source/ember-cli-build.js with 100% similarity]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/index.html [deleted file]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/package-lock.json [moved from PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/source/package-lock.json with 100% similarity]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/package.json [moved from PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/source/package.json with 100% similarity]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/public/crossdomain.xml [moved from PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/source/dist/crossdomain.xml with 100% similarity]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/public/robots.txt [moved from PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/source/dist/robots.txt with 100% similarity]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/source/.travis.yml [deleted file]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/source/.watchmanconfig [deleted file]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/source/README.md [deleted file]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/source/public/crossdomain.xml [deleted file]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/source/public/robots.txt [deleted file]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/source/testem.js [deleted file]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/source/tests/index.html [deleted file]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/testem.js
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/tests/helpers/destroy-app.js [moved from PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/source/tests/helpers/destroy-app.js with 100% similarity]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/tests/helpers/module-for-acceptance.js [moved from PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/source/tests/helpers/module-for-acceptance.js with 100% similarity]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/tests/helpers/resolver.js [moved from PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/source/tests/helpers/resolver.js with 100% similarity]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/tests/helpers/start-app.js [moved from PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/source/tests/helpers/start-app.js with 100% similarity]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/tests/index.html
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/tests/test-helper.js [moved from PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/source/tests/test-helper.js with 100% similarity]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/vendor/base.css [moved from PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/source/vendor/base.css with 100% similarity]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/vendor/index.css [moved from PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/source/vendor/index.css with 100% similarity]

index 9fcd3ea..e0aa16a 100644 (file)
@@ -1,3 +1,18 @@
+2017-08-25  Mathias Bynens  <mathias@qiwi.be>
+
+        Speedometer: Restructure Ember example
+        https://bugs.webkit.org/show_bug.cgi?id=175926
+
+        Reviewed by Ryosuke Niwa.
+
+        This patch removes an unused stylesheet from the output, and gets rid of the unneeded intermediate `source` folder.
+
+        * Speedometer/resources/tests.js: Update path to Ember benchmark.
+        * Speedometer/resources/todomvc/architecture-examples/emberjs/source/*: Moved to `../`.
+        * Speedometer/resources/todomvc/architecture-examples/emberjs/app/index.html: Removed stylesheet reference.
+        * Speedometer/resources/todomvc/architecture-examples/emberjs/app/styles/.gitkeep: Added.
+        * Speedometer/resources/todomvc/architecture-examples/emberjs/dist/*: Regenerated per build instructions.
+
 2017-08-24  Ryosuke Niwa  <rniwa@webkit.org>
 
         Speedometer 2.0: Duplicate the current EmberJS test as EmberJS-Debug test
index b93ba14..70bc585 100644 (file)
@@ -166,7 +166,7 @@ Suites.push({
 
 Suites.push({
     name: 'EmberJS-TodoMVC',
-    url: 'todomvc/architecture-examples/emberjs/index.html',
+    url: 'todomvc/architecture-examples/emberjs/dist/index.html',
     prepare: function (runner, contentWindow, contentDocument) {
         return runner.waitForElement('#new-todo').then(function (element) {
             element.focus();
index 1324b26..b863488 100644 (file)
@@ -1,3 +1,8 @@
 # Speedometer 2.0: Ember.js TodoMVC example
 
-See `source/README.md`.
+## Test locally
+
+1. `npm install && bower install`
+2. `npm run build`
+3. Run a local server from the `dist` directory. (You could use [`npm i -g http-server`](https://github.com/indexzero/http-server).)
+4. Open the URL pointing to the local server in your web browser of choice.
@@ -8,7 +8,6 @@
     <meta name="viewport" content="width=device-width, initial-scale=1">
     {{content-for "head"}}
     <link rel="stylesheet" href="{{rootURL}}assets/vendor.css">
-    <link rel="stylesheet" href="{{rootURL}}assets/todomvc.css">
     {{content-for "head-footer"}}
   </head>
   <body>
diff --git a/PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/app/styles/.gitkeep b/PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/app/styles/.gitkeep
new file mode 100644 (file)
index 0000000..edf5819
--- /dev/null
@@ -0,0 +1,2 @@
+# This file ensures the `app/styles` directory is included in the repository.
+# Without that directory present, the Ember TodoMVC example fails to build.
diff --git a/PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/assets/todomvc.js b/PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/assets/todomvc.js
deleted file mode 100644 (file)
index 7d4dfb3..0000000
+++ /dev/null
@@ -1,1260 +0,0 @@
-"use strict";
-
-/* jshint ignore:start */
-
-
-
-/* jshint ignore:end */
-
-define('todomvc/app', ['exports', 'ember', 'todomvc/resolver', 'ember-load-initializers', 'todomvc/config/environment'], function (exports, _ember, _todomvcResolver, _emberLoadInitializers, _todomvcConfigEnvironment) {
-
-    var App = undefined;
-
-    _ember['default'].MODEL_FACTORY_INJECTIONS = true;
-
-    App = _ember['default'].Application.extend({
-        modulePrefix: _todomvcConfigEnvironment['default'].modulePrefix,
-        podModulePrefix: _todomvcConfigEnvironment['default'].podModulePrefix,
-        Resolver: _todomvcResolver['default']
-    });
-
-    (0, _emberLoadInitializers['default'])(App, _todomvcConfigEnvironment['default'].modulePrefix);
-
-    exports['default'] = App;
-});
-define('todomvc/components/app-version', ['exports', 'ember-cli-app-version/components/app-version', 'todomvc/config/environment'], function (exports, _emberCliAppVersionComponentsAppVersion, _todomvcConfigEnvironment) {
-
-  var name = _todomvcConfigEnvironment['default'].APP.name;
-  var version = _todomvcConfigEnvironment['default'].APP.version;
-
-  exports['default'] = _emberCliAppVersionComponentsAppVersion['default'].extend({
-    version: version,
-    name: name
-  });
-});
-define('todomvc/components/todo-item', ['exports', 'ember'], function (exports, _ember) {
-    exports['default'] = _ember['default'].Component.extend({
-        repo: _ember['default'].inject.service(),
-        tagName: 'li',
-        editing: false,
-        classNameBindings: ['todo.completed', 'editing'],
-
-        actions: {
-            startEditing: function startEditing() {
-                this.get('onStartEdit')();
-                this.set('editing', true);
-                _ember['default'].run.scheduleOnce('afterRender', this, 'focusInput');
-            },
-
-            doneEditing: function doneEditing(todoTitle) {
-                if (!this.get('editing')) {
-                    return;
-                }
-                if (_ember['default'].isBlank(todoTitle)) {
-                    this.send('removeTodo');
-                } else {
-                    this.set('todo.title', todoTitle.trim());
-                    this.set('editing', false);
-                    this.get('onEndEdit')();
-                }
-            },
-
-            handleKeydown: function handleKeydown(e) {
-                if (e.keyCode === 13) {
-                    e.target.blur();
-                } else if (e.keyCode === 27) {
-                    this.set('editing', false);
-                }
-            },
-
-            toggleCompleted: function toggleCompleted(e) {
-                var todo = this.get('todo');
-                _ember['default'].set(todo, 'completed', e.target.checked);
-                this.get('repo').persist();
-            },
-
-            removeTodo: function removeTodo() {
-                this.get('repo')['delete'](this.get('todo'));
-            }
-        },
-
-        focusInput: function focusInput() {
-            this.element.querySelector('input.edit').focus();
-        }
-    });
-});
-define('todomvc/components/todo-list', ['exports', 'ember'], function (exports, _ember) {
-    exports['default'] = _ember['default'].Component.extend({
-        repo: _ember['default'].inject.service(),
-        tagName: 'section',
-        elementId: 'main',
-        canToggle: true,
-        allCompleted: _ember['default'].computed('todos.@each.completed', function () {
-            return this.get('todos').isEvery('completed');
-        }),
-
-        actions: {
-            enableToggle: function enableToggle() {
-                this.set('canToggle', true);
-            },
-
-            disableToggle: function disableToggle() {
-                this.set('canToggle', false);
-            },
-
-            toggleAll: function toggleAll() {
-                var allCompleted = this.get('allCompleted');
-                this.get('todos').forEach(function (todo) {
-                    return _ember['default'].set(todo, 'completed', !allCompleted);
-                });
-                this.get('repo').persist();
-            }
-        }
-    });
-});
-define('todomvc/controllers/active', ['exports', 'ember'], function (exports, _ember) {
-    exports['default'] = _ember['default'].Controller.extend({
-        todos: _ember['default'].computed.filterBy('model', 'completed', false)
-    });
-});
-define('todomvc/controllers/application', ['exports', 'ember'], function (exports, _ember) {
-    exports['default'] = _ember['default'].Controller.extend({
-        repo: _ember['default'].inject.service(),
-        remaining: _ember['default'].computed.filterBy('model', 'completed', false),
-        completed: _ember['default'].computed.filterBy('model', 'completed'),
-        actions: {
-            createTodo: function createTodo(e) {
-                if (e.keyCode === 13 && !_ember['default'].isBlank(e.target.value)) {
-                    this.get('repo').add({ title: e.target.value.trim(), completed: false });
-                    e.target.value = '';
-                }
-            },
-
-            clearCompleted: function clearCompleted() {
-                this.get('model').removeObjects(this.get('completed'));
-                this.get('repo').persist();
-            }
-        }
-    });
-});
-define('todomvc/controllers/completed', ['exports', 'ember'], function (exports, _ember) {
-    exports['default'] = _ember['default'].Controller.extend({
-        todos: _ember['default'].computed.filterBy('model', 'completed', true)
-    });
-});
-define('todomvc/helpers/gt', ['exports', 'ember'], function (exports, _ember) {
-    var _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })();
-
-    exports.gt = gt;
-
-    function gt(_ref /*, hash*/) {
-        var _ref2 = _slicedToArray(_ref, 2);
-
-        var n1 = _ref2[0];
-        var n2 = _ref2[1];
-
-        return n1 > n2;
-    }
-
-    exports['default'] = _ember['default'].Helper.helper(gt);
-});
-define('todomvc/helpers/pluralize', ['exports', 'ember', 'ember-inflector'], function (exports, _ember, _emberInflector) {
-    var _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })();
-
-    exports.pluralizeHelper = pluralizeHelper;
-
-    function pluralizeHelper(_ref /*, hash*/) {
-        var _ref2 = _slicedToArray(_ref, 2);
-
-        var singular = _ref2[0];
-        var count = _ref2[1];
-
-        return count === 1 ? singular : (0, _emberInflector.pluralize)(singular);
-    }
-
-    exports['default'] = _ember['default'].Helper.helper(pluralizeHelper);
-});
-define('todomvc/helpers/singularize', ['exports', 'ember-inflector/lib/helpers/singularize'], function (exports, _emberInflectorLibHelpersSingularize) {
-  exports['default'] = _emberInflectorLibHelpersSingularize['default'];
-});
-define('todomvc/initializers/app-version', ['exports', 'ember-cli-app-version/initializer-factory', 'todomvc/config/environment'], function (exports, _emberCliAppVersionInitializerFactory, _todomvcConfigEnvironment) {
-  exports['default'] = {
-    name: 'App Version',
-    initialize: (0, _emberCliAppVersionInitializerFactory['default'])(_todomvcConfigEnvironment['default'].APP.name, _todomvcConfigEnvironment['default'].APP.version)
-  };
-});
-define('todomvc/initializers/container-debug-adapter', ['exports', 'ember-resolver/container-debug-adapter'], function (exports, _emberResolverContainerDebugAdapter) {
-  exports['default'] = {
-    name: 'container-debug-adapter',
-
-    initialize: function initialize() {
-      var app = arguments[1] || arguments[0];
-
-      app.register('container-debug-adapter:main', _emberResolverContainerDebugAdapter['default']);
-      app.inject('container-debug-adapter:main', 'namespace', 'application:main');
-    }
-  };
-});
-define('todomvc/initializers/export-application-global', ['exports', 'ember', 'todomvc/config/environment'], function (exports, _ember, _todomvcConfigEnvironment) {
-  exports.initialize = initialize;
-
-  function initialize() {
-    var application = arguments[1] || arguments[0];
-    if (_todomvcConfigEnvironment['default'].exportApplicationGlobal !== false) {
-      var theGlobal;
-      if (typeof window !== 'undefined') {
-        theGlobal = window;
-      } else if (typeof global !== 'undefined') {
-        theGlobal = global;
-      } else if (typeof self !== 'undefined') {
-        theGlobal = self;
-      } else {
-        // no reasonable global, just bail
-        return;
-      }
-
-      var value = _todomvcConfigEnvironment['default'].exportApplicationGlobal;
-      var globalName;
-
-      if (typeof value === 'string') {
-        globalName = value;
-      } else {
-        globalName = _ember['default'].String.classify(_todomvcConfigEnvironment['default'].modulePrefix);
-      }
-
-      if (!theGlobal[globalName]) {
-        theGlobal[globalName] = application;
-
-        application.reopen({
-          willDestroy: function willDestroy() {
-            this._super.apply(this, arguments);
-            delete theGlobal[globalName];
-          }
-        });
-      }
-    }
-  }
-
-  exports['default'] = {
-    name: 'export-application-global',
-
-    initialize: initialize
-  };
-});
-define('todomvc/instance-initializers/global', ['exports'], function (exports) {
-  exports.initialize = initialize;
-  // app/instance-initializers/global.js
-
-  function initialize(application) {
-    window.App = application; // or window.Whatever
-  }
-
-  exports['default'] = {
-    name: 'global',
-    initialize: initialize
-  };
-});
-define('todomvc/resolver', ['exports', 'ember-resolver'], function (exports, _emberResolver) {
-  exports['default'] = _emberResolver['default'];
-});
-define('todomvc/router', ['exports', 'ember', 'todomvc/config/environment'], function (exports, _ember, _todomvcConfigEnvironment) {
-
-    var Router = _ember['default'].Router.extend({
-        location: _todomvcConfigEnvironment['default'].locationType
-    });
-
-    Router.map(function () {
-        this.route('active');
-        this.route('completed');
-    });
-
-    exports['default'] = Router;
-});
-define('todomvc/routes/application', ['exports', 'ember'], function (exports, _ember) {
-    exports['default'] = _ember['default'].Route.extend({
-        repo: _ember['default'].inject.service(),
-        model: function model() {
-            return this.get('repo').findAll();
-        }
-    });
-});
-define('todomvc/services/ajax', ['exports', 'ember-ajax/services/ajax'], function (exports, _emberAjaxServicesAjax) {
-  Object.defineProperty(exports, 'default', {
-    enumerable: true,
-    get: function get() {
-      return _emberAjaxServicesAjax['default'];
-    }
-  });
-});
-define('todomvc/services/memory', ['exports'], function (exports) {
-  (function (root) {
-    var localStorageMemory = {};
-    var cache = {};
-
-    /**
-     * number of stored items.
-     */
-    localStorageMemory.length = 0;
-
-    /**
-     * returns item for passed key, or null
-     *
-     * @para {String} key
-     *       name of item to be returned
-     * @returns {String|null}
-     */
-    localStorageMemory.getItem = function (key) {
-      return cache[key] || null;
-    };
-
-    /**
-     * sets item for key to passed value, as String
-     *
-     * @para {String} key
-     *       name of item to be set
-     * @para {String} value
-     *       value, will always be turned into a String
-     * @returns {undefined}
-     */
-    localStorageMemory.setItem = function (key, value) {
-      if (typeof value === 'undefined') {
-        localStorageMemory.removeItem(key);
-      } else {
-        if (!cache.hasOwnProperty(key)) {
-          localStorageMemory.length++;
-        }
-
-        cache[key] = '' + value;
-      }
-    };
-
-    /**
-     * removes item for passed key
-     *
-     * @para {String} key
-     *       name of item to be removed
-     * @returns {undefined}
-     */
-    localStorageMemory.removeItem = function (key) {
-      if (cache.hasOwnProperty(key)) {
-        delete cache[key];
-        localStorageMemory.length--;
-      }
-    };
-
-    /**
-     * returns name of key at passed index
-     *
-     * @para {Number} index
-     *       Position for key to be returned (starts at 0)
-     * @returns {String|null}
-     */
-    localStorageMemory.key = function (index) {
-      return Object.keys(cache)[index] || null;
-    };
-
-    /**
-     * removes all stored items and sets length to 0
-     *
-     * @returns {undefined}
-     */
-    localStorageMemory.clear = function () {
-      cache = {};
-      localStorageMemory.length = 0;
-    };
-
-    root.localStorageMemory = localStorageMemory;
-  })(window);
-});
-define('todomvc/services/repo', ['exports', 'ember', 'todomvc/services/memory'], function (exports, _ember, _todomvcServicesMemory) {
-    exports['default'] = _ember['default'].Service.extend({
-        lastId: 0,
-        data: null,
-        findAll: function findAll() {
-            return this.get('data') || this.set('data', JSON.parse(window.localStorageMemory.getItem('todos') || '[]'));
-        },
-
-        add: function add(attrs) {
-            var todo = Object.assign({ id: this.incrementProperty('lastId') }, attrs);
-            this.get('data').pushObject(todo);
-            this.persist();
-            return todo;
-        },
-
-        'delete': function _delete(todo) {
-            this.get('data').removeObject(todo);
-            this.persist();
-        },
-
-        persist: function persist() {
-            window.localStorageMemory.setItem('todos', JSON.stringify(this.get('data')));
-        }
-    });
-});
-define("todomvc/templates/active", ["exports"], function (exports) {
-  exports["default"] = Ember.HTMLBars.template((function () {
-    return {
-      meta: {
-        "fragmentReason": {
-          "name": "missing-wrapper",
-          "problems": ["wrong-type"]
-        },
-        "revision": "Ember@2.6.2",
-        "loc": {
-          "source": null,
-          "start": {
-            "line": 1,
-            "column": 0
-          },
-          "end": {
-            "line": 1,
-            "column": 25
-          }
-        },
-        "moduleName": "todomvc/templates/active.hbs"
-      },
-      isEmpty: false,
-      arity: 0,
-      cachedFragment: null,
-      hasRendered: false,
-      buildFragment: function buildFragment(dom) {
-        var el0 = dom.createDocumentFragment();
-        var el1 = dom.createComment("");
-        dom.appendChild(el0, el1);
-        return el0;
-      },
-      buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
-        var morphs = new Array(1);
-        morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
-        dom.insertBoundary(fragment, 0);
-        dom.insertBoundary(fragment, null);
-        return morphs;
-      },
-      statements: [["inline", "todo-list", [], ["todos", ["subexpr", "@mut", [["get", "todos", ["loc", [null, [1, 18], [1, 23]]]]], [], []]], ["loc", [null, [1, 0], [1, 25]]]]],
-      locals: [],
-      templates: []
-    };
-  })());
-});
-define("todomvc/templates/application", ["exports"], function (exports) {
-  exports["default"] = Ember.HTMLBars.template((function () {
-    var child0 = (function () {
-      var child0 = (function () {
-        return {
-          meta: {
-            "fragmentReason": false,
-            "revision": "Ember@2.6.2",
-            "loc": {
-              "source": null,
-              "start": {
-                "line": 11,
-                "column": 14
-              },
-              "end": {
-                "line": 11,
-                "column": 60
-              }
-            },
-            "moduleName": "todomvc/templates/application.hbs"
-          },
-          isEmpty: false,
-          arity: 0,
-          cachedFragment: null,
-          hasRendered: false,
-          buildFragment: function buildFragment(dom) {
-            var el0 = dom.createDocumentFragment();
-            var el1 = dom.createTextNode("All");
-            dom.appendChild(el0, el1);
-            return el0;
-          },
-          buildRenderNodes: function buildRenderNodes() {
-            return [];
-          },
-          statements: [],
-          locals: [],
-          templates: []
-        };
-      })();
-      var child1 = (function () {
-        return {
-          meta: {
-            "fragmentReason": false,
-            "revision": "Ember@2.6.2",
-            "loc": {
-              "source": null,
-              "start": {
-                "line": 12,
-                "column": 14
-              },
-              "end": {
-                "line": 12,
-                "column": 64
-              }
-            },
-            "moduleName": "todomvc/templates/application.hbs"
-          },
-          isEmpty: false,
-          arity: 0,
-          cachedFragment: null,
-          hasRendered: false,
-          buildFragment: function buildFragment(dom) {
-            var el0 = dom.createDocumentFragment();
-            var el1 = dom.createTextNode("Active");
-            dom.appendChild(el0, el1);
-            return el0;
-          },
-          buildRenderNodes: function buildRenderNodes() {
-            return [];
-          },
-          statements: [],
-          locals: [],
-          templates: []
-        };
-      })();
-      var child2 = (function () {
-        return {
-          meta: {
-            "fragmentReason": false,
-            "revision": "Ember@2.6.2",
-            "loc": {
-              "source": null,
-              "start": {
-                "line": 13,
-                "column": 14
-              },
-              "end": {
-                "line": 13,
-                "column": 70
-              }
-            },
-            "moduleName": "todomvc/templates/application.hbs"
-          },
-          isEmpty: false,
-          arity: 0,
-          cachedFragment: null,
-          hasRendered: false,
-          buildFragment: function buildFragment(dom) {
-            var el0 = dom.createDocumentFragment();
-            var el1 = dom.createTextNode("Completed");
-            dom.appendChild(el0, el1);
-            return el0;
-          },
-          buildRenderNodes: function buildRenderNodes() {
-            return [];
-          },
-          statements: [],
-          locals: [],
-          templates: []
-        };
-      })();
-      var child3 = (function () {
-        return {
-          meta: {
-            "fragmentReason": false,
-            "revision": "Ember@2.6.2",
-            "loc": {
-              "source": null,
-              "start": {
-                "line": 15,
-                "column": 8
-              },
-              "end": {
-                "line": 17,
-                "column": 8
-              }
-            },
-            "moduleName": "todomvc/templates/application.hbs"
-          },
-          isEmpty: false,
-          arity: 0,
-          cachedFragment: null,
-          hasRendered: false,
-          buildFragment: function buildFragment(dom) {
-            var el0 = dom.createDocumentFragment();
-            var el1 = dom.createTextNode("          ");
-            dom.appendChild(el0, el1);
-            var el1 = dom.createElement("button");
-            dom.setAttribute(el1, "id", "clear-completed");
-            var el2 = dom.createTextNode("Clear completed");
-            dom.appendChild(el1, el2);
-            dom.appendChild(el0, el1);
-            var el1 = dom.createTextNode("\n");
-            dom.appendChild(el0, el1);
-            return el0;
-          },
-          buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
-            var element0 = dom.childAt(fragment, [1]);
-            var morphs = new Array(1);
-            morphs[0] = dom.createAttrMorph(element0, 'onclick');
-            return morphs;
-          },
-          statements: [["attribute", "onclick", ["subexpr", "action", ["clearCompleted"], [], ["loc", [null, [16, 47], [16, 74]]]]]],
-          locals: [],
-          templates: []
-        };
-      })();
-      return {
-        meta: {
-          "fragmentReason": false,
-          "revision": "Ember@2.6.2",
-          "loc": {
-            "source": null,
-            "start": {
-              "line": 7,
-              "column": 4
-            },
-            "end": {
-              "line": 19,
-              "column": 4
-            }
-          },
-          "moduleName": "todomvc/templates/application.hbs"
-        },
-        isEmpty: false,
-        arity: 0,
-        cachedFragment: null,
-        hasRendered: false,
-        buildFragment: function buildFragment(dom) {
-          var el0 = dom.createDocumentFragment();
-          var el1 = dom.createTextNode("      ");
-          dom.appendChild(el0, el1);
-          var el1 = dom.createElement("footer");
-          dom.setAttribute(el1, "id", "footer");
-          var el2 = dom.createTextNode("\n        ");
-          dom.appendChild(el1, el2);
-          var el2 = dom.createElement("span");
-          dom.setAttribute(el2, "id", "todo-count");
-          var el3 = dom.createElement("strong");
-          var el4 = dom.createComment("");
-          dom.appendChild(el3, el4);
-          dom.appendChild(el2, el3);
-          var el3 = dom.createTextNode(" ");
-          dom.appendChild(el2, el3);
-          var el3 = dom.createComment("");
-          dom.appendChild(el2, el3);
-          var el3 = dom.createTextNode(" left");
-          dom.appendChild(el2, el3);
-          dom.appendChild(el1, el2);
-          var el2 = dom.createTextNode("\n        ");
-          dom.appendChild(el1, el2);
-          var el2 = dom.createElement("ul");
-          dom.setAttribute(el2, "id", "filters");
-          var el3 = dom.createTextNode("\n          ");
-          dom.appendChild(el2, el3);
-          var el3 = dom.createElement("li");
-          var el4 = dom.createComment("");
-          dom.appendChild(el3, el4);
-          dom.appendChild(el2, el3);
-          var el3 = dom.createTextNode("\n          ");
-          dom.appendChild(el2, el3);
-          var el3 = dom.createElement("li");
-          var el4 = dom.createComment("");
-          dom.appendChild(el3, el4);
-          dom.appendChild(el2, el3);
-          var el3 = dom.createTextNode("\n          ");
-          dom.appendChild(el2, el3);
-          var el3 = dom.createElement("li");
-          var el4 = dom.createComment("");
-          dom.appendChild(el3, el4);
-          dom.appendChild(el2, el3);
-          var el3 = dom.createTextNode("\n        ");
-          dom.appendChild(el2, el3);
-          dom.appendChild(el1, el2);
-          var el2 = dom.createTextNode("\n");
-          dom.appendChild(el1, el2);
-          var el2 = dom.createComment("");
-          dom.appendChild(el1, el2);
-          var el2 = dom.createTextNode("      ");
-          dom.appendChild(el1, el2);
-          dom.appendChild(el0, el1);
-          var el1 = dom.createTextNode("\n");
-          dom.appendChild(el0, el1);
-          return el0;
-        },
-        buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
-          var element1 = dom.childAt(fragment, [1]);
-          var element2 = dom.childAt(element1, [1]);
-          var element3 = dom.childAt(element1, [3]);
-          var morphs = new Array(6);
-          morphs[0] = dom.createMorphAt(dom.childAt(element2, [0]), 0, 0);
-          morphs[1] = dom.createMorphAt(element2, 2, 2);
-          morphs[2] = dom.createMorphAt(dom.childAt(element3, [1]), 0, 0);
-          morphs[3] = dom.createMorphAt(dom.childAt(element3, [3]), 0, 0);
-          morphs[4] = dom.createMorphAt(dom.childAt(element3, [5]), 0, 0);
-          morphs[5] = dom.createMorphAt(element1, 5, 5);
-          return morphs;
-        },
-        statements: [["content", "remaining.length", ["loc", [null, [9, 38], [9, 58]]]], ["inline", "pluralize", ["item", ["get", "remaining.length", ["loc", [null, [9, 87], [9, 103]]]]], [], ["loc", [null, [9, 68], [9, 105]]]], ["block", "link-to", ["index"], ["activeClass", "selected"], 0, null, ["loc", [null, [11, 14], [11, 72]]]], ["block", "link-to", ["active"], ["activeClass", "selected"], 1, null, ["loc", [null, [12, 14], [12, 76]]]], ["block", "link-to", ["completed"], ["activeClass", "selected"], 2, null, ["loc", [null, [13, 14], [13, 82]]]], ["block", "if", [["get", "completed.length", ["loc", [null, [15, 14], [15, 30]]]]], [], 3, null, ["loc", [null, [15, 8], [17, 15]]]]],
-        locals: [],
-        templates: [child0, child1, child2, child3]
-      };
-    })();
-    return {
-      meta: {
-        "fragmentReason": {
-          "name": "missing-wrapper",
-          "problems": ["multiple-nodes"]
-        },
-        "revision": "Ember@2.6.2",
-        "loc": {
-          "source": null,
-          "start": {
-            "line": 1,
-            "column": 0
-          },
-          "end": {
-            "line": 29,
-            "column": 9
-          }
-        },
-        "moduleName": "todomvc/templates/application.hbs"
-      },
-      isEmpty: false,
-      arity: 0,
-      cachedFragment: null,
-      hasRendered: false,
-      buildFragment: function buildFragment(dom) {
-        var el0 = dom.createDocumentFragment();
-        var el1 = dom.createElement("section");
-        dom.setAttribute(el1, "id", "todoapp");
-        var el2 = dom.createTextNode("\n  ");
-        dom.appendChild(el1, el2);
-        var el2 = dom.createElement("header");
-        dom.setAttribute(el2, "id", "header");
-        var el3 = dom.createTextNode("\n    ");
-        dom.appendChild(el2, el3);
-        var el3 = dom.createElement("h1");
-        var el4 = dom.createTextNode("todos");
-        dom.appendChild(el3, el4);
-        dom.appendChild(el2, el3);
-        var el3 = dom.createTextNode("\n    ");
-        dom.appendChild(el2, el3);
-        var el3 = dom.createElement("input");
-        dom.setAttribute(el3, "type", "text");
-        dom.setAttribute(el3, "id", "new-todo");
-        dom.setAttribute(el3, "placeholder", "What needs to be done?");
-        dom.setAttribute(el3, "autofocus", "");
-        dom.appendChild(el2, el3);
-        var el3 = dom.createTextNode("\n  ");
-        dom.appendChild(el2, el3);
-        dom.appendChild(el1, el2);
-        var el2 = dom.createTextNode("\n    ");
-        dom.appendChild(el1, el2);
-        var el2 = dom.createComment("");
-        dom.appendChild(el1, el2);
-        var el2 = dom.createTextNode("\n");
-        dom.appendChild(el1, el2);
-        var el2 = dom.createComment("");
-        dom.appendChild(el1, el2);
-        dom.appendChild(el0, el1);
-        var el1 = dom.createTextNode("\n");
-        dom.appendChild(el0, el1);
-        var el1 = dom.createElement("footer");
-        dom.setAttribute(el1, "id", "info");
-        var el2 = dom.createTextNode("\n  ");
-        dom.appendChild(el1, el2);
-        var el2 = dom.createElement("p");
-        var el3 = dom.createTextNode("Double-click to edit a todo");
-        dom.appendChild(el2, el3);
-        dom.appendChild(el1, el2);
-        var el2 = dom.createTextNode("\n  ");
-        dom.appendChild(el1, el2);
-        var el2 = dom.createElement("p");
-        var el3 = dom.createTextNode("\n    Created by\n    ");
-        dom.appendChild(el2, el3);
-        var el3 = dom.createElement("a");
-        dom.setAttribute(el3, "href", "http://github.com/cibernox");
-        var el4 = dom.createTextNode("Miguel Camba");
-        dom.appendChild(el3, el4);
-        dom.appendChild(el2, el3);
-        var el3 = dom.createTextNode(",\n    ");
-        dom.appendChild(el2, el3);
-        var el3 = dom.createElement("a");
-        dom.setAttribute(el3, "href", "http://github.com/addyosmani");
-        var el4 = dom.createTextNode("Addy Osmani");
-        dom.appendChild(el3, el4);
-        dom.appendChild(el2, el3);
-        var el3 = dom.createTextNode("\n  ");
-        dom.appendChild(el2, el3);
-        dom.appendChild(el1, el2);
-        var el2 = dom.createTextNode("\n  ");
-        dom.appendChild(el1, el2);
-        var el2 = dom.createElement("p");
-        var el3 = dom.createTextNode("Part of ");
-        dom.appendChild(el2, el3);
-        var el3 = dom.createElement("a");
-        dom.setAttribute(el3, "href", "http://todomvc.com");
-        var el4 = dom.createTextNode("TodoMVC");
-        dom.appendChild(el3, el4);
-        dom.appendChild(el2, el3);
-        dom.appendChild(el1, el2);
-        var el2 = dom.createTextNode("\n");
-        dom.appendChild(el1, el2);
-        dom.appendChild(el0, el1);
-        return el0;
-      },
-      buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
-        var element4 = dom.childAt(fragment, [0]);
-        var element5 = dom.childAt(element4, [1, 3]);
-        var morphs = new Array(3);
-        morphs[0] = dom.createAttrMorph(element5, 'onkeydown');
-        morphs[1] = dom.createMorphAt(element4, 3, 3);
-        morphs[2] = dom.createMorphAt(element4, 5, 5);
-        return morphs;
-      },
-      statements: [["attribute", "onkeydown", ["subexpr", "action", ["createTodo"], [], ["loc", [null, [4, 47], [4, 70]]]]], ["content", "outlet", ["loc", [null, [6, 4], [6, 14]]]], ["block", "if", [["subexpr", "gt", [["get", "model.length", ["loc", [null, [7, 14], [7, 26]]]], 0], [], ["loc", [null, [7, 10], [7, 29]]]]], [], 0, null, ["loc", [null, [7, 4], [19, 11]]]]],
-      locals: [],
-      templates: [child0]
-    };
-  })());
-});
-define("todomvc/templates/completed", ["exports"], function (exports) {
-  exports["default"] = Ember.HTMLBars.template((function () {
-    return {
-      meta: {
-        "fragmentReason": {
-          "name": "missing-wrapper",
-          "problems": ["wrong-type"]
-        },
-        "revision": "Ember@2.6.2",
-        "loc": {
-          "source": null,
-          "start": {
-            "line": 1,
-            "column": 0
-          },
-          "end": {
-            "line": 1,
-            "column": 25
-          }
-        },
-        "moduleName": "todomvc/templates/completed.hbs"
-      },
-      isEmpty: false,
-      arity: 0,
-      cachedFragment: null,
-      hasRendered: false,
-      buildFragment: function buildFragment(dom) {
-        var el0 = dom.createDocumentFragment();
-        var el1 = dom.createComment("");
-        dom.appendChild(el0, el1);
-        return el0;
-      },
-      buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
-        var morphs = new Array(1);
-        morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
-        dom.insertBoundary(fragment, 0);
-        dom.insertBoundary(fragment, null);
-        return morphs;
-      },
-      statements: [["inline", "todo-list", [], ["todos", ["subexpr", "@mut", [["get", "todos", ["loc", [null, [1, 18], [1, 23]]]]], [], []]], ["loc", [null, [1, 0], [1, 25]]]]],
-      locals: [],
-      templates: []
-    };
-  })());
-});
-define("todomvc/templates/components/todo-item", ["exports"], function (exports) {
-  exports["default"] = Ember.HTMLBars.template((function () {
-    return {
-      meta: {
-        "fragmentReason": {
-          "name": "missing-wrapper",
-          "problems": ["multiple-nodes"]
-        },
-        "revision": "Ember@2.6.2",
-        "loc": {
-          "source": null,
-          "start": {
-            "line": 1,
-            "column": 0
-          },
-          "end": {
-            "line": 6,
-            "column": 153
-          }
-        },
-        "moduleName": "todomvc/templates/components/todo-item.hbs"
-      },
-      isEmpty: false,
-      arity: 0,
-      cachedFragment: null,
-      hasRendered: false,
-      buildFragment: function buildFragment(dom) {
-        var el0 = dom.createDocumentFragment();
-        var el1 = dom.createElement("div");
-        dom.setAttribute(el1, "class", "view");
-        var el2 = dom.createTextNode("\n  ");
-        dom.appendChild(el1, el2);
-        var el2 = dom.createElement("input");
-        dom.setAttribute(el2, "type", "checkbox");
-        dom.setAttribute(el2, "class", "toggle");
-        dom.appendChild(el1, el2);
-        var el2 = dom.createTextNode("\n  ");
-        dom.appendChild(el1, el2);
-        var el2 = dom.createElement("label");
-        var el3 = dom.createComment("");
-        dom.appendChild(el2, el3);
-        dom.appendChild(el1, el2);
-        var el2 = dom.createTextNode("\n  ");
-        dom.appendChild(el1, el2);
-        var el2 = dom.createElement("button");
-        dom.setAttribute(el2, "class", "destroy");
-        dom.appendChild(el1, el2);
-        var el2 = dom.createTextNode("\n");
-        dom.appendChild(el1, el2);
-        dom.appendChild(el0, el1);
-        var el1 = dom.createTextNode("\n");
-        dom.appendChild(el0, el1);
-        var el1 = dom.createElement("input");
-        dom.setAttribute(el1, "type", "text");
-        dom.setAttribute(el1, "class", "edit");
-        dom.setAttribute(el1, "autofocus", "");
-        dom.appendChild(el0, el1);
-        return el0;
-      },
-      buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
-        var element0 = dom.childAt(fragment, [0]);
-        var element1 = dom.childAt(element0, [1]);
-        if (this.cachedFragment) {
-          dom.repairClonedNode(element1, [], true);
-        }
-        var element2 = dom.childAt(element0, [3]);
-        var element3 = dom.childAt(element0, [5]);
-        var element4 = dom.childAt(fragment, [2]);
-        var morphs = new Array(8);
-        morphs[0] = dom.createAttrMorph(element1, 'checked');
-        morphs[1] = dom.createAttrMorph(element1, 'onchange');
-        morphs[2] = dom.createAttrMorph(element2, 'ondblclick');
-        morphs[3] = dom.createMorphAt(element2, 0, 0);
-        morphs[4] = dom.createAttrMorph(element3, 'onclick');
-        morphs[5] = dom.createAttrMorph(element4, 'value');
-        morphs[6] = dom.createAttrMorph(element4, 'onblur');
-        morphs[7] = dom.createAttrMorph(element4, 'onkeydown');
-        return morphs;
-      },
-      statements: [["attribute", "checked", ["get", "todo.completed", ["loc", [null, [2, 50], [2, 64]]]]], ["attribute", "onchange", ["subexpr", "action", ["toggleCompleted"], [], ["loc", [null, [2, 76], [2, 104]]]]], ["attribute", "ondblclick", ["subexpr", "action", ["startEditing"], [], ["loc", [null, [3, 20], [3, 45]]]]], ["content", "todo.title", ["loc", [null, [3, 46], [3, 60]]]], ["attribute", "onclick", ["subexpr", "action", ["removeTodo"], [], ["loc", [null, [4, 18], [4, 41]]]]], ["attribute", "value", ["get", "todo.title", ["loc", [null, [6, 40], [6, 50]]]]], ["attribute", "onblur", ["subexpr", "action", ["doneEditing"], ["value", "target.value"], ["loc", [null, [6, 60], [6, 105]]]]], ["attribute", "onkeydown", ["subexpr", "action", ["handleKeydown"], [], ["loc", [null, [6, 116], [6, 142]]]]]],
-      locals: [],
-      templates: []
-    };
-  })());
-});
-define("todomvc/templates/components/todo-list", ["exports"], function (exports) {
-  exports["default"] = Ember.HTMLBars.template((function () {
-    var child0 = (function () {
-      var child0 = (function () {
-        return {
-          meta: {
-            "fragmentReason": false,
-            "revision": "Ember@2.6.2",
-            "loc": {
-              "source": null,
-              "start": {
-                "line": 2,
-                "column": 2
-              },
-              "end": {
-                "line": 4,
-                "column": 2
-              }
-            },
-            "moduleName": "todomvc/templates/components/todo-list.hbs"
-          },
-          isEmpty: false,
-          arity: 0,
-          cachedFragment: null,
-          hasRendered: false,
-          buildFragment: function buildFragment(dom) {
-            var el0 = dom.createDocumentFragment();
-            var el1 = dom.createTextNode("    ");
-            dom.appendChild(el0, el1);
-            var el1 = dom.createElement("input");
-            dom.setAttribute(el1, "type", "checkbox");
-            dom.setAttribute(el1, "id", "toggle-all");
-            dom.appendChild(el0, el1);
-            var el1 = dom.createTextNode("\n");
-            dom.appendChild(el0, el1);
-            return el0;
-          },
-          buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
-            var element0 = dom.childAt(fragment, [1]);
-            if (this.cachedFragment) {
-              dom.repairClonedNode(element0, [], true);
-            }
-            var morphs = new Array(2);
-            morphs[0] = dom.createAttrMorph(element0, 'checked');
-            morphs[1] = dom.createAttrMorph(element0, 'onchange');
-            return morphs;
-          },
-          statements: [["attribute", "checked", ["get", "allCompleted", ["loc", [null, [3, 53], [3, 65]]]]], ["attribute", "onchange", ["subexpr", "action", ["toggleAll"], [], ["loc", [null, [3, 77], [3, 99]]]]]],
-          locals: [],
-          templates: []
-        };
-      })();
-      var child1 = (function () {
-        return {
-          meta: {
-            "fragmentReason": false,
-            "revision": "Ember@2.6.2",
-            "loc": {
-              "source": null,
-              "start": {
-                "line": 6,
-                "column": 4
-              },
-              "end": {
-                "line": 8,
-                "column": 4
-              }
-            },
-            "moduleName": "todomvc/templates/components/todo-list.hbs"
-          },
-          isEmpty: false,
-          arity: 1,
-          cachedFragment: null,
-          hasRendered: false,
-          buildFragment: function buildFragment(dom) {
-            var el0 = dom.createDocumentFragment();
-            var el1 = dom.createTextNode("      ");
-            dom.appendChild(el0, el1);
-            var el1 = dom.createComment("");
-            dom.appendChild(el0, el1);
-            var el1 = dom.createTextNode("\n");
-            dom.appendChild(el0, el1);
-            return el0;
-          },
-          buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
-            var morphs = new Array(1);
-            morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
-            return morphs;
-          },
-          statements: [["inline", "todo-item", [], ["todo", ["subexpr", "@mut", [["get", "todo", ["loc", [null, [7, 23], [7, 27]]]]], [], []], "onStartEdit", ["subexpr", "action", ["disableToggle"], [], ["loc", [null, [7, 40], [7, 64]]]], "onEndEdit", ["subexpr", "action", ["enableToggle"], [], ["loc", [null, [7, 75], [7, 98]]]]], ["loc", [null, [7, 6], [7, 100]]]]],
-          locals: ["todo"],
-          templates: []
-        };
-      })();
-      return {
-        meta: {
-          "fragmentReason": {
-            "name": "missing-wrapper",
-            "problems": ["wrong-type", "multiple-nodes"]
-          },
-          "revision": "Ember@2.6.2",
-          "loc": {
-            "source": null,
-            "start": {
-              "line": 1,
-              "column": 0
-            },
-            "end": {
-              "line": 10,
-              "column": 0
-            }
-          },
-          "moduleName": "todomvc/templates/components/todo-list.hbs"
-        },
-        isEmpty: false,
-        arity: 0,
-        cachedFragment: null,
-        hasRendered: false,
-        buildFragment: function buildFragment(dom) {
-          var el0 = dom.createDocumentFragment();
-          var el1 = dom.createComment("");
-          dom.appendChild(el0, el1);
-          var el1 = dom.createTextNode("  ");
-          dom.appendChild(el0, el1);
-          var el1 = dom.createElement("ul");
-          dom.setAttribute(el1, "id", "todo-list");
-          dom.setAttribute(el1, "class", "todo-list");
-          var el2 = dom.createTextNode("\n");
-          dom.appendChild(el1, el2);
-          var el2 = dom.createComment("");
-          dom.appendChild(el1, el2);
-          var el2 = dom.createTextNode("  ");
-          dom.appendChild(el1, el2);
-          dom.appendChild(el0, el1);
-          var el1 = dom.createTextNode("\n");
-          dom.appendChild(el0, el1);
-          return el0;
-        },
-        buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
-          var morphs = new Array(2);
-          morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
-          morphs[1] = dom.createMorphAt(dom.childAt(fragment, [2]), 1, 1);
-          dom.insertBoundary(fragment, 0);
-          return morphs;
-        },
-        statements: [["block", "if", [["get", "canToggle", ["loc", [null, [2, 8], [2, 17]]]]], [], 0, null, ["loc", [null, [2, 2], [4, 9]]]], ["block", "each", [["get", "todos", ["loc", [null, [6, 12], [6, 17]]]]], [], 1, null, ["loc", [null, [6, 4], [8, 13]]]]],
-        locals: [],
-        templates: [child0, child1]
-      };
-    })();
-    return {
-      meta: {
-        "fragmentReason": {
-          "name": "missing-wrapper",
-          "problems": ["wrong-type"]
-        },
-        "revision": "Ember@2.6.2",
-        "loc": {
-          "source": null,
-          "start": {
-            "line": 1,
-            "column": 0
-          },
-          "end": {
-            "line": 11,
-            "column": 0
-          }
-        },
-        "moduleName": "todomvc/templates/components/todo-list.hbs"
-      },
-      isEmpty: false,
-      arity: 0,
-      cachedFragment: null,
-      hasRendered: false,
-      buildFragment: function buildFragment(dom) {
-        var el0 = dom.createDocumentFragment();
-        var el1 = dom.createComment("");
-        dom.appendChild(el0, el1);
-        return el0;
-      },
-      buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
-        var morphs = new Array(1);
-        morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
-        dom.insertBoundary(fragment, 0);
-        dom.insertBoundary(fragment, null);
-        return morphs;
-      },
-      statements: [["block", "if", [["get", "todos.length", ["loc", [null, [1, 6], [1, 18]]]]], [], 0, null, ["loc", [null, [1, 0], [10, 7]]]]],
-      locals: [],
-      templates: [child0]
-    };
-  })());
-});
-define("todomvc/templates/index", ["exports"], function (exports) {
-  exports["default"] = Ember.HTMLBars.template((function () {
-    var child0 = (function () {
-      return {
-        meta: {
-          "fragmentReason": {
-            "name": "missing-wrapper",
-            "problems": ["wrong-type"]
-          },
-          "revision": "Ember@2.6.2",
-          "loc": {
-            "source": null,
-            "start": {
-              "line": 1,
-              "column": 0
-            },
-            "end": {
-              "line": 3,
-              "column": 0
-            }
-          },
-          "moduleName": "todomvc/templates/index.hbs"
-        },
-        isEmpty: false,
-        arity: 0,
-        cachedFragment: null,
-        hasRendered: false,
-        buildFragment: function buildFragment(dom) {
-          var el0 = dom.createDocumentFragment();
-          var el1 = dom.createTextNode("  ");
-          dom.appendChild(el0, el1);
-          var el1 = dom.createComment("");
-          dom.appendChild(el0, el1);
-          var el1 = dom.createTextNode("\n");
-          dom.appendChild(el0, el1);
-          return el0;
-        },
-        buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
-          var morphs = new Array(1);
-          morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
-          return morphs;
-        },
-        statements: [["inline", "todo-list", [], ["todos", ["subexpr", "@mut", [["get", "model", ["loc", [null, [2, 20], [2, 25]]]]], [], []]], ["loc", [null, [2, 2], [2, 27]]]]],
-        locals: [],
-        templates: []
-      };
-    })();
-    return {
-      meta: {
-        "fragmentReason": {
-          "name": "missing-wrapper",
-          "problems": ["wrong-type"]
-        },
-        "revision": "Ember@2.6.2",
-        "loc": {
-          "source": null,
-          "start": {
-            "line": 1,
-            "column": 0
-          },
-          "end": {
-            "line": 4,
-            "column": 0
-          }
-        },
-        "moduleName": "todomvc/templates/index.hbs"
-      },
-      isEmpty: false,
-      arity: 0,
-      cachedFragment: null,
-      hasRendered: false,
-      buildFragment: function buildFragment(dom) {
-        var el0 = dom.createDocumentFragment();
-        var el1 = dom.createComment("");
-        dom.appendChild(el0, el1);
-        return el0;
-      },
-      buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
-        var morphs = new Array(1);
-        morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
-        dom.insertBoundary(fragment, 0);
-        dom.insertBoundary(fragment, null);
-        return morphs;
-      },
-      statements: [["block", "if", [["get", "model.length", ["loc", [null, [1, 6], [1, 18]]]]], [], 0, null, ["loc", [null, [1, 0], [3, 7]]]]],
-      locals: [],
-      templates: [child0]
-    };
-  })());
-});
-/* jshint ignore:start */
-
-
-
-/* jshint ignore:end */
-
-/* jshint ignore:start */
-
-define('todomvc/config/environment', ['ember'], function(Ember) {
-  var prefix = 'todomvc';
-/* jshint ignore:start */
-
-try {
-  var metaName = prefix + '/config/environment';
-  var rawConfig = Ember['default'].$('meta[name="' + metaName + '"]').attr('content');
-  var config = JSON.parse(unescape(rawConfig));
-
-  return { 'default': config };
-}
-catch(err) {
-  throw new Error('Could not read config from meta tag with name "' + metaName + '".');
-}
-
-/* jshint ignore:end */
-
-});
-
-/* jshint ignore:end */
-
-/* jshint ignore:start */
-
-if (!runningTests) {
-  require("todomvc/app")["default"].create({"name":"todomvc","version":"0.0.0+"});
-}
-
-/* jshint ignore:end */
-//# sourceMappingURL=todomvc.map
diff --git a/PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/assets/vendor.css b/PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/assets/vendor.css
deleted file mode 100644 (file)
index 5e4645d..0000000
+++ /dev/null
@@ -1,521 +0,0 @@
-hr {
-    margin: 20px 0;
-    border: 0;
-    border-top: 1px dashed #c5c5c5;
-    border-bottom: 1px dashed #f7f7f7;
-}
-
-.learn a {
-    font-weight: normal;
-    text-decoration: none;
-    color: #b83f45;
-}
-
-.learn a:hover {
-    text-decoration: underline;
-    color: #787e7e;
-}
-
-.learn h3,
-.learn h4,
-.learn h5 {
-    margin: 10px 0;
-    font-weight: 500;
-    line-height: 1.2;
-    color: #000;
-}
-
-.learn h3 {
-    font-size: 24px;
-}
-
-.learn h4 {
-    font-size: 18px;
-}
-
-.learn h5 {
-    margin-bottom: 0;
-    font-size: 14px;
-}
-
-.learn ul {
-    padding: 0;
-    margin: 0 0 30px 25px;
-}
-
-.learn li {
-    line-height: 20px;
-}
-
-.learn p {
-    font-size: 15px;
-    font-weight: 300;
-    line-height: 1.3;
-    margin-top: 0;
-    margin-bottom: 0;
-}
-
-#issue-count {
-    display: none;
-}
-
-.quote {
-    border: none;
-    margin: 20px 0 60px 0;
-}
-
-.quote p {
-    font-style: italic;
-}
-
-.quote p:before {
-    content: '“';
-    font-size: 50px;
-    opacity: .15;
-    position: absolute;
-    top: -20px;
-    left: 3px;
-}
-
-.quote p:after {
-    content: '”';
-    font-size: 50px;
-    opacity: .15;
-    position: absolute;
-    bottom: -42px;
-    right: 3px;
-}
-
-.quote footer {
-    position: absolute;
-    bottom: -40px;
-    right: 0;
-}
-
-.quote footer img {
-    border-radius: 3px;
-}
-
-.quote footer a {
-    margin-left: 5px;
-    vertical-align: middle;
-}
-
-.speech-bubble {
-    position: relative;
-    padding: 10px;
-    background: rgba(0, 0, 0, .04);
-    border-radius: 5px;
-}
-
-.speech-bubble:after {
-    content: '';
-    position: absolute;
-    top: 100%;
-    right: 30px;
-    border: 13px solid transparent;
-    border-top-color: rgba(0, 0, 0, .04);
-}
-
-.learn-bar > .learn {
-    position: absolute;
-    width: 272px;
-    top: 8px;
-    left: -300px;
-    padding: 10px;
-    border-radius: 5px;
-    background-color: rgba(255, 255, 255, .6);
-    transition-property: left;
-    transition-duration: 500ms;
-}
-
-@media (min-width: 899px) {
-    .learn-bar {
-        width: auto;
-        padding-left: 300px;
-    }
-
-    .learn-bar > .learn {
-        left: 8px;
-    }
-}
-
-html,
-body {
-    margin: 0;
-    padding: 0;
-}
-
-button {
-    margin: 0;
-    padding: 0;
-    border: 0;
-    background: none;
-    font-size: 100%;
-    vertical-align: baseline;
-    font-family: inherit;
-    font-weight: inherit;
-    color: inherit;
-    -webkit-appearance: none;
-    appearance: none;
-    -webkit-font-smoothing: antialiased;
-    -moz-font-smoothing: antialiased;
-    font-smoothing: antialiased;
-}
-
-body {
-    font: 14px 'Helvetica Neue', Helvetica, Arial, sans-serif;
-    line-height: 1.4em;
-    background: #f5f5f5;
-    color: #4d4d4d;
-    min-width: 230px;
-    max-width: 550px;
-    margin: 0 auto;
-    -webkit-font-smoothing: antialiased;
-    -moz-font-smoothing: antialiased;
-    font-smoothing: antialiased;
-    font-weight: 300;
-}
-
-button,
-input[type="checkbox"] {
-    outline: none;
-}
-
-.hidden {
-    display: none;
-}
-
-#todoapp {
-    background: #fff;
-    margin: 130px 0 40px 0;
-    position: relative;
-    box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2),
-                0 25px 50px 0 rgba(0, 0, 0, 0.1);
-}
-
-#todoapp input::-webkit-input-placeholder {
-    font-style: italic;
-    font-weight: 300;
-    color: #e6e6e6;
-}
-
-#todoapp input::-moz-placeholder {
-    font-style: italic;
-    font-weight: 300;
-    color: #e6e6e6;
-}
-
-#todoapp input::input-placeholder {
-    font-style: italic;
-    font-weight: 300;
-    color: #e6e6e6;
-}
-
-#todoapp h1 {
-    position: absolute;
-    top: -155px;
-    width: 100%;
-    font-size: 100px;
-    font-weight: 100;
-    text-align: center;
-    color: rgba(175, 47, 47, 0.15);
-    -webkit-text-rendering: optimizeLegibility;
-    -moz-text-rendering: optimizeLegibility;
-    text-rendering: optimizeLegibility;
-}
-
-#new-todo,
-.edit {
-    position: relative;
-    margin: 0;
-    width: 100%;
-    font-size: 24px;
-    font-family: inherit;
-    font-weight: inherit;
-    line-height: 1.4em;
-    border: 0;
-    outline: none;
-    color: inherit;
-    padding: 6px;
-    border: 1px solid #999;
-    box-shadow: inset 0 -1px 5px 0 rgba(0, 0, 0, 0.2);
-    box-sizing: border-box;
-    -webkit-font-smoothing: antialiased;
-    -moz-font-smoothing: antialiased;
-    font-smoothing: antialiased;
-}
-
-#new-todo {
-    padding: 16px 16px 16px 60px;
-    border: none;
-    background: rgba(0, 0, 0, 0.003);
-    box-shadow: inset 0 -2px 1px rgba(0,0,0,0.03);
-}
-
-#main {
-    position: relative;
-    z-index: 2;
-    border-top: 1px solid #e6e6e6;
-}
-
-label[for='toggle-all'] {
-    display: none;
-}
-
-#toggle-all {
-    position: absolute;
-    top: -55px;
-    left: -12px;
-    width: 60px;
-    height: 34px;
-    text-align: center;
-    border: none; /* Mobile Safari */
-}
-
-#toggle-all:before {
-    content: '❯';
-    font-size: 22px;
-    color: #e6e6e6;
-    padding: 10px 27px 10px 27px;
-}
-
-#toggle-all:checked:before {
-    color: #737373;
-}
-
-#todo-list {
-    margin: 0;
-    padding: 0;
-    list-style: none;
-}
-
-#todo-list li {
-    position: relative;
-    font-size: 24px;
-    border-bottom: 1px solid #ededed;
-}
-
-#todo-list li:last-child {
-    border-bottom: none;
-}
-
-#todo-list li.editing {
-    border-bottom: none;
-    padding: 0;
-}
-
-#todo-list li.editing .edit {
-    display: block;
-    width: 506px;
-    padding: 13px 17px 12px 17px;
-    margin: 0 0 0 43px;
-}
-
-#todo-list li.editing .view {
-    display: none;
-}
-
-#todo-list li .toggle {
-    text-align: center;
-    width: 40px;
-    /* auto, since non-WebKit browsers doesn't support input styling */
-    height: auto;
-    position: absolute;
-    top: 0;
-    bottom: 0;
-    margin: auto 0;
-    border: none; /* Mobile Safari */
-    -webkit-appearance: none;
-    appearance: none;
-}
-
-#todo-list li .toggle:after {
-    content: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="-10 -18 100 135"><circle cx="50" cy="50" r="50" fill="none" stroke="#ededed" stroke-width="3"/></svg>');
-}
-
-#todo-list li .toggle:checked:after {
-    content: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="-10 -18 100 135"><circle cx="50" cy="50" r="50" fill="none" stroke="#bddad5" stroke-width="3"/><path fill="#5dc2af" d="M72 25L42 71 27 56l-4 4 20 20 34-52z"/></svg>');
-}
-
-#todo-list li label {
-    white-space: pre;
-    word-break: break-word;
-    padding: 15px 60px 15px 15px;
-    margin-left: 45px;
-    display: block;
-    line-height: 1.2;
-    transition: color 0.4s;
-}
-
-#todo-list li.completed label {
-    color: #d9d9d9;
-    text-decoration: line-through;
-}
-
-#todo-list li .destroy {
-    display: none;
-    position: absolute;
-    top: 0;
-    right: 10px;
-    bottom: 0;
-    width: 40px;
-    height: 40px;
-    margin: auto 0;
-    font-size: 30px;
-    color: #cc9a9a;
-    margin-bottom: 11px;
-    transition: color 0.2s ease-out;
-}
-
-#todo-list li .destroy:hover {
-    color: #af5b5e;
-}
-
-#todo-list li .destroy:after {
-    content: '×';
-}
-
-#todo-list li:hover .destroy {
-    display: block;
-}
-
-#todo-list li .edit {
-    display: none;
-}
-
-#todo-list li.editing:last-child {
-    margin-bottom: -1px;
-}
-
-#footer {
-    color: #777;
-    padding: 10px 15px;
-    height: 20px;
-    text-align: center;
-    border-top: 1px solid #e6e6e6;
-}
-
-#footer:before {
-    content: '';
-    position: absolute;
-    right: 0;
-    bottom: 0;
-    left: 0;
-    height: 50px;
-    overflow: hidden;
-    box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2),
-                0 8px 0 -3px #f6f6f6,
-                0 9px 1px -3px rgba(0, 0, 0, 0.2),
-                0 16px 0 -6px #f6f6f6,
-                0 17px 2px -6px rgba(0, 0, 0, 0.2);
-}
-
-#todo-count {
-    float: left;
-    text-align: left;
-}
-
-#todo-count strong {
-    font-weight: 300;
-}
-
-#filters {
-    margin: 0;
-    padding: 0;
-    list-style: none;
-    position: absolute;
-    right: 0;
-    left: 0;
-}
-
-#filters li {
-    display: inline;
-}
-
-#filters li a {
-    color: inherit;
-    margin: 3px;
-    padding: 3px 7px;
-    text-decoration: none;
-    border: 1px solid transparent;
-    border-radius: 3px;
-}
-
-#filters li a.selected,
-#filters li a:hover {
-    border-color: rgba(175, 47, 47, 0.1);
-}
-
-#filters li a.selected {
-    border-color: rgba(175, 47, 47, 0.2);
-}
-
-#clear-completed,
-html #clear-completed:active {
-    float: right;
-    position: relative;
-    line-height: 20px;
-    text-decoration: none;
-    cursor: pointer;
-    position: relative;
-}
-
-#clear-completed:hover {
-    text-decoration: underline;
-}
-
-#info {
-    margin: 65px auto 0;
-    color: #bfbfbf;
-    font-size: 10px;
-    text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
-    text-align: center;
-}
-
-#info p {
-    line-height: 1;
-}
-
-#info a {
-    color: inherit;
-    text-decoration: none;
-    font-weight: 400;
-}
-
-#info a:hover {
-    text-decoration: underline;
-}
-
-/*
-    Hack to remove background from Mobile Safari.
-    Can't use it globally since it destroys checkboxes in Firefox
-*/
-@media screen and (-webkit-min-device-pixel-ratio:0) {
-    #toggle-all,
-    #todo-list li .toggle {
-        background: none;
-    }
-
-    #todo-list li .toggle {
-        height: 40px;
-    }
-
-    #toggle-all {
-        -webkit-transform: rotate(90deg);
-        transform: rotate(90deg);
-        -webkit-appearance: none;
-        appearance: none;
-    }
-}
-
-@media (max-width: 430px) {
-    #footer {
-        height: 50px;
-    }
-
-    #filters {
-        bottom: 10px;
-    }
-}
-
diff --git a/PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/assets/vendor.js b/PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/assets/vendor.js
deleted file mode 100644 (file)
index 54d7101..0000000
+++ /dev/null
@@ -1,66121 +0,0 @@
-/* jshint ignore:start */
-
-window.EmberENV = {"FEATURES":{}};
-var runningTests = false;
-
-
-
-/* jshint ignore:end */
-
-;var loader, define, requireModule, require, requirejs;
-
-(function (global) {
-  'use strict';
-
-  var heimdall = global.heimdall;
-
-  function dict() {
-    var obj = Object.create(null);
-    obj['__'] = undefined;
-    delete obj['__'];
-    return obj;
-  }
-
-  // Save off the original values of these globals, so we can restore them if someone asks us to
-  var oldGlobals = {
-    loader: loader,
-    define: define,
-    requireModule: requireModule,
-    require: require,
-    requirejs: requirejs
-  };
-
-  requirejs = require = requireModule = function (name) {
-    var pending = [];
-    var mod = findModule(name, '(require)', pending);
-
-    for (var i = pending.length - 1; i >= 0; i--) {
-      pending[i].exports();
-    }
-
-    return mod.module.exports;
-  };
-
-  loader = {
-    noConflict: function (aliases) {
-      var oldName, newName;
-
-      for (oldName in aliases) {
-        if (aliases.hasOwnProperty(oldName)) {
-          if (oldGlobals.hasOwnProperty(oldName)) {
-            newName = aliases[oldName];
-
-            global[newName] = global[oldName];
-            global[oldName] = oldGlobals[oldName];
-          }
-        }
-      }
-    }
-  };
-
-  var _isArray;
-  if (!Array.isArray) {
-    _isArray = function (x) {
-      return Object.prototype.toString.call(x) === '[object Array]';
-    };
-  } else {
-    _isArray = Array.isArray;
-  }
-
-  var registry = dict();
-  var seen = dict();
-
-  var uuid = 0;
-
-  function unsupportedModule(length) {
-    throw new Error('an unsupported module was defined, expected `define(name, deps, module)` instead got: `' + length + '` arguments to define`');
-  }
-
-  var defaultDeps = ['require', 'exports', 'module'];
-
-  function Module(name, deps, callback, alias) {
-    this.id = uuid++;
-    this.name = name;
-    this.deps = !deps.length && callback.length ? defaultDeps : deps;
-    this.module = { exports: {} };
-    this.callback = callback;
-    this.hasExportsAsDep = false;
-    this.isAlias = alias;
-    this.reified = new Array(deps.length);
-
-    /*
-       Each module normally passes through these states, in order:
-         new       : initial state
-         pending   : this module is scheduled to be executed
-         reifying  : this module's dependencies are being executed
-         reified   : this module's dependencies finished executing successfully
-         errored   : this module's dependencies failed to execute
-         finalized : this module executed successfully
-     */
-    this.state = 'new';
-  }
-
-  Module.prototype.makeDefaultExport = function () {
-    var exports = this.module.exports;
-    if (exports !== null && (typeof exports === 'object' || typeof exports === 'function') && exports['default'] === undefined && Object.isExtensible(exports)) {
-      exports['default'] = exports;
-    }
-  };
-
-  Module.prototype.exports = function () {
-    // if finalized, there is no work to do. If reifying, there is a
-    // circular dependency so we must return our (partial) exports.
-    if (this.state === 'finalized' || this.state === 'reifying') {
-      return this.module.exports;
-    }
-
-    if (loader.wrapModules) {
-      this.callback = loader.wrapModules(this.name, this.callback);
-    }
-
-    this.reify();
-
-    var result = this.callback.apply(this, this.reified);
-    this.state = 'finalized';
-
-    if (!(this.hasExportsAsDep && result === undefined)) {
-      this.module.exports = result;
-    }
-    this.makeDefaultExport();
-    return this.module.exports;
-  };
-
-  Module.prototype.unsee = function () {
-    this.state = 'new';
-    this.module = { exports: {} };
-  };
-
-  Module.prototype.reify = function () {
-    if (this.state === 'reified') {
-      return;
-    }
-    this.state = 'reifying';
-    try {
-      this.reified = this._reify();
-      this.state = 'reified';
-    } finally {
-      if (this.state === 'reifying') {
-        this.state = 'errored';
-      }
-    }
-  };
-
-  Module.prototype._reify = function () {
-    var reified = this.reified.slice();
-    for (var i = 0; i < reified.length; i++) {
-      var mod = reified[i];
-      reified[i] = mod.exports ? mod.exports : mod.module.exports();
-    }
-    return reified;
-  };
-
-  Module.prototype.findDeps = function (pending) {
-    if (this.state !== 'new') {
-      return;
-    }
-
-    this.state = 'pending';
-
-    var deps = this.deps;
-
-    for (var i = 0; i < deps.length; i++) {
-      var dep = deps[i];
-      var entry = this.reified[i] = { exports: undefined, module: undefined };
-      if (dep === 'exports') {
-        this.hasExportsAsDep = true;
-        entry.exports = this.module.exports;
-      } else if (dep === 'require') {
-        entry.exports = this.makeRequire();
-      } else if (dep === 'module') {
-        entry.exports = this.module;
-      } else {
-        entry.module = findModule(resolve(dep, this.name), this.name, pending);
-      }
-    }
-  };
-
-  Module.prototype.makeRequire = function () {
-    var name = this.name;
-    var r = function (dep) {
-      return require(resolve(dep, name));
-    };
-    r['default'] = r;
-    r.has = function (dep) {
-      return has(resolve(dep, name));
-    };
-    return r;
-  };
-
-  define = function (name, deps, callback) {
-    var module = registry[name];
-
-    // If a module for this name has already been defined and is in any state
-    // other than `new` (meaning it has been or is currently being required),
-    // then we return early to avoid redefinition.
-    if (module && module.state !== 'new') {
-      return;
-    }
-
-    if (arguments.length < 2) {
-      unsupportedModule(arguments.length);
-    }
-
-    if (!_isArray(deps)) {
-      callback = deps;
-      deps = [];
-    }
-
-    if (callback instanceof Alias) {
-      registry[name] = new Module(callback.name, deps, callback, true);
-    } else {
-      registry[name] = new Module(name, deps, callback, false);
-    }
-  };
-
-  // we don't support all of AMD
-  // define.amd = {};
-
-  function Alias(path) {
-    this.name = path;
-  }
-
-  define.alias = function (path, target) {
-    if (arguments.length === 2) {
-      return define(target, new Alias(path));
-    }
-
-    return new Alias(path);
-  };
-
-  function missingModule(name, referrer) {
-    throw new Error('Could not find module `' + name + '` imported from `' + referrer + '`');
-  }
-
-  function findModule(name, referrer, pending) {
-    var mod = registry[name] || registry[name + '/index'];
-
-    while (mod && mod.isAlias) {
-      mod = registry[mod.name];
-    }
-
-    if (!mod) {
-      missingModule(name, referrer);
-    }
-
-    if (pending && mod.state !== 'pending' && mod.state !== 'finalized') {
-      mod.findDeps(pending);
-      pending.push(mod);
-    }
-    return mod;
-  }
-
-  function resolve(child, name) {
-    if (child.charAt(0) !== '.') {
-      return child;
-    }
-
-    var parts = child.split('/');
-    var nameParts = name.split('/');
-    var parentBase = nameParts.slice(0, -1);
-
-    for (var i = 0, l = parts.length; i < l; i++) {
-      var part = parts[i];
-
-      if (part === '..') {
-        if (parentBase.length === 0) {
-          throw new Error('Cannot access parent module of root');
-        }
-        parentBase.pop();
-      } else if (part === '.') {
-        continue;
-      } else {
-        parentBase.push(part);
-      }
-    }
-
-    return parentBase.join('/');
-  }
-
-  function has(name) {
-    return !!(registry[name] || registry[name + '/index']);
-  }
-
-  requirejs.entries = requirejs._eak_seen = registry;
-  requirejs.has = has;
-  requirejs.unsee = function (moduleName) {
-    findModule(moduleName, '(unsee)', false).unsee();
-  };
-
-  requirejs.clear = function () {
-    requirejs.entries = requirejs._eak_seen = registry = dict();
-    seen = dict();
-  };
-
-  // This code primes the JS engine for good performance by warming the
-  // JIT compiler for these functions.
-  define('foo', function () {});
-  define('foo/bar', [], function () {});
-  define('foo/asdf', ['module', 'exports', 'require'], function (module, exports, require) {
-    if (require.has('foo/bar')) {
-      require('foo/bar');
-    }
-  });
-  define('foo/baz', [], define.alias('foo'));
-  define('foo/quz', define.alias('foo'));
-  define.alias('foo', 'foo/qux');
-  define('foo/bar', ['foo', './quz', './baz', './asdf', './bar', '../foo'], function () {});
-  define('foo/main', ['foo/bar'], function () {});
-
-  require('foo/main');
-  require.unsee('foo/bar');
-
-  requirejs.clear();
-
-  if (typeof exports === 'object' && typeof module === 'object' && module.exports) {
-    module.exports = { require: require, define: define };
-  }
-})(this);
-;/*!
- * jQuery JavaScript Library v2.2.4
- * http://jquery.com/
- *
- * Includes Sizzle.js
- * http://sizzlejs.com/
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license
- * http://jquery.org/license
- *
- * Date: 2016-05-20T17:23Z
- */
-
-(function( global, factory ) {
-
-    if ( typeof module === "object" && typeof module.exports === "object" ) {
-        // For CommonJS and CommonJS-like environments where a proper `window`
-        // is present, execute the factory and get jQuery.
-        // For environments that do not have a `window` with a `document`
-        // (such as Node.js), expose a factory as module.exports.
-        // This accentuates the need for the creation of a real `window`.
-        // e.g. var jQuery = require("jquery")(window);
-        // See ticket #14549 for more info.
-        module.exports = global.document ?
-            factory( global, true ) :
-            function( w ) {
-                if ( !w.document ) {
-                    throw new Error( "jQuery requires a window with a document" );
-                }
-                return factory( w );
-            };
-    } else {
-        factory( global );
-    }
-
-// Pass this if window is not defined yet
-}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
-
-// Support: Firefox 18+
-// Can't be in strict mode, several libs including ASP.NET trace
-// the stack via arguments.caller.callee and Firefox dies if
-// you try to trace through "use strict" call chains. (#13335)
-//"use strict";
-var arr = [];
-
-var document = window.document;
-
-var slice = arr.slice;
-
-var concat = arr.concat;
-
-var push = arr.push;
-
-var indexOf = arr.indexOf;
-
-var class2type = {};
-
-var toString = class2type.toString;
-
-var hasOwn = class2type.hasOwnProperty;
-
-var support = {};
-
-
-
-var
-    version = "2.2.4",
-
-    // Define a local copy of jQuery
-    jQuery = function( selector, context ) {
-
-        // The jQuery object is actually just the init constructor 'enhanced'
-        // Need init if jQuery is called (just allow error to be thrown if not included)
-        return new jQuery.fn.init( selector, context );
-    },
-
-    // Support: Android<4.1
-    // Make sure we trim BOM and NBSP
-    rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
-
-    // Matches dashed string for camelizing
-    rmsPrefix = /^-ms-/,
-    rdashAlpha = /-([\da-z])/gi,
-
-    // Used by jQuery.camelCase as callback to replace()
-    fcamelCase = function( all, letter ) {
-        return letter.toUpperCase();
-    };
-
-jQuery.fn = jQuery.prototype = {
-
-    // The current version of jQuery being used
-    jquery: version,
-
-    constructor: jQuery,
-
-    // Start with an empty selector
-    selector: "",
-
-    // The default length of a jQuery object is 0
-    length: 0,
-
-    toArray: function() {
-        return slice.call( this );
-    },
-
-    // Get the Nth element in the matched element set OR
-    // Get the whole matched element set as a clean array
-    get: function( num ) {
-        return num != null ?
-
-            // Return just the one element from the set
-            ( num < 0 ? this[ num + this.length ] : this[ num ] ) :
-
-            // Return all the elements in a clean array
-            slice.call( this );
-    },
-
-    // Take an array of elements and push it onto the stack
-    // (returning the new matched element set)
-    pushStack: function( elems ) {
-
-        // Build a new jQuery matched element set
-        var ret = jQuery.merge( this.constructor(), elems );
-
-        // Add the old object onto the stack (as a reference)
-        ret.prevObject = this;
-        ret.context = this.context;
-
-        // Return the newly-formed element set
-        return ret;
-    },
-
-    // Execute a callback for every element in the matched set.
-    each: function( callback ) {
-        return jQuery.each( this, callback );
-    },
-
-    map: function( callback ) {
-        return this.pushStack( jQuery.map( this, function( elem, i ) {
-            return callback.call( elem, i, elem );
-        } ) );
-    },
-
-    slice: function() {
-        return this.pushStack( slice.apply( this, arguments ) );
-    },
-
-    first: function() {
-        return this.eq( 0 );
-    },
-
-    last: function() {
-        return this.eq( -1 );
-    },
-
-    eq: function( i ) {
-        var len = this.length,
-            j = +i + ( i < 0 ? len : 0 );
-        return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
-    },
-
-    end: function() {
-        return this.prevObject || this.constructor();
-    },
-
-    // For internal use only.
-    // Behaves like an Array's method, not like a jQuery method.
-    push: push,
-    sort: arr.sort,
-    splice: arr.splice
-};
-
-jQuery.extend = jQuery.fn.extend = function() {
-    var options, name, src, copy, copyIsArray, clone,
-        target = arguments[ 0 ] || {},
-        i = 1,
-        length = arguments.length,
-        deep = false;
-
-    // Handle a deep copy situation
-    if ( typeof target === "boolean" ) {
-        deep = target;
-
-        // Skip the boolean and the target
-        target = arguments[ i ] || {};
-        i++;
-    }
-
-    // Handle case when target is a string or something (possible in deep copy)
-    if ( typeof target !== "object" && !jQuery.isFunction( target ) ) {
-        target = {};
-    }
-
-    // Extend jQuery itself if only one argument is passed
-    if ( i === length ) {
-        target = this;
-        i--;
-    }
-
-    for ( ; i < length; i++ ) {
-
-        // Only deal with non-null/undefined values
-        if ( ( options = arguments[ i ] ) != null ) {
-
-            // Extend the base object
-            for ( name in options ) {
-                src = target[ name ];
-                copy = options[ name ];
-
-                // Prevent never-ending loop
-                if ( target === copy ) {
-                    continue;
-                }
-
-                // Recurse if we're merging plain objects or arrays
-                if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
-                    ( copyIsArray = jQuery.isArray( copy ) ) ) ) {
-
-                    if ( copyIsArray ) {
-                        copyIsArray = false;
-                        clone = src && jQuery.isArray( src ) ? src : [];
-
-                    } else {
-                        clone = src && jQuery.isPlainObject( src ) ? src : {};
-                    }
-
-                    // Never move original objects, clone them
-                    target[ name ] = jQuery.extend( deep, clone, copy );
-
-                // Don't bring in undefined values
-                } else if ( copy !== undefined ) {
-                    target[ name ] = copy;
-                }
-            }
-        }
-    }
-
-    // Return the modified object
-    return target;
-};
-
-jQuery.extend( {
-
-    // Unique for each copy of jQuery on the page
-    expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
-
-    // Assume jQuery is ready without the ready module
-    isReady: true,
-
-    error: function( msg ) {
-        throw new Error( msg );
-    },
-
-    noop: function() {},
-
-    isFunction: function( obj ) {
-        return jQuery.type( obj ) === "function";
-    },
-
-    isArray: Array.isArray,
-
-    isWindow: function( obj ) {
-        return obj != null && obj === obj.window;
-    },
-
-    isNumeric: function( obj ) {
-
-        // parseFloat NaNs numeric-cast false positives (null|true|false|"")
-        // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
-        // subtraction forces infinities to NaN
-        // adding 1 corrects loss of precision from parseFloat (#15100)
-        var realStringObj = obj && obj.toString();
-        return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0;
-    },
-
-    isPlainObject: function( obj ) {
-        var key;
-
-        // Not plain objects:
-        // - Any object or value whose internal [[Class]] property is not "[object Object]"
-        // - DOM nodes
-        // - window
-        if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
-            return false;
-        }
-
-        // Not own constructor property must be Object
-        if ( obj.constructor &&
-                !hasOwn.call( obj, "constructor" ) &&
-                !hasOwn.call( obj.constructor.prototype || {}, "isPrototypeOf" ) ) {
-            return false;
-        }
-
-        // Own properties are enumerated firstly, so to speed up,
-        // if last one is own, then all properties are own
-        for ( key in obj ) {}
-
-        return key === undefined || hasOwn.call( obj, key );
-    },
-
-    isEmptyObject: function( obj ) {
-        var name;
-        for ( name in obj ) {
-            return false;
-        }
-        return true;
-    },
-
-    type: function( obj ) {
-        if ( obj == null ) {
-            return obj + "";
-        }
-
-        // Support: Android<4.0, iOS<6 (functionish RegExp)
-        return typeof obj === "object" || typeof obj === "function" ?
-            class2type[ toString.call( obj ) ] || "object" :
-            typeof obj;
-    },
-
-    // Evaluates a script in a global context
-    globalEval: function( code ) {
-        var script,
-            indirect = eval;
-
-        code = jQuery.trim( code );
-
-        if ( code ) {
-
-            // If the code includes a valid, prologue position
-            // strict mode pragma, execute code by injecting a
-            // script tag into the document.
-            if ( code.indexOf( "use strict" ) === 1 ) {
-                script = document.createElement( "script" );
-                script.text = code;
-                document.head.appendChild( script ).parentNode.removeChild( script );
-            } else {
-
-                // Otherwise, avoid the DOM node creation, insertion
-                // and removal by using an indirect global eval
-
-                indirect( code );
-            }
-        }
-    },
-
-    // Convert dashed to camelCase; used by the css and data modules
-    // Support: IE9-11+
-    // Microsoft forgot to hump their vendor prefix (#9572)
-    camelCase: function( string ) {
-        return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
-    },
-
-    nodeName: function( elem, name ) {
-        return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
-    },
-
-    each: function( obj, callback ) {
-        var length, i = 0;
-
-        if ( isArrayLike( obj ) ) {
-            length = obj.length;
-            for ( ; i < length; i++ ) {
-                if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
-                    break;
-                }
-            }
-        } else {
-            for ( i in obj ) {
-                if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
-                    break;
-                }
-            }
-        }
-
-        return obj;
-    },
-
-    // Support: Android<4.1
-    trim: function( text ) {
-        return text == null ?
-            "" :
-            ( text + "" ).replace( rtrim, "" );
-    },
-
-    // results is for internal usage only
-    makeArray: function( arr, results ) {
-        var ret = results || [];
-
-        if ( arr != null ) {
-            if ( isArrayLike( Object( arr ) ) ) {
-                jQuery.merge( ret,
-                    typeof arr === "string" ?
-                    [ arr ] : arr
-                );
-            } else {
-                push.call( ret, arr );
-            }
-        }
-
-        return ret;
-    },
-
-    inArray: function( elem, arr, i ) {
-        return arr == null ? -1 : indexOf.call( arr, elem, i );
-    },
-
-    merge: function( first, second ) {
-        var len = +second.length,
-            j = 0,
-            i = first.length;
-
-        for ( ; j < len; j++ ) {
-            first[ i++ ] = second[ j ];
-        }
-
-        first.length = i;
-
-        return first;
-    },
-
-    grep: function( elems, callback, invert ) {
-        var callbackInverse,
-            matches = [],
-            i = 0,
-            length = elems.length,
-            callbackExpect = !invert;
-
-        // Go through the array, only saving the items
-        // that pass the validator function
-        for ( ; i < length; i++ ) {
-            callbackInverse = !callback( elems[ i ], i );
-            if ( callbackInverse !== callbackExpect ) {
-                matches.push( elems[ i ] );
-            }
-        }
-
-        return matches;
-    },
-
-    // arg is for internal usage only
-    map: function( elems, callback, arg ) {
-        var length, value,
-            i = 0,
-            ret = [];
-
-        // Go through the array, translating each of the items to their new values
-        if ( isArrayLike( elems ) ) {
-            length = elems.length;
-            for ( ; i < length; i++ ) {
-                value = callback( elems[ i ], i, arg );
-
-                if ( value != null ) {
-                    ret.push( value );
-                }
-            }
-
-        // Go through every key on the object,
-        } else {
-            for ( i in elems ) {
-                value = callback( elems[ i ], i, arg );
-
-                if ( value != null ) {
-                    ret.push( value );
-                }
-            }
-        }
-
-        // Flatten any nested arrays
-        return concat.apply( [], ret );
-    },
-
-    // A global GUID counter for objects
-    guid: 1,
-
-    // Bind a function to a context, optionally partially applying any
-    // arguments.
-    proxy: function( fn, context ) {
-        var tmp, args, proxy;
-
-        if ( typeof context === "string" ) {
-            tmp = fn[ context ];
-            context = fn;
-            fn = tmp;
-        }
-
-        // Quick check to determine if target is callable, in the spec
-        // this throws a TypeError, but we will just return undefined.
-        if ( !jQuery.isFunction( fn ) ) {
-            return undefined;
-        }
-
-        // Simulated bind
-        args = slice.call( arguments, 2 );
-        proxy = function() {
-            return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
-        };
-
-        // Set the guid of unique handler to the same of original handler, so it can be removed
-        proxy.guid = fn.guid = fn.guid || jQuery.guid++;
-
-        return proxy;
-    },
-
-    now: Date.now,
-
-    // jQuery.support is not used in Core but other projects attach their
-    // properties to it so it needs to exist.
-    support: support
-} );
-
-// JSHint would error on this code due to the Symbol not being defined in ES5.
-// Defining this global in .jshintrc would create a danger of using the global
-// unguarded in another place, it seems safer to just disable JSHint for these
-// three lines.
-/* jshint ignore: start */
-if ( typeof Symbol === "function" ) {
-    jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
-}
-/* jshint ignore: end */
-
-// Populate the class2type map
-jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
-function( i, name ) {
-    class2type[ "[object " + name + "]" ] = name.toLowerCase();
-} );
-
-function isArrayLike( obj ) {
-
-    // Support: iOS 8.2 (not reproducible in simulator)
-    // `in` check used to prevent JIT error (gh-2145)
-    // hasOwn isn't used here due to false negatives
-    // regarding Nodelist length in IE
-    var length = !!obj && "length" in obj && obj.length,
-        type = jQuery.type( obj );
-
-    if ( type === "function" || jQuery.isWindow( obj ) ) {
-        return false;
-    }
-
-    return type === "array" || length === 0 ||
-        typeof length === "number" && length > 0 && ( length - 1 ) in obj;
-}
-var Sizzle =
-/*!
- * Sizzle CSS Selector Engine v2.2.1
- * http://sizzlejs.com/
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license
- * http://jquery.org/license
- *
- * Date: 2015-10-17
- */
-(function( window ) {
-
-var i,
-    support,
-    Expr,
-    getText,
-    isXML,
-    tokenize,
-    compile,
-    select,
-    outermostContext,
-    sortInput,
-    hasDuplicate,
-
-    // Local document vars
-    setDocument,
-    document,
-    docElem,
-    documentIsHTML,
-    rbuggyQSA,
-    rbuggyMatches,
-    matches,
-    contains,
-
-    // Instance-specific data
-    expando = "sizzle" + 1 * new Date(),
-    preferredDoc = window.document,
-    dirruns = 0,
-    done = 0,
-    classCache = createCache(),
-    tokenCache = createCache(),
-    compilerCache = createCache(),
-    sortOrder = function( a, b ) {
-        if ( a === b ) {
-            hasDuplicate = true;
-        }
-        return 0;
-    },
-
-    // General-purpose constants
-    MAX_NEGATIVE = 1 << 31,
-
-    // Instance methods
-    hasOwn = ({}).hasOwnProperty,
-    arr = [],
-    pop = arr.pop,
-    push_native = arr.push,
-    push = arr.push,
-    slice = arr.slice,
-    // Use a stripped-down indexOf as it's faster than native
-    // http://jsperf.com/thor-indexof-vs-for/5
-    indexOf = function( list, elem ) {
-        var i = 0,
-            len = list.length;
-        for ( ; i < len; i++ ) {
-            if ( list[i] === elem ) {
-                return i;
-            }
-        }
-        return -1;
-    },
-
-    booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
-
-    // Regular expressions
-
-    // http://www.w3.org/TR/css3-selectors/#whitespace
-    whitespace = "[\\x20\\t\\r\\n\\f]",
-
-    // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
-    identifier = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
-
-    // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
-    attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
-        // Operator (capture 2)
-        "*([*^$|!~]?=)" + whitespace +
-        // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
-        "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
-        "*\\]",
-
-    pseudos = ":(" + identifier + ")(?:\\((" +
-        // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
-        // 1. quoted (capture 3; capture 4 or capture 5)
-        "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
-        // 2. simple (capture 6)
-        "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
-        // 3. anything else (capture 2)
-        ".*" +
-        ")\\)|)",
-
-    // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
-    rwhitespace = new RegExp( whitespace + "+", "g" ),
-    rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
-
-    rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
-    rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
-
-    rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
-
-    rpseudo = new RegExp( pseudos ),
-    ridentifier = new RegExp( "^" + identifier + "$" ),
-
-    matchExpr = {
-        "ID": new RegExp( "^#(" + identifier + ")" ),
-        "CLASS": new RegExp( "^\\.(" + identifier + ")" ),
-        "TAG": new RegExp( "^(" + identifier + "|[*])" ),
-        "ATTR": new RegExp( "^" + attributes ),
-        "PSEUDO": new RegExp( "^" + pseudos ),
-        "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
-            "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
-            "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
-        "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
-        // For use in libraries implementing .is()
-        // We use this for POS matching in `select`
-        "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
-            whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
-    },
-
-    rinputs = /^(?:input|select|textarea|button)$/i,
-    rheader = /^h\d$/i,
-
-    rnative = /^[^{]+\{\s*\[native \w/,
-
-    // Easily-parseable/retrievable ID or TAG or CLASS selectors
-    rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
-
-    rsibling = /[+~]/,
-    rescape = /'|\\/g,
-
-    // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
-    runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
-    funescape = function( _, escaped, escapedWhitespace ) {
-        var high = "0x" + escaped - 0x10000;
-        // NaN means non-codepoint
-        // Support: Firefox<24
-        // Workaround erroneous numeric interpretation of +"0x"
-        return high !== high || escapedWhitespace ?
-            escaped :
-            high < 0 ?
-                // BMP codepoint
-                String.fromCharCode( high + 0x10000 ) :
-                // Supplemental Plane codepoint (surrogate pair)
-                String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
-    },
-
-    // Used for iframes
-    // See setDocument()
-    // Removing the function wrapper causes a "Permission Denied"
-    // error in IE
-    unloadHandler = function() {
-        setDocument();
-    };
-
-// Optimize for push.apply( _, NodeList )
-try {
-    push.apply(
-        (arr = slice.call( preferredDoc.childNodes )),
-        preferredDoc.childNodes
-    );
-    // Support: Android<4.0
-    // Detect silently failing push.apply
-    arr[ preferredDoc.childNodes.length ].nodeType;
-} catch ( e ) {
-    push = { apply: arr.length ?
-
-        // Leverage slice if possible
-        function( target, els ) {
-            push_native.apply( target, slice.call(els) );
-        } :
-
-        // Support: IE<9
-        // Otherwise append directly
-        function( target, els ) {
-            var j = target.length,
-                i = 0;
-            // Can't trust NodeList.length
-            while ( (target[j++] = els[i++]) ) {}
-            target.length = j - 1;
-        }
-    };
-}
-
-function Sizzle( selector, context, results, seed ) {
-    var m, i, elem, nid, nidselect, match, groups, newSelector,
-        newContext = context && context.ownerDocument,
-
-        // nodeType defaults to 9, since context defaults to document
-        nodeType = context ? context.nodeType : 9;
-
-    results = results || [];
-
-    // Return early from calls with invalid selector or context
-    if ( typeof selector !== "string" || !selector ||
-        nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
-
-        return results;
-    }
-
-    // Try to shortcut find operations (as opposed to filters) in HTML documents
-    if ( !seed ) {
-
-        if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
-            setDocument( context );
-        }
-        context = context || document;
-
-        if ( documentIsHTML ) {
-
-            // If the selector is sufficiently simple, try using a "get*By*" DOM method
-            // (excepting DocumentFragment context, where the methods don't exist)
-            if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
-
-                // ID selector
-                if ( (m = match[1]) ) {
-
-                    // Document context
-                    if ( nodeType === 9 ) {
-                        if ( (elem = context.getElementById( m )) ) {
-
-                            // Support: IE, Opera, Webkit
-                            // TODO: identify versions
-                            // getElementById can match elements by name instead of ID
-                            if ( elem.id === m ) {
-                                results.push( elem );
-                                return results;
-                            }
-                        } else {
-                            return results;
-                        }
-
-                    // Element context
-                    } else {
-
-                        // Support: IE, Opera, Webkit
-                        // TODO: identify versions
-                        // getElementById can match elements by name instead of ID
-                        if ( newContext && (elem = newContext.getElementById( m )) &&
-                            contains( context, elem ) &&
-                            elem.id === m ) {
-
-                            results.push( elem );
-                            return results;
-                        }
-                    }
-
-                // Type selector
-                } else if ( match[2] ) {
-                    push.apply( results, context.getElementsByTagName( selector ) );
-                    return results;
-
-                // Class selector
-                } else if ( (m = match[3]) && support.getElementsByClassName &&
-                    context.getElementsByClassName ) {
-
-                    push.apply( results, context.getElementsByClassName( m ) );
-                    return results;
-                }
-            }
-
-            // Take advantage of querySelectorAll
-            if ( support.qsa &&
-                !compilerCache[ selector + " " ] &&
-                (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
-
-                if ( nodeType !== 1 ) {
-                    newContext = context;
-                    newSelector = selector;
-
-                // qSA looks outside Element context, which is not what we want
-                // Thanks to Andrew Dupont for this workaround technique
-                // Support: IE <=8
-                // Exclude object elements
-                } else if ( context.nodeName.toLowerCase() !== "object" ) {
-
-                    // Capture the context ID, setting it first if necessary
-                    if ( (nid = context.getAttribute( "id" )) ) {
-                        nid = nid.replace( rescape, "\\$&" );
-                    } else {
-                        context.setAttribute( "id", (nid = expando) );
-                    }
-
-                    // Prefix every selector in the list
-                    groups = tokenize( selector );
-                    i = groups.length;
-                    nidselect = ridentifier.test( nid ) ? "#" + nid : "[id='" + nid + "']";
-                    while ( i-- ) {
-                        groups[i] = nidselect + " " + toSelector( groups[i] );
-                    }
-                    newSelector = groups.join( "," );
-
-                    // Expand context for sibling selectors
-                    newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
-                        context;
-                }
-
-                if ( newSelector ) {
-                    try {
-                        push.apply( results,
-                            newContext.querySelectorAll( newSelector )
-                        );
-                        return results;
-                    } catch ( qsaError ) {
-                    } finally {
-                        if ( nid === expando ) {
-                            context.removeAttribute( "id" );
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    // All others
-    return select( selector.replace( rtrim, "$1" ), context, results, seed );
-}
-
-/**
- * Create key-value caches of limited size
- * @returns {function(string, object)} Returns the Object data after storing it on itself with
- *  property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
- *  deleting the oldest entry
- */
-function createCache() {
-    var keys = [];
-
-    function cache( key, value ) {
-        // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
-        if ( keys.push( key + " " ) > Expr.cacheLength ) {
-            // Only keep the most recent entries
-            delete cache[ keys.shift() ];
-        }
-        return (cache[ key + " " ] = value);
-    }
-    return cache;
-}
-
-/**
- * Mark a function for special use by Sizzle
- * @param {Function} fn The function to mark
- */
-function markFunction( fn ) {
-    fn[ expando ] = true;
-    return fn;
-}
-
-/**
- * Support testing using an element
- * @param {Function} fn Passed the created div and expects a boolean result
- */
-function assert( fn ) {
-    var div = document.createElement("div");
-
-    try {
-        return !!fn( div );
-    } catch (e) {
-        return false;
-    } finally {
-        // Remove from its parent by default
-        if ( div.parentNode ) {
-            div.parentNode.removeChild( div );
-        }
-        // release memory in IE
-        div = null;
-    }
-}
-
-/**
- * Adds the same handler for all of the specified attrs
- * @param {String} attrs Pipe-separated list of attributes
- * @param {Function} handler The method that will be applied
- */
-function addHandle( attrs, handler ) {
-    var arr = attrs.split("|"),
-        i = arr.length;
-
-    while ( i-- ) {
-        Expr.attrHandle[ arr[i] ] = handler;
-    }
-}
-
-/**
- * Checks document order of two siblings
- * @param {Element} a
- * @param {Element} b
- * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
- */
-function siblingCheck( a, b ) {
-    var cur = b && a,
-        diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
-            ( ~b.sourceIndex || MAX_NEGATIVE ) -
-            ( ~a.sourceIndex || MAX_NEGATIVE );
-
-    // Use IE sourceIndex if available on both nodes
-    if ( diff ) {
-        return diff;
-    }
-
-    // Check if b follows a
-    if ( cur ) {
-        while ( (cur = cur.nextSibling) ) {
-            if ( cur === b ) {
-                return -1;
-            }
-        }
-    }
-
-    return a ? 1 : -1;
-}
-
-/**
- * Returns a function to use in pseudos for input types
- * @param {String} type
- */
-function createInputPseudo( type ) {
-    return function( elem ) {
-        var name = elem.nodeName.toLowerCase();
-        return name === "input" && elem.type === type;
-    };
-}
-
-/**
- * Returns a function to use in pseudos for buttons
- * @param {String} type
- */
-function createButtonPseudo( type ) {
-    return function( elem ) {
-        var name = elem.nodeName.toLowerCase();
-        return (name === "input" || name === "button") && elem.type === type;
-    };
-}
-
-/**
- * Returns a function to use in pseudos for positionals
- * @param {Function} fn
- */
-function createPositionalPseudo( fn ) {
-    return markFunction(function( argument ) {
-        argument = +argument;
-        return markFunction(function( seed, matches ) {
-            var j,
-                matchIndexes = fn( [], seed.length, argument ),
-                i = matchIndexes.length;
-
-            // Match elements found at the specified indexes
-            while ( i-- ) {
-                if ( seed[ (j = matchIndexes[i]) ] ) {
-                    seed[j] = !(matches[j] = seed[j]);
-                }
-            }
-        });
-    });
-}
-
-/**
- * Checks a node for validity as a Sizzle context
- * @param {Element|Object=} context
- * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
- */
-function testContext( context ) {
-    return context && typeof context.getElementsByTagName !== "undefined" && context;
-}
-
-// Expose support vars for convenience
-support = Sizzle.support = {};
-
-/**
- * Detects XML nodes
- * @param {Element|Object} elem An element or a document
- * @returns {Boolean} True iff elem is a non-HTML XML node
- */
-isXML = Sizzle.isXML = function( elem ) {
-    // documentElement is verified for cases where it doesn't yet exist
-    // (such as loading iframes in IE - #4833)
-    var documentElement = elem && (elem.ownerDocument || elem).documentElement;
-    return documentElement ? documentElement.nodeName !== "HTML" : false;
-};
-
-/**
- * Sets document-related variables once based on the current document
- * @param {Element|Object} [doc] An element or document object to use to set the document
- * @returns {Object} Returns the current document
- */
-setDocument = Sizzle.setDocument = function( node ) {
-    var hasCompare, parent,
-        doc = node ? node.ownerDocument || node : preferredDoc;
-
-    // Return early if doc is invalid or already selected
-    if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
-        return document;
-    }
-
-    // Update global variables
-    document = doc;
-    docElem = document.documentElement;
-    documentIsHTML = !isXML( document );
-
-    // Support: IE 9-11, Edge
-    // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
-    if ( (parent = document.defaultView) && parent.top !== parent ) {
-        // Support: IE 11
-        if ( parent.addEventListener ) {
-            parent.addEventListener( "unload", unloadHandler, false );
-
-        // Support: IE 9 - 10 only
-        } else if ( parent.attachEvent ) {
-            parent.attachEvent( "onunload", unloadHandler );
-        }
-    }
-
-    /* Attributes
-    ---------------------------------------------------------------------- */
-
-    // Support: IE<8
-    // Verify that getAttribute really returns attributes and not properties
-    // (excepting IE8 booleans)
-    support.attributes = assert(function( div ) {
-        div.className = "i";
-        return !div.getAttribute("className");
-    });
-
-    /* getElement(s)By*
-    ---------------------------------------------------------------------- */
-
-    // Check if getElementsByTagName("*") returns only elements
-    support.getElementsByTagName = assert(function( div ) {
-        div.appendChild( document.createComment("") );
-        return !div.getElementsByTagName("*").length;
-    });
-
-    // Support: IE<9
-    support.getElementsByClassName = rnative.test( document.getElementsByClassName );
-
-    // Support: IE<10
-    // Check if getElementById returns elements by name
-    // The broken getElementById methods don't pick up programatically-set names,
-    // so use a roundabout getElementsByName test
-    support.getById = assert(function( div ) {
-        docElem.appendChild( div ).id = expando;
-        return !document.getElementsByName || !document.getElementsByName( expando ).length;
-    });
-
-    // ID find and filter
-    if ( support.getById ) {
-        Expr.find["ID"] = function( id, context ) {
-            if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
-                var m = context.getElementById( id );
-                return m ? [ m ] : [];
-            }
-        };
-        Expr.filter["ID"] = function( id ) {
-            var attrId = id.replace( runescape, funescape );
-            return function( elem ) {
-                return elem.getAttribute("id") === attrId;
-            };
-        };
-    } else {
-        // Support: IE6/7
-        // getElementById is not reliable as a find shortcut
-        delete Expr.find["ID"];
-
-        Expr.filter["ID"] =  function( id ) {
-            var attrId = id.replace( runescape, funescape );
-            return function( elem ) {
-                var node = typeof elem.getAttributeNode !== "undefined" &&
-                    elem.getAttributeNode("id");
-                return node && node.value === attrId;
-            };
-        };
-    }
-
-    // Tag
-    Expr.find["TAG"] = support.getElementsByTagName ?
-        function( tag, context ) {
-            if ( typeof context.getElementsByTagName !== "undefined" ) {
-                return context.getElementsByTagName( tag );
-
-            // DocumentFragment nodes don't have gEBTN
-            } else if ( support.qsa ) {
-                return context.querySelectorAll( tag );
-            }
-        } :
-
-        function( tag, context ) {
-            var elem,
-                tmp = [],
-                i = 0,
-                // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
-                results = context.getElementsByTagName( tag );
-
-            // Filter out possible comments
-            if ( tag === "*" ) {
-                while ( (elem = results[i++]) ) {
-                    if ( elem.nodeType === 1 ) {
-                        tmp.push( elem );
-                    }
-                }
-
-                return tmp;
-            }
-            return results;
-        };
-
-    // Class
-    Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
-        if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
-            return context.getElementsByClassName( className );
-        }
-    };
-
-    /* QSA/matchesSelector
-    ---------------------------------------------------------------------- */
-
-    // QSA and matchesSelector support
-
-    // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
-    rbuggyMatches = [];
-
-    // qSa(:focus) reports false when true (Chrome 21)
-    // We allow this because of a bug in IE8/9 that throws an error
-    // whenever `document.activeElement` is accessed on an iframe
-    // So, we allow :focus to pass through QSA all the time to avoid the IE error
-    // See http://bugs.jquery.com/ticket/13378
-    rbuggyQSA = [];
-
-    if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
-        // Build QSA regex
-        // Regex strategy adopted from Diego Perini
-        assert(function( div ) {
-            // Select is set to empty string on purpose
-            // This is to test IE's treatment of not explicitly
-            // setting a boolean content attribute,
-            // since its presence should be enough
-            // http://bugs.jquery.com/ticket/12359
-            docElem.appendChild( div ).innerHTML = "<a id='" + expando + "'></a>" +
-                "<select id='" + expando + "-\r\\' msallowcapture=''>" +
-                "<option selected=''></option></select>";
-
-            // Support: IE8, Opera 11-12.16
-            // Nothing should be selected when empty strings follow ^= or $= or *=
-            // The test attribute must be unknown in Opera but "safe" for WinRT
-            // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
-            if ( div.querySelectorAll("[msallowcapture^='']").length ) {
-                rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
-            }
-
-            // Support: IE8
-            // Boolean attributes and "value" are not treated correctly
-            if ( !div.querySelectorAll("[selected]").length ) {
-                rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
-            }
-
-            // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
-            if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
-                rbuggyQSA.push("~=");
-            }
-
-            // Webkit/Opera - :checked should return selected option elements
-            // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
-            // IE8 throws error here and will not see later tests
-            if ( !div.querySelectorAll(":checked").length ) {
-                rbuggyQSA.push(":checked");
-            }
-
-            // Support: Safari 8+, iOS 8+
-            // https://bugs.webkit.org/show_bug.cgi?id=136851
-            // In-page `selector#id sibing-combinator selector` fails
-            if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) {
-                rbuggyQSA.push(".#.+[+~]");
-            }
-        });
-
-        assert(function( div ) {
-            // Support: Windows 8 Native Apps
-            // The type and name attributes are restricted during .innerHTML assignment
-            var input = document.createElement("input");
-            input.setAttribute( "type", "hidden" );
-            div.appendChild( input ).setAttribute( "name", "D" );
-
-            // Support: IE8
-            // Enforce case-sensitivity of name attribute
-            if ( div.querySelectorAll("[name=d]").length ) {
-                rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
-            }
-
-            // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
-            // IE8 throws error here and will not see later tests
-            if ( !div.querySelectorAll(":enabled").length ) {
-                rbuggyQSA.push( ":enabled", ":disabled" );
-            }
-
-            // Opera 10-11 does not throw on post-comma invalid pseudos
-            div.querySelectorAll("*,:x");
-            rbuggyQSA.push(",.*:");
-        });
-    }
-
-    if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
-        docElem.webkitMatchesSelector ||
-        docElem.mozMatchesSelector ||
-        docElem.oMatchesSelector ||
-        docElem.msMatchesSelector) )) ) {
-
-        assert(function( div ) {
-            // Check to see if it's possible to do matchesSelector
-            // on a disconnected node (IE 9)
-            support.disconnectedMatch = matches.call( div, "div" );
-
-            // This should fail with an exception
-            // Gecko does not error, returns false instead
-            matches.call( div, "[s!='']:x" );
-            rbuggyMatches.push( "!=", pseudos );
-        });
-    }
-
-    rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
-    rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
-
-    /* Contains
-    ---------------------------------------------------------------------- */
-    hasCompare = rnative.test( docElem.compareDocumentPosition );
-
-    // Element contains another
-    // Purposefully self-exclusive
-    // As in, an element does not contain itself
-    contains = hasCompare || rnative.test( docElem.contains ) ?
-        function( a, b ) {
-            var adown = a.nodeType === 9 ? a.documentElement : a,
-                bup = b && b.parentNode;
-            return a === bup || !!( bup && bup.nodeType === 1 && (
-                adown.contains ?
-                    adown.contains( bup ) :
-                    a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
-            ));
-        } :
-        function( a, b ) {
-            if ( b ) {
-                while ( (b = b.parentNode) ) {
-                    if ( b === a ) {
-                        return true;
-                    }
-                }
-            }
-            return false;
-        };
-
-    /* Sorting
-    ---------------------------------------------------------------------- */
-
-    // Document order sorting
-    sortOrder = hasCompare ?
-    function( a, b ) {
-
-        // Flag for duplicate removal
-        if ( a === b ) {
-            hasDuplicate = true;
-            return 0;
-        }
-
-        // Sort on method existence if only one input has compareDocumentPosition
-        var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
-        if ( compare ) {
-            return compare;
-        }
-
-        // Calculate position if both inputs belong to the same document
-        compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
-            a.compareDocumentPosition( b ) :
-
-            // Otherwise we know they are disconnected
-            1;
-
-        // Disconnected nodes
-        if ( compare & 1 ||
-            (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
-
-            // Choose the first element that is related to our preferred document
-            if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
-                return -1;
-            }
-            if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
-                return 1;
-            }
-
-            // Maintain original order
-            return sortInput ?
-                ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
-                0;
-        }
-
-        return compare & 4 ? -1 : 1;
-    } :
-    function( a, b ) {
-        // Exit early if the nodes are identical
-        if ( a === b ) {
-            hasDuplicate = true;
-            return 0;
-        }
-
-        var cur,
-            i = 0,
-            aup = a.parentNode,
-            bup = b.parentNode,
-            ap = [ a ],
-            bp = [ b ];
-
-        // Parentless nodes are either documents or disconnected
-        if ( !aup || !bup ) {
-            return a === document ? -1 :
-                b === document ? 1 :
-                aup ? -1 :
-                bup ? 1 :
-                sortInput ?
-                ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
-                0;
-
-        // If the nodes are siblings, we can do a quick check
-        } else if ( aup === bup ) {
-            return siblingCheck( a, b );
-        }
-
-        // Otherwise we need full lists of their ancestors for comparison
-        cur = a;
-        while ( (cur = cur.parentNode) ) {
-            ap.unshift( cur );
-        }
-        cur = b;
-        while ( (cur = cur.parentNode) ) {
-            bp.unshift( cur );
-        }
-
-        // Walk down the tree looking for a discrepancy
-        while ( ap[i] === bp[i] ) {
-            i++;
-        }
-
-        return i ?
-            // Do a sibling check if the nodes have a common ancestor
-            siblingCheck( ap[i], bp[i] ) :
-
-            // Otherwise nodes in our document sort first
-            ap[i] === preferredDoc ? -1 :
-            bp[i] === preferredDoc ? 1 :
-            0;
-    };
-
-    return document;
-};
-
-Sizzle.matches = function( expr, elements ) {
-    return Sizzle( expr, null, null, elements );
-};
-
-Sizzle.matchesSelector = function( elem, expr ) {
-    // Set document vars if needed
-    if ( ( elem.ownerDocument || elem ) !== document ) {
-        setDocument( elem );
-    }
-
-    // Make sure that attribute selectors are quoted
-    expr = expr.replace( rattributeQuotes, "='$1']" );
-
-    if ( support.matchesSelector && documentIsHTML &&
-        !compilerCache[ expr + " " ] &&
-        ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
-        ( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {
-
-        try {
-            var ret = matches.call( elem, expr );
-
-            // IE 9's matchesSelector returns false on disconnected nodes
-            if ( ret || support.disconnectedMatch ||
-                    // As well, disconnected nodes are said to be in a document
-                    // fragment in IE 9
-                    elem.document && elem.document.nodeType !== 11 ) {
-                return ret;
-            }
-        } catch (e) {}
-    }
-
-    return Sizzle( expr, document, null, [ elem ] ).length > 0;
-};
-
-Sizzle.contains = function( context, elem ) {
-    // Set document vars if needed
-    if ( ( context.ownerDocument || context ) !== document ) {
-        setDocument( context );
-    }
-    return contains( context, elem );
-};
-
-Sizzle.attr = function( elem, name ) {
-    // Set document vars if needed
-    if ( ( elem.ownerDocument || elem ) !== document ) {
-        setDocument( elem );
-    }
-
-    var fn = Expr.attrHandle[ name.toLowerCase() ],
-        // Don't get fooled by Object.prototype properties (jQuery #13807)
-        val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
-            fn( elem, name, !documentIsHTML ) :
-            undefined;
-
-    return val !== undefined ?
-        val :
-        support.attributes || !documentIsHTML ?
-            elem.getAttribute( name ) :
-            (val = elem.getAttributeNode(name)) && val.specified ?
-                val.value :
-                null;
-};
-
-Sizzle.error = function( msg ) {
-    throw new Error( "Syntax error, unrecognized expression: " + msg );
-};
-
-/**
- * Document sorting and removing duplicates
- * @param {ArrayLike} results
- */
-Sizzle.uniqueSort = function( results ) {
-    var elem,
-        duplicates = [],
-        j = 0,
-        i = 0;
-
-    // Unless we *know* we can detect duplicates, assume their presence
-    hasDuplicate = !support.detectDuplicates;
-    sortInput = !support.sortStable && results.slice( 0 );
-    results.sort( sortOrder );
-
-    if ( hasDuplicate ) {
-        while ( (elem = results[i++]) ) {
-            if ( elem === results[ i ] ) {
-                j = duplicates.push( i );
-            }
-        }
-        while ( j-- ) {
-            results.splice( duplicates[ j ], 1 );
-        }
-    }
-
-    // Clear input after sorting to release objects
-    // See https://github.com/jquery/sizzle/pull/225
-    sortInput = null;
-
-    return results;
-};
-
-/**
- * Utility function for retrieving the text value of an array of DOM nodes
- * @param {Array|Element} elem
- */
-getText = Sizzle.getText = function( elem ) {
-    var node,
-        ret = "",
-        i = 0,
-        nodeType = elem.nodeType;
-
-    if ( !nodeType ) {
-        // If no nodeType, this is expected to be an array
-        while ( (node = elem[i++]) ) {
-            // Do not traverse comment nodes
-            ret += getText( node );
-        }
-    } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
-        // Use textContent for elements
-        // innerText usage removed for consistency of new lines (jQuery #11153)
-        if ( typeof elem.textContent === "string" ) {
-            return elem.textContent;
-        } else {
-            // Traverse its children
-            for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
-                ret += getText( elem );
-            }
-        }
-    } else if ( nodeType === 3 || nodeType === 4 ) {
-        return elem.nodeValue;
-    }
-    // Do not include comment or processing instruction nodes
-
-    return ret;
-};
-
-Expr = Sizzle.selectors = {
-
-    // Can be adjusted by the user
-    cacheLength: 50,
-
-    createPseudo: markFunction,
-
-    match: matchExpr,
-
-    attrHandle: {},
-
-    find: {},
-
-    relative: {
-        ">": { dir: "parentNode", first: true },
-        " ": { dir: "parentNode" },
-        "+": { dir: "previousSibling", first: true },
-        "~": { dir: "previousSibling" }
-    },
-
-    preFilter: {
-        "ATTR": function( match ) {
-            match[1] = match[1].replace( runescape, funescape );
-
-            // Move the given value to match[3] whether quoted or unquoted
-            match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
-
-            if ( match[2] === "~=" ) {
-                match[3] = " " + match[3] + " ";
-            }
-
-            return match.slice( 0, 4 );
-        },
-
-        "CHILD": function( match ) {
-            /* matches from matchExpr["CHILD"]
-                1 type (only|nth|...)
-                2 what (child|of-type)
-                3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
-                4 xn-component of xn+y argument ([+-]?\d*n|)
-                5 sign of xn-component
-                6 x of xn-component
-                7 sign of y-component
-                8 y of y-component
-            */
-            match[1] = match[1].toLowerCase();
-
-            if ( match[1].slice( 0, 3 ) === "nth" ) {
-                // nth-* requires argument
-                if ( !match[3] ) {
-                    Sizzle.error( match[0] );
-                }
-
-                // numeric x and y parameters for Expr.filter.CHILD
-                // remember that false/true cast respectively to 0/1
-                match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
-                match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
-
-            // other types prohibit arguments
-            } else if ( match[3] ) {
-                Sizzle.error( match[0] );
-            }
-
-            return match;
-        },
-
-        "PSEUDO": function( match ) {
-            var excess,
-                unquoted = !match[6] && match[2];
-
-            if ( matchExpr["CHILD"].test( match[0] ) ) {
-                return null;
-            }
-
-            // Accept quoted arguments as-is
-            if ( match[3] ) {
-                match[2] = match[4] || match[5] || "";
-
-            // Strip excess characters from unquoted arguments
-            } else if ( unquoted && rpseudo.test( unquoted ) &&
-                // Get excess from tokenize (recursively)
-                (excess = tokenize( unquoted, true )) &&
-                // advance to the next closing parenthesis
-                (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
-
-                // excess is a negative index
-                match[0] = match[0].slice( 0, excess );
-                match[2] = unquoted.slice( 0, excess );
-            }
-
-            // Return only captures needed by the pseudo filter method (type and argument)
-            return match.slice( 0, 3 );
-        }
-    },
-
-    filter: {
-
-        "TAG": function( nodeNameSelector ) {
-            var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
-            return nodeNameSelector === "*" ?
-                function() { return true; } :
-                function( elem ) {
-                    return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
-                };
-        },
-
-        "CLASS": function( className ) {
-            var pattern = classCache[ className + " " ];
-
-            return pattern ||
-                (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
-                classCache( className, function( elem ) {
-                    return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
-                });
-        },
-
-        "ATTR": function( name, operator, check ) {
-            return function( elem ) {
-                var result = Sizzle.attr( elem, name );
-
-                if ( result == null ) {
-                    return operator === "!=";
-                }
-                if ( !operator ) {
-                    return true;
-                }
-
-                result += "";
-
-                return operator === "=" ? result === check :
-                    operator === "!=" ? result !== check :
-                    operator === "^=" ? check && result.indexOf( check ) === 0 :
-                    operator === "*=" ? check && result.indexOf( check ) > -1 :
-                    operator === "$=" ? check && result.slice( -check.length ) === check :
-                    operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
-                    operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
-                    false;
-            };
-        },
-
-        "CHILD": function( type, what, argument, first, last ) {
-            var simple = type.slice( 0, 3 ) !== "nth",
-                forward = type.slice( -4 ) !== "last",
-                ofType = what === "of-type";
-
-            return first === 1 && last === 0 ?
-
-                // Shortcut for :nth-*(n)
-                function( elem ) {
-                    return !!elem.parentNode;
-                } :
-
-                function( elem, context, xml ) {
-                    var cache, uniqueCache, outerCache, node, nodeIndex, start,
-                        dir = simple !== forward ? "nextSibling" : "previousSibling",
-                        parent = elem.parentNode,
-                        name = ofType && elem.nodeName.toLowerCase(),
-                        useCache = !xml && !ofType,
-                        diff = false;
-
-                    if ( parent ) {
-
-                        // :(first|last|only)-(child|of-type)
-                        if ( simple ) {
-                            while ( dir ) {
-                                node = elem;
-                                while ( (node = node[ dir ]) ) {
-                                    if ( ofType ?
-                                        node.nodeName.toLowerCase() === name :
-                                        node.nodeType === 1 ) {
-
-                                        return false;
-                                    }
-                                }
-                                // Reverse direction for :only-* (if we haven't yet done so)
-                                start = dir = type === "only" && !start && "nextSibling";
-                            }
-                            return true;
-                        }
-
-                        start = [ forward ? parent.firstChild : parent.lastChild ];
-
-                        // non-xml :nth-child(...) stores cache data on `parent`
-                        if ( forward && useCache ) {
-
-                            // Seek `elem` from a previously-cached index
-
-                            // ...in a gzip-friendly way
-                            node = parent;
-                            outerCache = node[ expando ] || (node[ expando ] = {});
-
-                            // Support: IE <9 only
-                            // Defend against cloned attroperties (jQuery gh-1709)
-                            uniqueCache = outerCache[ node.uniqueID ] ||
-                                (outerCache[ node.uniqueID ] = {});
-
-                            cache = uniqueCache[ type ] || [];
-                            nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
-                            diff = nodeIndex && cache[ 2 ];
-                            node = nodeIndex && parent.childNodes[ nodeIndex ];
-
-                            while ( (node = ++nodeIndex && node && node[ dir ] ||
-
-                                // Fallback to seeking `elem` from the start
-                                (diff = nodeIndex = 0) || start.pop()) ) {
-
-                                // When found, cache indexes on `parent` and break
-                                if ( node.nodeType === 1 && ++diff && node === elem ) {
-                                    uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
-                                    break;
-                                }
-                            }
-
-                        } else {
-                            // Use previously-cached element index if available
-                            if ( useCache ) {
-                                // ...in a gzip-friendly way
-                                node = elem;
-                                outerCache = node[ expando ] || (node[ expando ] = {});
-
-                                // Support: IE <9 only
-                                // Defend against cloned attroperties (jQuery gh-1709)
-                                uniqueCache = outerCache[ node.uniqueID ] ||
-                                    (outerCache[ node.uniqueID ] = {});
-
-                                cache = uniqueCache[ type ] || [];
-                                nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
-                                diff = nodeIndex;
-                            }
-
-                            // xml :nth-child(...)
-                            // or :nth-last-child(...) or :nth(-last)?-of-type(...)
-                            if ( diff === false ) {
-                                // Use the same loop as above to seek `elem` from the start
-                                while ( (node = ++nodeIndex && node && node[ dir ] ||
-                                    (diff = nodeIndex = 0) || start.pop()) ) {
-
-                                    if ( ( ofType ?
-                                        node.nodeName.toLowerCase() === name :
-                                        node.nodeType === 1 ) &&
-                                        ++diff ) {
-
-                                        // Cache the index of each encountered element
-                                        if ( useCache ) {
-                                            outerCache = node[ expando ] || (node[ expando ] = {});
-
-                                            // Support: IE <9 only
-                                            // Defend against cloned attroperties (jQuery gh-1709)
-                                            uniqueCache = outerCache[ node.uniqueID ] ||
-                                                (outerCache[ node.uniqueID ] = {});
-
-                                            uniqueCache[ type ] = [ dirruns, diff ];
-                                        }
-
-                                        if ( node === elem ) {
-                                            break;
-                                        }
-                                    }
-                                }
-                            }
-                        }
-
-                        // Incorporate the offset, then check against cycle size
-                        diff -= last;
-                        return diff === first || ( diff % first === 0 && diff / first >= 0 );
-                    }
-                };
-        },
-
-        "PSEUDO": function( pseudo, argument ) {
-            // pseudo-class names are case-insensitive
-            // http://www.w3.org/TR/selectors/#pseudo-classes
-            // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
-            // Remember that setFilters inherits from pseudos
-            var args,
-                fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
-                    Sizzle.error( "unsupported pseudo: " + pseudo );
-
-            // The user may use createPseudo to indicate that
-            // arguments are needed to create the filter function
-            // just as Sizzle does
-            if ( fn[ expando ] ) {
-                return fn( argument );
-            }
-
-            // But maintain support for old signatures
-            if ( fn.length > 1 ) {
-                args = [ pseudo, pseudo, "", argument ];
-                return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
-                    markFunction(function( seed, matches ) {
-                        var idx,
-                            matched = fn( seed, argument ),
-                            i = matched.length;
-                        while ( i-- ) {
-                            idx = indexOf( seed, matched[i] );
-                            seed[ idx ] = !( matches[ idx ] = matched[i] );
-                        }
-                    }) :
-                    function( elem ) {
-                        return fn( elem, 0, args );
-                    };
-            }
-
-            return fn;
-        }
-    },
-
-    pseudos: {
-        // Potentially complex pseudos
-        "not": markFunction(function( selector ) {
-            // Trim the selector passed to compile
-            // to avoid treating leading and trailing
-            // spaces as combinators
-            var input = [],
-                results = [],
-                matcher = compile( selector.replace( rtrim, "$1" ) );
-
-            return matcher[ expando ] ?
-                markFunction(function( seed, matches, context, xml ) {
-                    var elem,
-                        unmatched = matcher( seed, null, xml, [] ),
-                        i = seed.length;
-
-                    // Match elements unmatched by `matcher`
-                    while ( i-- ) {
-                        if ( (elem = unmatched[i]) ) {
-                            seed[i] = !(matches[i] = elem);
-                        }
-                    }
-                }) :
-                function( elem, context, xml ) {
-                    input[0] = elem;
-                    matcher( input, null, xml, results );
-                    // Don't keep the element (issue #299)
-                    input[0] = null;
-                    return !results.pop();
-                };
-        }),
-
-        "has": markFunction(function( selector ) {
-            return function( elem ) {
-                return Sizzle( selector, elem ).length > 0;
-            };
-        }),
-
-        "contains": markFunction(function( text ) {
-            text = text.replace( runescape, funescape );
-            return function( elem ) {
-                return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
-            };
-        }),
-
-        // "Whether an element is represented by a :lang() selector
-        // is based solely on the element's language value
-        // being equal to the identifier C,
-        // or beginning with the identifier C immediately followed by "-".
-        // The matching of C against the element's language value is performed case-insensitively.
-        // The identifier C does not have to be a valid language name."
-        // http://www.w3.org/TR/selectors/#lang-pseudo
-        "lang": markFunction( function( lang ) {
-            // lang value must be a valid identifier
-            if ( !ridentifier.test(lang || "") ) {
-                Sizzle.error( "unsupported lang: " + lang );
-            }
-            lang = lang.replace( runescape, funescape ).toLowerCase();
-            return function( elem ) {
-                var elemLang;
-                do {
-                    if ( (elemLang = documentIsHTML ?
-                        elem.lang :
-                        elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
-
-                        elemLang = elemLang.toLowerCase();
-                        return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
-                    }
-                } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
-                return false;
-            };
-        }),
-
-        // Miscellaneous
-        "target": function( elem ) {
-            var hash = window.location && window.location.hash;
-            return hash && hash.slice( 1 ) === elem.id;
-        },
-
-        "root": function( elem ) {
-            return elem === docElem;
-        },
-
-        "focus": function( elem ) {
-            return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
-        },
-
-        // Boolean properties
-        "enabled": function( elem ) {
-            return elem.disabled === false;
-        },
-
-        "disabled": function( elem ) {
-            return elem.disabled === true;
-        },
-
-        "checked": function( elem ) {
-            // In CSS3, :checked should return both checked and selected elements
-            // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
-            var nodeName = elem.nodeName.toLowerCase();
-            return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
-        },
-
-        "selected": function( elem ) {
-            // Accessing this property makes selected-by-default
-            // options in Safari work properly
-            if ( elem.parentNode ) {
-                elem.parentNode.selectedIndex;
-            }
-
-            return elem.selected === true;
-        },
-
-        // Contents
-        "empty": function( elem ) {
-            // http://www.w3.org/TR/selectors/#empty-pseudo
-            // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
-            //   but not by others (comment: 8; processing instruction: 7; etc.)
-            // nodeType < 6 works because attributes (2) do not appear as children
-            for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
-                if ( elem.nodeType < 6 ) {
-                    return false;
-                }
-            }
-            return true;
-        },
-
-        "parent": function( elem ) {
-            return !Expr.pseudos["empty"]( elem );
-        },
-
-        // Element/input types
-        "header": function( elem ) {
-            return rheader.test( elem.nodeName );
-        },
-
-        "input": function( elem ) {
-            return rinputs.test( elem.nodeName );
-        },
-
-        "button": function( elem ) {
-            var name = elem.nodeName.toLowerCase();
-            return name === "input" && elem.type === "button" || name === "button";
-        },
-
-        "text": function( elem ) {
-            var attr;
-            return elem.nodeName.toLowerCase() === "input" &&
-                elem.type === "text" &&
-
-                // Support: IE<8
-                // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
-                ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
-        },
-
-        // Position-in-collection
-        "first": createPositionalPseudo(function() {
-            return [ 0 ];
-        }),
-
-        "last": createPositionalPseudo(function( matchIndexes, length ) {
-            return [ length - 1 ];
-        }),
-
-        "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
-            return [ argument < 0 ? argument + length : argument ];
-        }),
-
-        "even": createPositionalPseudo(function( matchIndexes, length ) {
-            var i = 0;
-            for ( ; i < length; i += 2 ) {
-                matchIndexes.push( i );
-            }
-            return matchIndexes;
-        }),
-
-        "odd": createPositionalPseudo(function( matchIndexes, length ) {
-            var i = 1;
-            for ( ; i < length; i += 2 ) {
-                matchIndexes.push( i );
-            }
-            return matchIndexes;
-        }),
-
-        "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
-            var i = argument < 0 ? argument + length : argument;
-            for ( ; --i >= 0; ) {
-                matchIndexes.push( i );
-            }
-            return matchIndexes;
-        }),
-
-        "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
-            var i = argument < 0 ? argument + length : argument;
-            for ( ; ++i < length; ) {
-                matchIndexes.push( i );
-            }
-            return matchIndexes;
-        })
-    }
-};
-
-Expr.pseudos["nth"] = Expr.pseudos["eq"];
-
-// Add button/input type pseudos
-for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
-    Expr.pseudos[ i ] = createInputPseudo( i );
-}
-for ( i in { submit: true, reset: true } ) {
-    Expr.pseudos[ i ] = createButtonPseudo( i );
-}
-
-// Easy API for creating new setFilters
-function setFilters() {}
-setFilters.prototype = Expr.filters = Expr.pseudos;
-Expr.setFilters = new setFilters();
-
-tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
-    var matched, match, tokens, type,
-        soFar, groups, preFilters,
-        cached = tokenCache[ selector + " " ];
-
-    if ( cached ) {
-        return parseOnly ? 0 : cached.slice( 0 );
-    }
-
-    soFar = selector;
-    groups = [];
-    preFilters = Expr.preFilter;
-
-    while ( soFar ) {
-
-        // Comma and first run
-        if ( !matched || (match = rcomma.exec( soFar )) ) {
-            if ( match ) {
-                // Don't consume trailing commas as valid
-                soFar = soFar.slice( match[0].length ) || soFar;
-            }
-            groups.push( (tokens = []) );
-        }
-
-        matched = false;
-
-        // Combinators
-        if ( (match = rcombinators.exec( soFar )) ) {
-            matched = match.shift();
-            tokens.push({
-                value: matched,
-                // Cast descendant combinators to space
-                type: match[0].replace( rtrim, " " )
-            });
-            soFar = soFar.slice( matched.length );
-        }
-
-        // Filters
-        for ( type in Expr.filter ) {
-            if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
-                (match = preFilters[ type ]( match ))) ) {
-                matched = match.shift();
-                tokens.push({
-                    value: matched,
-                    type: type,
-                    matches: match
-                });
-                soFar = soFar.slice( matched.length );
-            }
-        }
-
-        if ( !matched ) {
-            break;
-        }
-    }
-
-    // Return the length of the invalid excess
-    // if we're just parsing
-    // Otherwise, throw an error or return tokens
-    return parseOnly ?
-        soFar.length :
-        soFar ?
-            Sizzle.error( selector ) :
-            // Cache the tokens
-            tokenCache( selector, groups ).slice( 0 );
-};
-
-function toSelector( tokens ) {
-    var i = 0,
-        len = tokens.length,
-        selector = "";
-    for ( ; i < len; i++ ) {
-        selector += tokens[i].value;
-    }
-    return selector;
-}
-
-function addCombinator( matcher, combinator, base ) {
-    var dir = combinator.dir,
-        checkNonElements = base && dir === "parentNode",
-        doneName = done++;
-
-    return combinator.first ?
-        // Check against closest ancestor/preceding element
-        function( elem, context, xml ) {
-            while ( (elem = elem[ dir ]) ) {
-                if ( elem.nodeType === 1 || checkNonElements ) {
-                    return matcher( elem, context, xml );
-                }
-            }
-        } :
-
-        // Check against all ancestor/preceding elements
-        function( elem, context, xml ) {
-            var oldCache, uniqueCache, outerCache,
-                newCache = [ dirruns, doneName ];
-
-            // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
-            if ( xml ) {
-                while ( (elem = elem[ dir ]) ) {
-                    if ( elem.nodeType === 1 || checkNonElements ) {
-                        if ( matcher( elem, context, xml ) ) {
-                            return true;
-                        }
-                    }
-                }
-            } else {
-                while ( (elem = elem[ dir ]) ) {
-                    if ( elem.nodeType === 1 || checkNonElements ) {
-                        outerCache = elem[ expando ] || (elem[ expando ] = {});
-
-                        // Support: IE <9 only
-                        // Defend against cloned attroperties (jQuery gh-1709)
-                        uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
-
-                        if ( (oldCache = uniqueCache[ dir ]) &&
-                            oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
-
-                            // Assign to newCache so results back-propagate to previous elements
-                            return (newCache[ 2 ] = oldCache[ 2 ]);
-                        } else {
-                            // Reuse newcache so results back-propagate to previous elements
-                            uniqueCache[ dir ] = newCache;
-
-                            // A match means we're done; a fail means we have to keep checking
-                            if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
-                                return true;
-                            }
-                        }
-                    }
-                }
-            }
-        };
-}
-
-function elementMatcher( matchers ) {
-    return matchers.length > 1 ?
-        function( elem, context, xml ) {
-            var i = matchers.length;
-            while ( i-- ) {
-                if ( !matchers[i]( elem, context, xml ) ) {
-                    return false;
-                }
-            }
-            return true;
-        } :
-        matchers[0];
-}
-
-function multipleContexts( selector, contexts, results ) {
-    var i = 0,
-        len = contexts.length;
-    for ( ; i < len; i++ ) {
-        Sizzle( selector, contexts[i], results );
-    }
-    return results;
-}
-
-function condense( unmatched, map, filter, context, xml ) {
-    var elem,
-        newUnmatched = [],
-        i = 0,
-        len = unmatched.length,
-        mapped = map != null;
-
-    for ( ; i < len; i++ ) {
-        if ( (elem = unmatched[i]) ) {
-            if ( !filter || filter( elem, context, xml ) ) {
-                newUnmatched.push( elem );
-                if ( mapped ) {
-                    map.push( i );
-                }
-            }
-        }
-    }
-
-    return newUnmatched;
-}
-
-function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
-    if ( postFilter && !postFilter[ expando ] ) {
-        postFilter = setMatcher( postFilter );
-    }
-    if ( postFinder && !postFinder[ expando ] ) {
-        postFinder = setMatcher( postFinder, postSelector );
-    }
-    return markFunction(function( seed, results, context, xml ) {
-        var temp, i, elem,
-            preMap = [],
-            postMap = [],
-            preexisting = results.length,
-
-            // Get initial elements from seed or context
-            elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
-
-            // Prefilter to get matcher input, preserving a map for seed-results synchronization
-            matcherIn = preFilter && ( seed || !selector ) ?
-                condense( elems, preMap, preFilter, context, xml ) :
-                elems,
-
-            matcherOut = matcher ?
-                // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
-                postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
-
-                    // ...intermediate processing is necessary
-                    [] :
-
-                    // ...otherwise use results directly
-                    results :
-                matcherIn;
-
-        // Find primary matches
-        if ( matcher ) {
-            matcher( matcherIn, matcherOut, context, xml );
-        }
-
-        // Apply postFilter
-        if ( postFilter ) {
-            temp = condense( matcherOut, postMap );
-            postFilter( temp, [], context, xml );
-
-            // Un-match failing elements by moving them back to matcherIn
-            i = temp.length;
-            while ( i-- ) {
-                if ( (elem = temp[i]) ) {
-                    matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
-                }
-            }
-        }
-
-        if ( seed ) {
-            if ( postFinder || preFilter ) {
-                if ( postFinder ) {
-                    // Get the final matcherOut by condensing this intermediate into postFinder contexts
-                    temp = [];
-                    i = matcherOut.length;
-                    while ( i-- ) {
-                        if ( (elem = matcherOut[i]) ) {
-                            // Restore matcherIn since elem is not yet a final match
-                            temp.push( (matcherIn[i] = elem) );
-                        }
-                    }
-                    postFinder( null, (matcherOut = []), temp, xml );
-                }
-
-                // Move matched elements from seed to results to keep them synchronized
-                i = matcherOut.length;
-                while ( i-- ) {
-                    if ( (elem = matcherOut[i]) &&
-                        (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
-
-                        seed[temp] = !(results[temp] = elem);
-                    }
-                }
-            }
-
-        // Add elements to results, through postFinder if defined
-        } else {
-            matcherOut = condense(
-                matcherOut === results ?
-                    matcherOut.splice( preexisting, matcherOut.length ) :
-                    matcherOut
-            );
-            if ( postFinder ) {
-                postFinder( null, results, matcherOut, xml );
-            } else {
-                push.apply( results, matcherOut );
-            }
-        }
-    });
-}
-
-function matcherFromTokens( tokens ) {
-    var checkContext, matcher, j,
-        len = tokens.length,
-        leadingRelative = Expr.relative[ tokens[0].type ],
-        implicitRelative = leadingRelative || Expr.relative[" "],
-        i = leadingRelative ? 1 : 0,
-
-        // The foundational matcher ensures that elements are reachable from top-level context(s)
-        matchContext = addCombinator( function( elem ) {
-            return elem === checkContext;
-        }, implicitRelative, true ),
-        matchAnyContext = addCombinator( function( elem ) {
-            return indexOf( checkContext, elem ) > -1;
-        }, implicitRelative, true ),
-        matchers = [ function( elem, context, xml ) {
-            var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
-                (checkContext = context).nodeType ?
-                    matchContext( elem, context, xml ) :
-                    matchAnyContext( elem, context, xml ) );
-            // Avoid hanging onto element (issue #299)
-            checkContext = null;
-            return ret;
-        } ];
-
-    for ( ; i < len; i++ ) {
-        if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
-            matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
-        } else {
-            matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
-
-            // Return special upon seeing a positional matcher
-            if ( matcher[ expando ] ) {
-                // Find the next relative operator (if any) for proper handling
-                j = ++i;
-                for ( ; j < len; j++ ) {
-                    if ( Expr.relative[ tokens[j].type ] ) {
-                        break;
-                    }
-                }
-                return setMatcher(
-                    i > 1 && elementMatcher( matchers ),
-                    i > 1 && toSelector(
-                        // If the preceding token was a descendant combinator, insert an implicit any-element `*`
-                        tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
-                    ).replace( rtrim, "$1" ),
-                    matcher,
-                    i < j && matcherFromTokens( tokens.slice( i, j ) ),
-                    j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
-                    j < len && toSelector( tokens )
-                );
-            }
-            matchers.push( matcher );
-        }
-    }
-
-    return elementMatcher( matchers );
-}
-
-function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
-    var bySet = setMatchers.length > 0,
-        byElement = elementMatchers.length > 0,
-        superMatcher = function( seed, context, xml, results, outermost ) {
-            var elem, j, matcher,
-                matchedCount = 0,
-                i = "0",
-                unmatched = seed && [],
-                setMatched = [],
-                contextBackup = outermostContext,
-                // We must always have either seed elements or outermost context
-                elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
-                // Use integer dirruns iff this is the outermost matcher
-                dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
-                len = elems.length;
-
-            if ( outermost ) {
-                outermostContext = context === document || context || outermost;
-            }
-
-            // Add elements passing elementMatchers directly to results
-            // Support: IE<9, Safari
-            // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
-            for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
-                if ( byElement && elem ) {
-                    j = 0;
-                    if ( !context && elem.ownerDocument !== document ) {
-                        setDocument( elem );
-                        xml = !documentIsHTML;
-                    }
-                    while ( (matcher = elementMatchers[j++]) ) {
-                        if ( matcher( elem, context || document, xml) ) {
-                            results.push( elem );
-                            break;
-                        }
-                    }
-                    if ( outermost ) {
-                        dirruns = dirrunsUnique;
-                    }
-                }
-
-                // Track unmatched elements for set filters
-                if ( bySet ) {
-                    // They will have gone through all possible matchers
-                    if ( (elem = !matcher && elem) ) {
-                        matchedCount--;
-                    }
-
-                    // Lengthen the array for every element, matched or not
-                    if ( seed ) {
-                        unmatched.push( elem );
-                    }
-                }
-            }
-
-            // `i` is now the count of elements visited above, and adding it to `matchedCount`
-            // makes the latter nonnegative.
-            matchedCount += i;
-
-            // Apply set filters to unmatched elements
-            // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
-            // equals `i`), unless we didn't visit _any_ elements in the above loop because we have
-            // no element matchers and no seed.
-            // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
-            // case, which will result in a "00" `matchedCount` that differs from `i` but is also
-            // numerically zero.
-            if ( bySet && i !== matchedCount ) {
-                j = 0;
-                while ( (matcher = setMatchers[j++]) ) {
-                    matcher( unmatched, setMatched, context, xml );
-                }
-
-                if ( seed ) {
-                    // Reintegrate element matches to eliminate the need for sorting
-                    if ( matchedCount > 0 ) {
-                        while ( i-- ) {
-                            if ( !(unmatched[i] || setMatched[i]) ) {
-                                setMatched[i] = pop.call( results );
-                            }
-                        }
-                    }
-
-                    // Discard index placeholder values to get only actual matches
-                    setMatched = condense( setMatched );
-                }
-
-                // Add matches to results
-                push.apply( results, setMatched );
-
-                // Seedless set matches succeeding multiple successful matchers stipulate sorting
-                if ( outermost && !seed && setMatched.length > 0 &&
-                    ( matchedCount + setMatchers.length ) > 1 ) {
-
-                    Sizzle.uniqueSort( results );
-                }
-            }
-
-            // Override manipulation of globals by nested matchers
-            if ( outermost ) {
-                dirruns = dirrunsUnique;
-                outermostContext = contextBackup;
-            }
-
-            return unmatched;
-        };
-
-    return bySet ?
-        markFunction( superMatcher ) :
-        superMatcher;
-}
-
-compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
-    var i,
-        setMatchers = [],
-        elementMatchers = [],
-        cached = compilerCache[ selector + " " ];
-
-    if ( !cached ) {
-        // Generate a function of recursive functions that can be used to check each element
-        if ( !match ) {
-            match = tokenize( selector );
-        }
-        i = match.length;
-        while ( i-- ) {
-            cached = matcherFromTokens( match[i] );
-            if ( cached[ expando ] ) {
-                setMatchers.push( cached );
-            } else {
-                elementMatchers.push( cached );
-            }
-        }
-
-        // Cache the compiled function
-        cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
-
-        // Save selector and tokenization
-        cached.selector = selector;
-    }
-    return cached;
-};
-
-/**
- * A low-level selection function that works with Sizzle's compiled
- *  selector functions
- * @param {String|Function} selector A selector or a pre-compiled
- *  selector function built with Sizzle.compile
- * @param {Element} context
- * @param {Array} [results]
- * @param {Array} [seed] A set of elements to match against
- */
-select = Sizzle.select = function( selector, context, results, seed ) {
-    var i, tokens, token, type, find,
-        compiled = typeof selector === "function" && selector,
-        match = !seed && tokenize( (selector = compiled.selector || selector) );
-
-    results = results || [];
-
-    // Try to minimize operations if there is only one selector in the list and no seed
-    // (the latter of which guarantees us context)
-    if ( match.length === 1 ) {
-
-        // Reduce context if the leading compound selector is an ID
-        tokens = match[0] = match[0].slice( 0 );
-        if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
-                support.getById && context.nodeType === 9 && documentIsHTML &&
-                Expr.relative[ tokens[1].type ] ) {
-
-            context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
-            if ( !context ) {
-                return results;
-
-            // Precompiled matchers will still verify ancestry, so step up a level
-            } else if ( compiled ) {
-                context = context.parentNode;
-            }
-
-            selector = selector.slice( tokens.shift().value.length );
-        }
-
-        // Fetch a seed set for right-to-left matching
-        i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
-        while ( i-- ) {
-            token = tokens[i];
-
-            // Abort if we hit a combinator
-            if ( Expr.relative[ (type = token.type) ] ) {
-                break;
-            }
-            if ( (find = Expr.find[ type ]) ) {
-                // Search, expanding context for leading sibling combinators
-                if ( (seed = find(
-                    token.matches[0].replace( runescape, funescape ),
-                    rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
-                )) ) {
-
-                    // If seed is empty or no tokens remain, we can return early
-                    tokens.splice( i, 1 );
-                    selector = seed.length && toSelector( tokens );
-                    if ( !selector ) {
-                        push.apply( results, seed );
-                        return results;
-                    }
-
-                    break;
-                }
-            }
-        }
-    }
-
-    // Compile and execute a filtering function if one is not provided
-    // Provide `match` to avoid retokenization if we modified the selector above
-    ( compiled || compile( selector, match ) )(
-        seed,
-        context,
-        !documentIsHTML,
-        results,
-        !context || rsibling.test( selector ) && testContext( context.parentNode ) || context
-    );
-    return results;
-};
-
-// One-time assignments
-
-// Sort stability
-support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
-
-// Support: Chrome 14-35+
-// Always assume duplicates if they aren't passed to the comparison function
-support.detectDuplicates = !!hasDuplicate;
-
-// Initialize against the default document
-setDocument();
-
-// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
-// Detached nodes confoundingly follow *each other*
-support.sortDetached = assert(function( div1 ) {
-    // Should return 1, but returns 4 (following)
-    return div1.compareDocumentPosition( document.createElement("div") ) & 1;
-});
-
-// Support: IE<8
-// Prevent attribute/property "interpolation"
-// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
-if ( !assert(function( div ) {
-    div.innerHTML = "<a href='#'></a>";
-    return div.firstChild.getAttribute("href") === "#" ;
-}) ) {
-    addHandle( "type|href|height|width", function( elem, name, isXML ) {
-        if ( !isXML ) {
-            return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
-        }
-    });
-}
-
-// Support: IE<9
-// Use defaultValue in place of getAttribute("value")
-if ( !support.attributes || !assert(function( div ) {
-    div.innerHTML = "<input/>";
-    div.firstChild.setAttribute( "value", "" );
-    return div.firstChild.getAttribute( "value" ) === "";
-}) ) {
-    addHandle( "value", function( elem, name, isXML ) {
-        if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
-            return elem.defaultValue;
-        }
-    });
-}
-
-// Support: IE<9
-// Use getAttributeNode to fetch booleans when getAttribute lies
-if ( !assert(function( div ) {
-    return div.getAttribute("disabled") == null;
-}) ) {
-    addHandle( booleans, function( elem, name, isXML ) {
-        var val;
-        if ( !isXML ) {
-            return elem[ name ] === true ? name.toLowerCase() :
-                    (val = elem.getAttributeNode( name )) && val.specified ?
-                    val.value :
-                null;
-        }
-    });
-}
-
-return Sizzle;
-
-})( window );
-
-
-
-jQuery.find = Sizzle;
-jQuery.expr = Sizzle.selectors;
-jQuery.expr[ ":" ] = jQuery.expr.pseudos;
-jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
-jQuery.text = Sizzle.getText;
-jQuery.isXMLDoc = Sizzle.isXML;
-jQuery.contains = Sizzle.contains;
-
-
-
-var dir = function( elem, dir, until ) {
-    var matched = [],
-        truncate = until !== undefined;
-
-    while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
-        if ( elem.nodeType === 1 ) {
-            if ( truncate && jQuery( elem ).is( until ) ) {
-                break;
-            }
-            matched.push( elem );
-        }
-    }
-    return matched;
-};
-
-
-var siblings = function( n, elem ) {
-    var matched = [];
-
-    for ( ; n; n = n.nextSibling ) {
-        if ( n.nodeType === 1 && n !== elem ) {
-            matched.push( n );
-        }
-    }
-
-    return matched;
-};
-
-
-var rneedsContext = jQuery.expr.match.needsContext;
-
-var rsingleTag = ( /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/ );
-
-
-
-var risSimple = /^.[^:#\[\.,]*$/;
-
-// Implement the identical functionality for filter and not
-function winnow( elements, qualifier, not ) {
-    if ( jQuery.isFunction( qualifier ) ) {
-        return jQuery.grep( elements, function( elem, i ) {
-            /* jshint -W018 */
-            return !!qualifier.call( elem, i, elem ) !== not;
-        } );
-
-    }
-
-    if ( qualifier.nodeType ) {
-        return jQuery.grep( elements, function( elem ) {
-            return ( elem === qualifier ) !== not;
-        } );
-
-    }
-
-    if ( typeof qualifier === "string" ) {
-        if ( risSimple.test( qualifier ) ) {
-            return jQuery.filter( qualifier, elements, not );
-        }
-
-        qualifier = jQuery.filter( qualifier, elements );
-    }
-
-    return jQuery.grep( elements, function( elem ) {
-        return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
-    } );
-}
-
-jQuery.filter = function( expr, elems, not ) {
-    var elem = elems[ 0 ];
-
-    if ( not ) {
-        expr = ":not(" + expr + ")";
-    }
-
-    return elems.length === 1 && elem.nodeType === 1 ?
-        jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
-        jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
-            return elem.nodeType === 1;
-        } ) );
-};
-
-jQuery.fn.extend( {
-    find: function( selector ) {
-        var i,
-            len = this.length,
-            ret = [],
-            self = this;
-
-        if ( typeof selector !== "string" ) {
-            return this.pushStack( jQuery( selector ).filter( function() {
-                for ( i = 0; i < len; i++ ) {
-                    if ( jQuery.contains( self[ i ], this ) ) {
-                        return true;
-                    }
-                }
-            } ) );
-        }
-
-        for ( i = 0; i < len; i++ ) {
-            jQuery.find( selector, self[ i ], ret );
-        }
-
-        // Needed because $( selector, context ) becomes $( context ).find( selector )
-        ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
-        ret.selector = this.selector ? this.selector + " " + selector : selector;
-        return ret;
-    },
-    filter: function( selector ) {
-        return this.pushStack( winnow( this, selector || [], false ) );
-    },
-    not: function( selector ) {
-        return this.pushStack( winnow( this, selector || [], true ) );
-    },
-    is: function( selector ) {
-        return !!winnow(
-            this,
-
-            // If this is a positional/relative selector, check membership in the returned set
-            // so $("p:first").is("p:last") won't return true for a doc with two "p".
-            typeof selector === "string" && rneedsContext.test( selector ) ?
-                jQuery( selector ) :
-                selector || [],
-            false
-        ).length;
-    }
-} );
-
-
-// Initialize a jQuery object
-
-
-// A central reference to the root jQuery(document)
-var rootjQuery,
-
-    // A simple way to check for HTML strings
-    // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
-    // Strict HTML recognition (#11290: must start with <)
-    rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
-
-    init = jQuery.fn.init = function( selector, context, root ) {
-        var match, elem;
-
-        // HANDLE: $(""), $(null), $(undefined), $(false)
-        if ( !selector ) {
-            return this;
-        }
-
-        // Method init() accepts an alternate rootjQuery
-        // so migrate can support jQuery.sub (gh-2101)
-        root = root || rootjQuery;
-
-        // Handle HTML strings
-        if ( typeof selector === "string" ) {
-            if ( selector[ 0 ] === "<" &&
-                selector[ selector.length - 1 ] === ">" &&
-                selector.length >= 3 ) {
-
-                // Assume that strings that start and end with <> are HTML and skip the regex check
-                match = [ null, selector, null ];
-
-            } else {
-                match = rquickExpr.exec( selector );
-            }
-
-            // Match html or make sure no context is specified for #id
-            if ( match && ( match[ 1 ] || !context ) ) {
-
-                // HANDLE: $(html) -> $(array)
-                if ( match[ 1 ] ) {
-                    context = context instanceof jQuery ? context[ 0 ] : context;
-
-                    // Option to run scripts is true for back-compat
-                    // Intentionally let the error be thrown if parseHTML is not present
-                    jQuery.merge( this, jQuery.parseHTML(
-                        match[ 1 ],
-                        context && context.nodeType ? context.ownerDocument || context : document,
-                        true
-                    ) );
-
-                    // HANDLE: $(html, props)
-                    if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
-                        for ( match in context ) {
-
-                            // Properties of context are called as methods if possible
-                            if ( jQuery.isFunction( this[ match ] ) ) {
-                                this[ match ]( context[ match ] );
-
-                            // ...and otherwise set as attributes
-                            } else {
-                                this.attr( match, context[ match ] );
-                            }
-                        }
-                    }
-
-                    return this;
-
-                // HANDLE: $(#id)
-                } else {
-                    elem = document.getElementById( match[ 2 ] );
-
-                    // Support: Blackberry 4.6
-                    // gEBID returns nodes no longer in the document (#6963)
-                    if ( elem && elem.parentNode ) {
-
-                        // Inject the element directly into the jQuery object
-                        this.length = 1;
-                        this[ 0 ] = elem;
-                    }
-
-                    this.context = document;
-                    this.selector = selector;
-                    return this;
-                }
-
-            // HANDLE: $(expr, $(...))
-            } else if ( !context || context.jquery ) {
-                return ( context || root ).find( selector );
-
-            // HANDLE: $(expr, context)
-            // (which is just equivalent to: $(context).find(expr)
-            } else {
-                return this.constructor( context ).find( selector );
-            }
-
-        // HANDLE: $(DOMElement)
-        } else if ( selector.nodeType ) {
-            this.context = this[ 0 ] = selector;
-            this.length = 1;
-            return this;
-
-        // HANDLE: $(function)
-        // Shortcut for document ready
-        } else if ( jQuery.isFunction( selector ) ) {
-            return root.ready !== undefined ?
-                root.ready( selector ) :
-
-                // Execute immediately if ready is not present
-                selector( jQuery );
-        }
-
-        if ( selector.selector !== undefined ) {
-            this.selector = selector.selector;
-            this.context = selector.context;
-        }
-
-        return jQuery.makeArray( selector, this );
-    };
-
-// Give the init function the jQuery prototype for later instantiation
-init.prototype = jQuery.fn;
-
-// Initialize central reference
-rootjQuery = jQuery( document );
-
-
-var rparentsprev = /^(?:parents|prev(?:Until|All))/,
-
-    // Methods guaranteed to produce a unique set when starting from a unique set
-    guaranteedUnique = {
-        children: true,
-        contents: true,
-        next: true,
-        prev: true
-    };
-
-jQuery.fn.extend( {
-    has: function( target ) {
-        var targets = jQuery( target, this ),
-            l = targets.length;
-
-        return this.filter( function() {
-            var i = 0;
-            for ( ; i < l; i++ ) {
-                if ( jQuery.contains( this, targets[ i ] ) ) {
-                    return true;
-                }
-            }
-        } );
-    },
-
-    closest: function( selectors, context ) {
-        var cur,
-            i = 0,
-            l = this.length,
-            matched = [],
-            pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
-                jQuery( selectors, context || this.context ) :
-                0;
-
-        for ( ; i < l; i++ ) {
-            for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
-
-                // Always skip document fragments
-                if ( cur.nodeType < 11 && ( pos ?
-                    pos.index( cur ) > -1 :
-
-                    // Don't pass non-elements to Sizzle
-                    cur.nodeType === 1 &&
-                        jQuery.find.matchesSelector( cur, selectors ) ) ) {
-
-                    matched.push( cur );
-                    break;
-                }
-            }
-        }
-
-        return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
-    },
-
-    // Determine the position of an element within the set
-    index: function( elem ) {
-
-        // No argument, return index in parent
-        if ( !elem ) {
-            return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
-        }
-
-        // Index in selector
-        if ( typeof elem === "string" ) {
-            return indexOf.call( jQuery( elem ), this[ 0 ] );
-        }
-
-        // Locate the position of the desired element
-        return indexOf.call( this,
-
-            // If it receives a jQuery object, the first element is used
-            elem.jquery ? elem[ 0 ] : elem
-        );
-    },
-
-    add: function( selector, context ) {
-        return this.pushStack(
-            jQuery.uniqueSort(
-                jQuery.merge( this.get(), jQuery( selector, context ) )
-            )
-        );
-    },
-
-    addBack: function( selector ) {
-        return this.add( selector == null ?
-            this.prevObject : this.prevObject.filter( selector )
-        );
-    }
-} );
-
-function sibling( cur, dir ) {
-    while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
-    return cur;
-}
-
-jQuery.each( {
-    parent: function( elem ) {
-        var parent = elem.parentNode;
-        return parent && parent.nodeType !== 11 ? parent : null;
-    },
-    parents: function( elem ) {
-        return dir( elem, "parentNode" );
-    },
-    parentsUntil: function( elem, i, until ) {
-        return dir( elem, "parentNode", until );
-    },
-    next: function( elem ) {
-        return sibling( elem, "nextSibling" );
-    },
-    prev: function( elem ) {
-        return sibling( elem, "previousSibling" );
-    },
-    nextAll: function( elem ) {
-        return dir( elem, "nextSibling" );
-    },
-    prevAll: function( elem ) {
-        return dir( elem, "previousSibling" );
-    },
-    nextUntil: function( elem, i, until ) {
-        return dir( elem, "nextSibling", until );
-    },
-    prevUntil: function( elem, i, until ) {
-        return dir( elem, "previousSibling", until );
-    },
-    siblings: function( elem ) {
-        return siblings( ( elem.parentNode || {} ).firstChild, elem );
-    },
-    children: function( elem ) {
-        return siblings( elem.firstChild );
-    },
-    contents: function( elem ) {
-        return elem.contentDocument || jQuery.merge( [], elem.childNodes );
-    }
-}, function( name, fn ) {
-    jQuery.fn[ name ] = function( until, selector ) {
-        var matched = jQuery.map( this, fn, until );
-
-        if ( name.slice( -5 ) !== "Until" ) {
-            selector = until;
-        }
-
-        if ( selector && typeof selector === "string" ) {
-            matched = jQuery.filter( selector, matched );
-        }
-
-        if ( this.length > 1 ) {
-
-            // Remove duplicates
-            if ( !guaranteedUnique[ name ] ) {
-                jQuery.uniqueSort( matched );
-            }
-
-            // Reverse order for parents* and prev-derivatives
-            if ( rparentsprev.test( name ) ) {
-                matched.reverse();
-            }
-        }
-
-        return this.pushStack( matched );
-    };
-} );
-var rnotwhite = ( /\S+/g );
-
-
-
-// Convert String-formatted options into Object-formatted ones
-function createOptions( options ) {
-    var object = {};
-    jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {
-        object[ flag ] = true;
-    } );
-    return object;
-}
-
-/*
- * Create a callback list using the following parameters:
- *
- *  options: an optional list of space-separated options that will change how
- *          the callback list behaves or a more traditional option object
- *
- * By default a callback list will act like an event callback list and can be
- * "fired" multiple times.
- *
- * Possible options:
- *
- *  once:           will ensure the callback list can only be fired once (like a Deferred)
- *
- *  memory:         will keep track of previous values and will call any callback added
- *                  after the list has been fired right away with the latest "memorized"
- *                  values (like a Deferred)
- *
- *  unique:         will ensure a callback can only be added once (no duplicate in the list)
- *
- *  stopOnFalse:    interrupt callings when a callback returns false
- *
- */
-jQuery.Callbacks = function( options ) {
-
-    // Convert options from String-formatted to Object-formatted if needed
-    // (we check in cache first)
-    options = typeof options === "string" ?
-        createOptions( options ) :
-        jQuery.extend( {}, options );
-
-    var // Flag to know if list is currently firing
-        firing,
-
-        // Last fire value for non-forgettable lists
-        memory,
-
-        // Flag to know if list was already fired
-        fired,
-
-        // Flag to prevent firing
-        locked,
-
-        // Actual callback list
-        list = [],
-
-        // Queue of execution data for repeatable lists
-        queue = [],
-
-        // Index of currently firing callback (modified by add/remove as needed)
-        firingIndex = -1,
-
-        // Fire callbacks
-        fire = function() {
-
-            // Enforce single-firing
-            locked = options.once;
-
-            // Execute callbacks for all pending executions,
-            // respecting firingIndex overrides and runtime changes
-            fired = firing = true;
-            for ( ; queue.length; firingIndex = -1 ) {
-                memory = queue.shift();
-                while ( ++firingIndex < list.length ) {
-
-                    // Run callback and check for early termination
-                    if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
-                        options.stopOnFalse ) {
-
-                        // Jump to end and forget the data so .add doesn't re-fire
-                        firingIndex = list.length;
-                        memory = false;
-                    }
-                }
-            }
-
-            // Forget the data if we're done with it
-            if ( !options.memory ) {
-                memory = false;
-            }
-
-            firing = false;
-
-            // Clean up if we're done firing for good
-            if ( locked ) {
-
-                // Keep an empty list if we have data for future add calls
-                if ( memory ) {
-                    list = [];
-
-                // Otherwise, this object is spent
-                } else {
-                    list = "";
-                }
-            }
-        },
-
-        // Actual Callbacks object
-        self = {
-
-            // Add a callback or a collection of callbacks to the list
-            add: function() {
-                if ( list ) {
-
-                    // If we have memory from a past run, we should fire after adding
-                    if ( memory && !firing ) {
-                        firingIndex = list.length - 1;
-                        queue.push( memory );
-                    }
-
-                    ( function add( args ) {
-                        jQuery.each( args, function( _, arg ) {
-                            if ( jQuery.isFunction( arg ) ) {
-                                if ( !options.unique || !self.has( arg ) ) {
-                                    list.push( arg );
-                                }
-                            } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) {
-
-                                // Inspect recursively
-                                add( arg );
-                            }
-                        } );
-                    } )( arguments );
-
-                    if ( memory && !firing ) {
-                        fire();
-                    }
-                }
-                return this;
-            },
-
-            // Remove a callback from the list
-            remove: function() {
-                jQuery.each( arguments, function( _, arg ) {
-                    var index;
-                    while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
-                        list.splice( index, 1 );
-
-                        // Handle firing indexes
-                        if ( index <= firingIndex ) {
-                            firingIndex--;
-                        }
-                    }
-                } );
-                return this;
-            },
-
-            // Check if a given callback is in the list.
-            // If no argument is given, return whether or not list has callbacks attached.
-            has: function( fn ) {
-                return fn ?
-                    jQuery.inArray( fn, list ) > -1 :
-                    list.length > 0;
-            },
-
-            // Remove all callbacks from the list
-            empty: function() {
-                if ( list ) {
-                    list = [];
-                }
-                return this;
-            },
-
-            // Disable .fire and .add
-            // Abort any current/pending executions
-            // Clear all callbacks and values
-            disable: function() {
-                locked = queue = [];
-                list = memory = "";
-                return this;
-            },
-            disabled: function() {
-                return !list;
-            },
-
-            // Disable .fire
-            // Also disable .add unless we have memory (since it would have no effect)
-            // Abort any pending executions
-            lock: function() {
-                locked = queue = [];
-                if ( !memory ) {
-                    list = memory = "";
-                }
-                return this;
-            },
-            locked: function() {
-                return !!locked;
-            },
-
-            // Call all callbacks with the given context and arguments
-            fireWith: function( context, args ) {
-                if ( !locked ) {
-                    args = args || [];
-                    args = [ context, args.slice ? args.slice() : args ];
-                    queue.push( args );
-                    if ( !firing ) {
-                        fire();
-                    }
-                }
-                return this;
-            },
-
-            // Call all the callbacks with the given arguments
-            fire: function() {
-                self.fireWith( this, arguments );
-                return this;
-            },
-
-            // To know if the callbacks have already been called at least once
-            fired: function() {
-                return !!fired;
-            }
-        };
-
-    return self;
-};
-
-
-jQuery.extend( {
-
-    Deferred: function( func ) {
-        var tuples = [
-
-                // action, add listener, listener list, final state
-                [ "resolve", "done", jQuery.Callbacks( "once memory" ), "resolved" ],
-                [ "reject", "fail", jQuery.Callbacks( "once memory" ), "rejected" ],
-                [ "notify", "progress", jQuery.Callbacks( "memory" ) ]
-            ],
-            state = "pending",
-            promise = {
-                state: function() {
-                    return state;
-                },
-                always: function() {
-                    deferred.done( arguments ).fail( arguments );
-                    return this;
-                },
-                then: function( /* fnDone, fnFail, fnProgress */ ) {
-                    var fns = arguments;
-                    return jQuery.Deferred( function( newDefer ) {
-                        jQuery.each( tuples, function( i, tuple ) {
-                            var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
-
-                            // deferred[ done | fail | progress ] for forwarding actions to newDefer
-                            deferred[ tuple[ 1 ] ]( function() {
-                                var returned = fn && fn.apply( this, arguments );
-                                if ( returned && jQuery.isFunction( returned.promise ) ) {
-                                    returned.promise()
-                                        .progress( newDefer.notify )
-                                        .done( newDefer.resolve )
-                                        .fail( newDefer.reject );
-                                } else {
-                                    newDefer[ tuple[ 0 ] + "With" ](
-                                        this === promise ? newDefer.promise() : this,
-                                        fn ? [ returned ] : arguments
-                                    );
-                                }
-                            } );
-                        } );
-                        fns = null;
-                    } ).promise();
-                },
-
-                // Get a promise for this deferred
-                // If obj is provided, the promise aspect is added to the object
-                promise: function( obj ) {
-                    return obj != null ? jQuery.extend( obj, promise ) : promise;
-                }
-            },
-            deferred = {};
-
-        // Keep pipe for back-compat
-        promise.pipe = promise.then;
-
-        // Add list-specific methods
-        jQuery.each( tuples, function( i, tuple ) {
-            var list = tuple[ 2 ],
-                stateString = tuple[ 3 ];
-
-            // promise[ done | fail | progress ] = list.add
-            promise[ tuple[ 1 ] ] = list.add;
-
-            // Handle state
-            if ( stateString ) {
-                list.add( function() {
-
-                    // state = [ resolved | rejected ]
-                    state = stateString;
-
-                // [ reject_list | resolve_list ].disable; progress_list.lock
-                }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
-            }
-
-            // deferred[ resolve | reject | notify ]
-            deferred[ tuple[ 0 ] ] = function() {
-                deferred[ tuple[ 0 ] + "With" ]( this === deferred ? promise : this, arguments );
-                return this;
-            };
-            deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
-        } );
-
-        // Make the deferred a promise
-        promise.promise( deferred );
-
-        // Call given func if any
-        if ( func ) {
-            func.call( deferred, deferred );
-        }
-
-        // All done!
-        return deferred;
-    },
-
-    // Deferred helper
-    when: function( subordinate /* , ..., subordinateN */ ) {
-        var i = 0,
-            resolveValues = slice.call( arguments ),
-            length = resolveValues.length,
-
-            // the count of uncompleted subordinates
-            remaining = length !== 1 ||
-                ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
-
-            // the master Deferred.
-            // If resolveValues consist of only a single Deferred, just use that.
-            deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
-
-            // Update function for both resolve and progress values
-            updateFunc = function( i, contexts, values ) {
-                return function( value ) {
-                    contexts[ i ] = this;
-                    values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
-                    if ( values === progressValues ) {
-                        deferred.notifyWith( contexts, values );
-                    } else if ( !( --remaining ) ) {
-                        deferred.resolveWith( contexts, values );
-                    }
-                };
-            },
-
-            progressValues, progressContexts, resolveContexts;
-
-        // Add listeners to Deferred subordinates; treat others as resolved
-        if ( length > 1 ) {
-            progressValues = new Array( length );
-            progressContexts = new Array( length );
-            resolveContexts = new Array( length );
-            for ( ; i < length; i++ ) {
-                if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
-                    resolveValues[ i ].promise()
-                        .progress( updateFunc( i, progressContexts, progressValues ) )
-                        .done( updateFunc( i, resolveContexts, resolveValues ) )
-                        .fail( deferred.reject );
-                } else {
-                    --remaining;
-                }
-            }
-        }
-
-        // If we're not waiting on anything, resolve the master
-        if ( !remaining ) {
-            deferred.resolveWith( resolveContexts, resolveValues );
-        }
-
-        return deferred.promise();
-    }
-} );
-
-
-// The deferred used on DOM ready
-var readyList;
-
-jQuery.fn.ready = function( fn ) {
-
-    // Add the callback
-    jQuery.ready.promise().done( fn );
-
-    return this;
-};
-
-jQuery.extend( {
-
-    // Is the DOM ready to be used? Set to true once it occurs.
-    isReady: false,
-
-    // A counter to track how many items to wait for before
-    // the ready event fires. See #6781
-    readyWait: 1,
-
-    // Hold (or release) the ready event
-    holdReady: function( hold ) {
-        if ( hold ) {
-            jQuery.readyWait++;
-        } else {
-            jQuery.ready( true );
-        }
-    },
-
-    // Handle when the DOM is ready
-    ready: function( wait ) {
-
-        // Abort if there are pending holds or we're already ready
-        if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
-            return;
-        }
-
-        // Remember that the DOM is ready
-        jQuery.isReady = true;
-
-        // If a normal DOM Ready event fired, decrement, and wait if need be
-        if ( wait !== true && --jQuery.readyWait > 0 ) {
-            return;
-        }
-
-        // If there are functions bound, to execute
-        readyList.resolveWith( document, [ jQuery ] );
-
-        // Trigger any bound ready events
-        if ( jQuery.fn.triggerHandler ) {
-            jQuery( document ).triggerHandler( "ready" );
-            jQuery( document ).off( "ready" );
-        }
-    }
-} );
-
-/**
- * The ready event handler and self cleanup method
- */
-function completed() {
-    document.removeEventListener( "DOMContentLoaded", completed );
-    window.removeEventListener( "load", completed );
-    jQuery.ready();
-}
-
-jQuery.ready.promise = function( obj ) {
-    if ( !readyList ) {
-
-        readyList = jQuery.Deferred();
-
-        // Catch cases where $(document).ready() is called
-        // after the browser event has already occurred.
-        // Support: IE9-10 only
-        // Older IE sometimes signals "interactive" too soon
-        if ( document.readyState === "complete" ||
-            ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
-
-            // Handle it asynchronously to allow scripts the opportunity to delay ready
-            window.setTimeout( jQuery.ready );
-
-        } else {
-
-            // Use the handy event callback
-            document.addEventListener( "DOMContentLoaded", completed );
-
-            // A fallback to window.onload, that will always work
-            window.addEventListener( "load", completed );
-        }
-    }
-    return readyList.promise( obj );
-};
-
-// Kick off the DOM ready check even if the user does not
-jQuery.ready.promise();
-
-
-
-
-// Multifunctional method to get and set values of a collection
-// The value/s can optionally be executed if it's a function
-var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
-    var i = 0,
-        len = elems.length,
-        bulk = key == null;
-
-    // Sets many values
-    if ( jQuery.type( key ) === "object" ) {
-        chainable = true;
-        for ( i in key ) {
-            access( elems, fn, i, key[ i ], true, emptyGet, raw );
-        }
-
-    // Sets one value
-    } else if ( value !== undefined ) {
-        chainable = true;
-
-        if ( !jQuery.isFunction( value ) ) {
-            raw = true;
-        }
-
-        if ( bulk ) {
-
-            // Bulk operations run against the entire set
-            if ( raw ) {
-                fn.call( elems, value );
-                fn = null;
-
-            // ...except when executing function values
-            } else {
-                bulk = fn;
-                fn = function( elem, key, value ) {
-                    return bulk.call( jQuery( elem ), value );
-                };
-            }
-        }
-
-        if ( fn ) {
-            for ( ; i < len; i++ ) {
-                fn(
-                    elems[ i ], key, raw ?
-                    value :
-                    value.call( elems[ i ], i, fn( elems[ i ], key ) )
-                );
-            }
-        }
-    }
-
-    return chainable ?
-        elems :
-
-        // Gets
-        bulk ?
-            fn.call( elems ) :
-            len ? fn( elems[ 0 ], key ) : emptyGet;
-};
-var acceptData = function( owner ) {
-
-    // Accepts only:
-    //  - Node
-    //    - Node.ELEMENT_NODE
-    //    - Node.DOCUMENT_NODE
-    //  - Object
-    //    - Any
-    /* jshint -W018 */
-    return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
-};
-
-
-
-
-function Data() {
-    this.expando = jQuery.expando + Data.uid++;
-}
-
-Data.uid = 1;
-
-Data.prototype = {
-
-    register: function( owner, initial ) {
-        var value = initial || {};
-
-        // If it is a node unlikely to be stringify-ed or looped over
-        // use plain assignment
-        if ( owner.nodeType ) {
-            owner[ this.expando ] = value;
-
-        // Otherwise secure it in a non-enumerable, non-writable property
-        // configurability must be true to allow the property to be
-        // deleted with the delete operator
-        } else {
-            Object.defineProperty( owner, this.expando, {
-                value: value,
-                writable: true,
-                configurable: true
-            } );
-        }
-        return owner[ this.expando ];
-    },
-    cache: function( owner ) {
-
-        // We can accept data for non-element nodes in modern browsers,
-        // but we should not, see #8335.
-        // Always return an empty object.
-        if ( !acceptData( owner ) ) {
-            return {};
-        }
-
-        // Check if the owner object already has a cache
-        var value = owner[ this.expando ];
-
-        // If not, create one
-        if ( !value ) {
-            value = {};
-
-            // We can accept data for non-element nodes in modern browsers,
-            // but we should not, see #8335.
-            // Always return an empty object.
-            if ( acceptData( owner ) ) {
-
-                // If it is a node unlikely to be stringify-ed or looped over
-                // use plain assignment
-                if ( owner.nodeType ) {
-                    owner[ this.expando ] = value;
-
-                // Otherwise secure it in a non-enumerable property
-                // configurable must be true to allow the property to be
-                // deleted when data is removed
-                } else {
-                    Object.defineProperty( owner, this.expando, {
-                        value: value,
-                        configurable: true
-                    } );
-                }
-            }
-        }
-
-        return value;
-    },
-    set: function( owner, data, value ) {
-        var prop,
-            cache = this.cache( owner );
-
-        // Handle: [ owner, key, value ] args
-        if ( typeof data === "string" ) {
-            cache[ data ] = value;
-
-        // Handle: [ owner, { properties } ] args
-        } else {
-
-            // Copy the properties one-by-one to the cache object
-            for ( prop in data ) {
-                cache[ prop ] = data[ prop ];
-            }
-        }
-        return cache;
-    },
-    get: function( owner, key ) {
-        return key === undefined ?
-            this.cache( owner ) :
-            owner[ this.expando ] && owner[ this.expando ][ key ];
-    },
-    access: function( owner, key, value ) {
-        var stored;
-
-        // In cases where either:
-        //
-        //   1. No key was specified
-        //   2. A string key was specified, but no value provided
-        //
-        // Take the "read" path and allow the get method to determine
-        // which value to return, respectively either:
-        //
-        //   1. The entire cache object
-        //   2. The data stored at the key
-        //
-        if ( key === undefined ||
-                ( ( key && typeof key === "string" ) && value === undefined ) ) {
-
-            stored = this.get( owner, key );
-
-            return stored !== undefined ?
-                stored : this.get( owner, jQuery.camelCase( key ) );
-        }
-
-        // When the key is not a string, or both a key and value
-        // are specified, set or extend (existing objects) with either:
-        //
-        //   1. An object of properties
-        //   2. A key and value
-        //
-        this.set( owner, key, value );
-
-        // Since the "set" path can have two possible entry points
-        // return the expected data based on which path was taken[*]
-        return value !== undefined ? value : key;
-    },
-    remove: function( owner, key ) {
-        var i, name, camel,
-            cache = owner[ this.expando ];
-
-        if ( cache === undefined ) {
-            return;
-        }
-
-        if ( key === undefined ) {
-            this.register( owner );
-
-        } else {
-
-            // Support array or space separated string of keys
-            if ( jQuery.isArray( key ) ) {
-
-                // If "name" is an array of keys...
-                // When data is initially created, via ("key", "val") signature,
-                // keys will be converted to camelCase.
-                // Since there is no way to tell _how_ a key was added, remove
-                // both plain key and camelCase key. #12786
-                // This will only penalize the array argument path.
-                name = key.concat( key.map( jQuery.camelCase ) );
-            } else {
-                camel = jQuery.camelCase( key );
-
-                // Try the string as a key before any manipulation
-                if ( key in cache ) {
-                    name = [ key, camel ];
-                } else {
-
-                    // If a key with the spaces exists, use it.
-                    // Otherwise, create an array by matching non-whitespace
-                    name = camel;
-                    name = name in cache ?
-                        [ name ] : ( name.match( rnotwhite ) || [] );
-                }
-            }
-
-            i = name.length;
-
-            while ( i-- ) {
-                delete cache[ name[ i ] ];
-            }
-        }
-
-        // Remove the expando if there's no more data
-        if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
-
-            // Support: Chrome <= 35-45+
-            // Webkit & Blink performance suffers when deleting properties
-            // from DOM nodes, so set to undefined instead
-            // https://code.google.com/p/chromium/issues/detail?id=378607
-            if ( owner.nodeType ) {
-                owner[ this.expando ] = undefined;
-            } else {
-                delete owner[ this.expando ];
-            }
-        }
-    },
-    hasData: function( owner ) {
-        var cache = owner[ this.expando ];
-        return cache !== undefined && !jQuery.isEmptyObject( cache );
-    }
-};
-var dataPriv = new Data();
-
-var dataUser = new Data();
-
-
-
-//  Implementation Summary
-//
-//  1. Enforce API surface and semantic compatibility with 1.9.x branch
-//  2. Improve the module's maintainability by reducing the storage
-//      paths to a single mechanism.
-//  3. Use the same single mechanism to support "private" and "user" data.
-//  4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
-//  5. Avoid exposing implementation details on user objects (eg. expando properties)
-//  6. Provide a clear path for implementation upgrade to WeakMap in 2014
-
-var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
-    rmultiDash = /[A-Z]/g;
-
-function dataAttr( elem, key, data ) {
-    var name;
-
-    // If nothing was found internally, try to fetch any
-    // data from the HTML5 data-* attribute
-    if ( data === undefined && elem.nodeType === 1 ) {
-        name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
-        data = elem.getAttribute( name );
-
-        if ( typeof data === "string" ) {
-            try {
-                data = data === "true" ? true :
-                    data === "false" ? false :
-                    data === "null" ? null :
-
-                    // Only convert to a number if it doesn't change the string
-                    +data + "" === data ? +data :
-                    rbrace.test( data ) ? jQuery.parseJSON( data ) :
-                    data;
-            } catch ( e ) {}
-
-            // Make sure we set the data so it isn't changed later
-            dataUser.set( elem, key, data );
-        } else {
-            data = undefined;
-        }
-    }
-    return data;
-}
-
-jQuery.extend( {
-    hasData: function( elem ) {
-        return dataUser.hasData( elem ) || dataPriv.hasData( elem );
-    },
-
-    data: function( elem, name, data ) {
-        return dataUser.access( elem, name, data );
-    },
-
-    removeData: function( elem, name ) {
-        dataUser.remove( elem, name );
-    },
-
-    // TODO: Now that all calls to _data and _removeData have been replaced
-    // with direct calls to dataPriv methods, these can be deprecated.
-    _data: function( elem, name, data ) {
-        return dataPriv.access( elem, name, data );
-    },
-
-    _removeData: function( elem, name ) {
-        dataPriv.remove( elem, name );
-    }
-} );
-
-jQuery.fn.extend( {
-    data: function( key, value ) {
-        var i, name, data,
-            elem = this[ 0 ],
-            attrs = elem && elem.attributes;
-
-        // Gets all values
-        if ( key === undefined ) {
-            if ( this.length ) {
-                data = dataUser.get( elem );
-
-                if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
-                    i = attrs.length;
-                    while ( i-- ) {
-
-                        // Support: IE11+
-                        // The attrs elements can be null (#14894)
-                        if ( attrs[ i ] ) {
-                            name = attrs[ i ].name;
-                            if ( name.indexOf( "data-" ) === 0 ) {
-                                name = jQuery.camelCase( name.slice( 5 ) );
-                                dataAttr( elem, name, data[ name ] );
-                            }
-                        }
-                    }
-                    dataPriv.set( elem, "hasDataAttrs", true );
-                }
-            }
-
-            return data;
-        }
-
-        // Sets multiple values
-        if ( typeof key === "object" ) {
-            return this.each( function() {
-                dataUser.set( this, key );
-            } );
-        }
-
-        return access( this, function( value ) {
-            var data, camelKey;
-
-            // The calling jQuery object (element matches) is not empty
-            // (and therefore has an element appears at this[ 0 ]) and the
-            // `value` parameter was not undefined. An empty jQuery object
-            // will result in `undefined` for elem = this[ 0 ] which will
-            // throw an exception if an attempt to read a data cache is made.
-            if ( elem && value === undefined ) {
-
-                // Attempt to get data from the cache
-                // with the key as-is
-                data = dataUser.get( elem, key ) ||
-
-                    // Try to find dashed key if it exists (gh-2779)
-                    // This is for 2.2.x only
-                    dataUser.get( elem, key.replace( rmultiDash, "-$&" ).toLowerCase() );
-
-                if ( data !== undefined ) {
-                    return data;
-                }
-
-                camelKey = jQuery.camelCase( key );
-
-                // Attempt to get data from the cache
-                // with the key camelized
-                data = dataUser.get( elem, camelKey );
-                if ( data !== undefined ) {
-                    return data;
-                }
-
-                // Attempt to "discover" the data in
-                // HTML5 custom data-* attrs
-                data = dataAttr( elem, camelKey, undefined );
-                if ( data !== undefined ) {
-                    return data;
-                }
-
-                // We tried really hard, but the data doesn't exist.
-                return;
-            }
-
-            // Set the data...
-            camelKey = jQuery.camelCase( key );
-            this.each( function() {
-
-                // First, attempt to store a copy or reference of any
-                // data that might've been store with a camelCased key.
-                var data = dataUser.get( this, camelKey );
-
-                // For HTML5 data-* attribute interop, we have to
-                // store property names with dashes in a camelCase form.
-                // This might not apply to all properties...*
-                dataUser.set( this, camelKey, value );
-
-                // *... In the case of properties that might _actually_
-                // have dashes, we need to also store a copy of that
-                // unchanged property.
-                if ( key.indexOf( "-" ) > -1 && data !== undefined ) {
-                    dataUser.set( this, key, value );
-                }
-            } );
-        }, null, value, arguments.length > 1, null, true );
-    },
-
-    removeData: function( key ) {
-        return this.each( function() {
-            dataUser.remove( this, key );
-        } );
-    }
-} );
-
-
-jQuery.extend( {
-    queue: function( elem, type, data ) {
-        var queue;
-
-        if ( elem ) {
-            type = ( type || "fx" ) + "queue";
-            queue = dataPriv.get( elem, type );
-
-            // Speed up dequeue by getting out quickly if this is just a lookup
-            if ( data ) {
-                if ( !queue || jQuery.isArray( data ) ) {
-                    queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
-                } else {
-                    queue.push( data );
-                }
-            }
-            return queue || [];
-        }
-    },
-
-    dequeue: function( elem, type ) {
-        type = type || "fx";
-
-        var queue = jQuery.queue( elem, type ),
-            startLength = queue.length,
-            fn = queue.shift(),
-            hooks = jQuery._queueHooks( elem, type ),
-            next = function() {
-                jQuery.dequeue( elem, type );
-            };
-
-        // If the fx queue is dequeued, always remove the progress sentinel
-        if ( fn === "inprogress" ) {
-            fn = queue.shift();
-            startLength--;
-        }
-
-        if ( fn ) {
-
-            // Add a progress sentinel to prevent the fx queue from being
-            // automatically dequeued
-            if ( type === "fx" ) {
-                queue.unshift( "inprogress" );
-            }
-
-            // Clear up the last queue stop function
-            delete hooks.stop;
-            fn.call( elem, next, hooks );
-        }
-
-        if ( !startLength && hooks ) {
-            hooks.empty.fire();
-        }
-    },
-
-    // Not public - generate a queueHooks object, or return the current one
-    _queueHooks: function( elem, type ) {
-        var key = type + "queueHooks";
-        return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
-            empty: jQuery.Callbacks( "once memory" ).add( function() {
-                dataPriv.remove( elem, [ type + "queue", key ] );
-            } )
-        } );
-    }
-} );
-
-jQuery.fn.extend( {
-    queue: function( type, data ) {
-        var setter = 2;
-
-        if ( typeof type !== "string" ) {
-            data = type;
-            type = "fx";
-            setter--;
-        }
-
-        if ( arguments.length < setter ) {
-            return jQuery.queue( this[ 0 ], type );
-        }
-
-        return data === undefined ?
-            this :
-            this.each( function() {
-                var queue = jQuery.queue( this, type, data );
-
-                // Ensure a hooks for this queue
-                jQuery._queueHooks( this, type );
-
-                if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
-                    jQuery.dequeue( this, type );
-                }
-            } );
-    },
-    dequeue: function( type ) {
-        return this.each( function() {
-            jQuery.dequeue( this, type );
-        } );
-    },
-    clearQueue: function( type ) {
-        return this.queue( type || "fx", [] );
-    },
-
-    // Get a promise resolved when queues of a certain type
-    // are emptied (fx is the type by default)
-    promise: function( type, obj ) {
-        var tmp,
-            count = 1,
-            defer = jQuery.Deferred(),
-            elements = this,
-            i = this.length,
-            resolve = function() {
-                if ( !( --count ) ) {
-                    defer.resolveWith( elements, [ elements ] );
-                }
-            };
-
-        if ( typeof type !== "string" ) {
-            obj = type;
-            type = undefined;
-        }
-        type = type || "fx";
-
-        while ( i-- ) {
-            tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
-            if ( tmp && tmp.empty ) {
-                count++;
-                tmp.empty.add( resolve );
-            }
-        }
-        resolve();
-        return defer.promise( obj );
-    }
-} );
-var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
-
-var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
-
-
-var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
-
-var isHidden = function( elem, el ) {
-
-        // isHidden might be called from jQuery#filter function;
-        // in that case, element will be second argument
-        elem = el || elem;
-        return jQuery.css( elem, "display" ) === "none" ||
-            !jQuery.contains( elem.ownerDocument, elem );
-    };
-
-
-
-function adjustCSS( elem, prop, valueParts, tween ) {
-    var adjusted,
-        scale = 1,
-        maxIterations = 20,
-        currentValue = tween ?
-            function() { return tween.cur(); } :
-            function() { return jQuery.css( elem, prop, "" ); },
-        initial = currentValue(),
-        unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
-
-        // Starting value computation is required for potential unit mismatches
-        initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
-            rcssNum.exec( jQuery.css( elem, prop ) );
-
-    if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
-
-        // Trust units reported by jQuery.css
-        unit = unit || initialInUnit[ 3 ];
-
-        // Make sure we update the tween properties later on
-        valueParts = valueParts || [];
-
-        // Iteratively approximate from a nonzero starting point
-        initialInUnit = +initial || 1;
-
-        do {
-
-            // If previous iteration zeroed out, double until we get *something*.
-            // Use string for doubling so we don't accidentally see scale as unchanged below
-            scale = scale || ".5";
-
-            // Adjust and apply
-            initialInUnit = initialInUnit / scale;
-            jQuery.style( elem, prop, initialInUnit + unit );
-
-        // Update scale, tolerating zero or NaN from tween.cur()
-        // Break the loop if scale is unchanged or perfect, or if we've just had enough.
-        } while (
-            scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations
-        );
-    }
-
-    if ( valueParts ) {
-        initialInUnit = +initialInUnit || +initial || 0;
-
-        // Apply relative offset (+=/-=) if specified
-        adjusted = valueParts[ 1 ] ?
-            initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
-            +valueParts[ 2 ];
-        if ( tween ) {
-            tween.unit = unit;
-            tween.start = initialInUnit;
-            tween.end = adjusted;
-        }
-    }
-    return adjusted;
-}
-var rcheckableType = ( /^(?:checkbox|radio)$/i );
-
-var rtagName = ( /<([\w:-]+)/ );
-
-var rscriptType = ( /^$|\/(?:java|ecma)script/i );
-
-
-
-// We have to close these tags to support XHTML (#13200)
-var wrapMap = {
-
-    // Support: IE9
-    option: [ 1, "<select multiple='multiple'>", "</select>" ],
-
-    // XHTML parsers do not magically insert elements in the
-    // same way that tag soup parsers do. So we cannot shorten
-    // this by omitting <tbody> or other required elements.
-    thead: [ 1, "<table>", "</table>" ],
-    col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
-    tr: [ 2, "<table><tbody>", "</tbody></table>" ],
-    td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
-
-    _default: [ 0, "", "" ]
-};
-
-// Support: IE9
-wrapMap.optgroup = wrapMap.option;
-
-wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
-wrapMap.th = wrapMap.td;
-
-
-function getAll( context, tag ) {
-
-    // Support: IE9-11+
-    // Use typeof to avoid zero-argument method invocation on host objects (#15151)
-    var ret = typeof context.getElementsByTagName !== "undefined" ?
-            context.getElementsByTagName( tag || "*" ) :
-            typeof context.querySelectorAll !== "undefined" ?
-                context.querySelectorAll( tag || "*" ) :
-            [];
-
-    return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
-        jQuery.merge( [ context ], ret ) :
-        ret;
-}
-
-
-// Mark scripts as having already been evaluated
-function setGlobalEval( elems, refElements ) {
-    var i = 0,
-        l = elems.length;
-
-    for ( ; i < l; i++ ) {
-        dataPriv.set(
-            elems[ i ],
-            "globalEval",
-            !refElements || dataPriv.get( refElements[ i ], "globalEval" )
-        );
-    }
-}
-
-
-var rhtml = /<|&#?\w+;/;
-
-function buildFragment( elems, context, scripts, selection, ignored ) {
-    var elem, tmp, tag, wrap, contains, j,
-        fragment = context.createDocumentFragment(),
-        nodes = [],
-        i = 0,
-        l = elems.length;
-
-    for ( ; i < l; i++ ) {
-        elem = elems[ i ];
-
-        if ( elem || elem === 0 ) {
-
-            // Add nodes directly
-            if ( jQuery.type( elem ) === "object" ) {
-
-                // Support: Android<4.1, PhantomJS<2
-                // push.apply(_, arraylike) throws on ancient WebKit
-                jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
-
-            // Convert non-html into a text node
-            } else if ( !rhtml.test( elem ) ) {
-                nodes.push( context.createTextNode( elem ) );
-
-            // Convert html into DOM nodes
-            } else {
-                tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
-
-                // Deserialize a standard representation
-                tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
-                wrap = wrapMap[ tag ] || wrapMap._default;
-                tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
-
-                // Descend through wrappers to the right content
-                j = wrap[ 0 ];
-                while ( j-- ) {
-                    tmp = tmp.lastChild;
-                }
-
-                // Support: Android<4.1, PhantomJS<2
-                // push.apply(_, arraylike) throws on ancient WebKit
-                jQuery.merge( nodes, tmp.childNodes );
-
-                // Remember the top-level container
-                tmp = fragment.firstChild;
-
-                // Ensure the created nodes are orphaned (#12392)
-                tmp.textContent = "";
-            }
-        }
-    }
-
-    // Remove wrapper from fragment
-    fragment.textContent = "";
-
-    i = 0;
-    while ( ( elem = nodes[ i++ ] ) ) {
-
-        // Skip elements already in the context collection (trac-4087)
-        if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
-            if ( ignored ) {
-                ignored.push( elem );
-            }
-            continue;
-        }
-
-        contains = jQuery.contains( elem.ownerDocument, elem );
-
-        // Append to fragment
-        tmp = getAll( fragment.appendChild( elem ), "script" );
-
-        // Preserve script evaluation history
-        if ( contains ) {
-            setGlobalEval( tmp );
-        }
-
-        // Capture executables
-        if ( scripts ) {
-            j = 0;
-            while ( ( elem = tmp[ j++ ] ) ) {
-                if ( rscriptType.test( elem.type || "" ) ) {
-                    scripts.push( elem );
-                }
-            }
-        }
-    }
-
-    return fragment;
-}
-
-
-( function() {
-    var fragment = document.createDocumentFragment(),
-        div = fragment.appendChild( document.createElement( "div" ) ),
-        input = document.createElement( "input" );
-
-    // Support: Android 4.0-4.3, Safari<=5.1
-    // Check state lost if the name is set (#11217)
-    // Support: Windows Web Apps (WWA)
-    // `name` and `type` must use .setAttribute for WWA (#14901)
-    input.setAttribute( "type", "radio" );
-    input.setAttribute( "checked", "checked" );
-    input.setAttribute( "name", "t" );
-
-    div.appendChild( input );
-
-    // Support: Safari<=5.1, Android<4.2
-    // Older WebKit doesn't clone checked state correctly in fragments
-    support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
-
-    // Support: IE<=11+
-    // Make sure textarea (and checkbox) defaultValue is properly cloned
-    div.innerHTML = "<textarea>x</textarea>";
-    support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
-} )();
-
-
-var
-    rkeyEvent = /^key/,
-    rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
-    rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
-
-function returnTrue() {
-    return true;
-}
-
-function returnFalse() {
-    return false;
-}
-
-// Support: IE9
-// See #13393 for more info
-function safeActiveElement() {
-    try {
-        return document.activeElement;
-    } catch ( err ) { }
-}
-
-function on( elem, types, selector, data, fn, one ) {
-    var origFn, type;
-
-    // Types can be a map of types/handlers
-    if ( typeof types === "object" ) {
-
-        // ( types-Object, selector, data )
-        if ( typeof selector !== "string" ) {
-
-            // ( types-Object, data )
-            data = data || selector;
-            selector = undefined;
-        }
-        for ( type in types ) {
-            on( elem, type, selector, data, types[ type ], one );
-        }
-        return elem;
-    }
-
-    if ( data == null && fn == null ) {
-
-        // ( types, fn )
-        fn = selector;
-        data = selector = undefined;
-    } else if ( fn == null ) {
-        if ( typeof selector === "string" ) {
-
-            // ( types, selector, fn )
-            fn = data;
-            data = undefined;
-        } else {
-
-            // ( types, data, fn )
-            fn = data;
-            data = selector;
-            selector = undefined;
-        }
-    }
-    if ( fn === false ) {
-        fn = returnFalse;
-    } else if ( !fn ) {
-        return elem;
-    }
-
-    if ( one === 1 ) {
-        origFn = fn;
-        fn = function( event ) {
-
-            // Can use an empty set, since event contains the info
-            jQuery().off( event );
-            return origFn.apply( this, arguments );
-        };
-
-        // Use same guid so caller can remove using origFn
-        fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
-    }
-    return elem.each( function() {
-        jQuery.event.add( this, types, fn, data, selector );
-    } );
-}
-
-/*
- * Helper functions for managing events -- not part of the public interface.
- * Props to Dean Edwards' addEvent library for many of the ideas.
- */
-jQuery.event = {
-
-    global: {},
-
-    add: function( elem, types, handler, data, selector ) {
-
-        var handleObjIn, eventHandle, tmp,
-            events, t, handleObj,
-            special, handlers, type, namespaces, origType,
-            elemData = dataPriv.get( elem );
-
-        // Don't attach events to noData or text/comment nodes (but allow plain objects)
-        if ( !elemData ) {
-            return;
-        }
-
-        // Caller can pass in an object of custom data in lieu of the handler
-        if ( handler.handler ) {
-            handleObjIn = handler;
-            handler = handleObjIn.handler;
-            selector = handleObjIn.selector;
-        }
-
-        // Make sure that the handler has a unique ID, used to find/remove it later
-        if ( !handler.guid ) {
-            handler.guid = jQuery.guid++;
-        }
-
-        // Init the element's event structure and main handler, if this is the first
-        if ( !( events = elemData.events ) ) {
-            events = elemData.events = {};
-        }
-        if ( !( eventHandle = elemData.handle ) ) {
-            eventHandle = elemData.handle = function( e ) {
-
-                // Discard the second event of a jQuery.event.trigger() and
-                // when an event is called after a page has unloaded
-                return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
-                    jQuery.event.dispatch.apply( elem, arguments ) : undefined;
-            };
-        }
-
-        // Handle multiple events separated by a space
-        types = ( types || "" ).match( rnotwhite ) || [ "" ];
-        t = types.length;
-        while ( t-- ) {
-            tmp = rtypenamespace.exec( types[ t ] ) || [];
-            type = origType = tmp[ 1 ];
-            namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
-
-            // There *must* be a type, no attaching namespace-only handlers
-            if ( !type ) {
-                continue;
-            }
-
-            // If event changes its type, use the special event handlers for the changed type
-            special = jQuery.event.special[ type ] || {};
-
-            // If selector defined, determine special event api type, otherwise given type
-            type = ( selector ? special.delegateType : special.bindType ) || type;
-
-            // Update special based on newly reset type
-            special = jQuery.event.special[ type ] || {};
-
-            // handleObj is passed to all event handlers
-            handleObj = jQuery.extend( {
-                type: type,
-                origType: origType,
-                data: data,
-                handler: handler,
-                guid: handler.guid,
-                selector: selector,
-                needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
-                namespace: namespaces.join( "." )
-            }, handleObjIn );
-
-            // Init the event handler queue if we're the first
-            if ( !( handlers = events[ type ] ) ) {
-                handlers = events[ type ] = [];
-                handlers.delegateCount = 0;
-
-                // Only use addEventListener if the special events handler returns false
-                if ( !special.setup ||
-                    special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
-
-                    if ( elem.addEventListener ) {
-                        elem.addEventListener( type, eventHandle );
-                    }
-                }
-            }
-
-            if ( special.add ) {
-                special.add.call( elem, handleObj );
-
-                if ( !handleObj.handler.guid ) {
-                    handleObj.handler.guid = handler.guid;
-                }
-            }
-
-            // Add to the element's handler list, delegates in front
-            if ( selector ) {
-                handlers.splice( handlers.delegateCount++, 0, handleObj );
-            } else {
-                handlers.push( handleObj );
-            }
-
-            // Keep track of which events have ever been used, for event optimization
-            jQuery.event.global[ type ] = true;
-        }
-
-    },
-
-    // Detach an event or set of events from an element
-    remove: function( elem, types, handler, selector, mappedTypes ) {
-
-        var j, origCount, tmp,
-            events, t, handleObj,
-            special, handlers, type, namespaces, origType,
-            elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
-
-        if ( !elemData || !( events = elemData.events ) ) {
-            return;
-        }
-
-        // Once for each type.namespace in types; type may be omitted
-        types = ( types || "" ).match( rnotwhite ) || [ "" ];
-        t = types.length;
-        while ( t-- ) {
-            tmp = rtypenamespace.exec( types[ t ] ) || [];
-            type = origType = tmp[ 1 ];
-            namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
-
-            // Unbind all events (on this namespace, if provided) for the element
-            if ( !type ) {
-                for ( type in events ) {
-                    jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
-                }
-                continue;
-            }
-
-            special = jQuery.event.special[ type ] || {};
-            type = ( selector ? special.delegateType : special.bindType ) || type;
-            handlers = events[ type ] || [];
-            tmp = tmp[ 2 ] &&
-                new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
-
-            // Remove matching events
-            origCount = j = handlers.length;
-            while ( j-- ) {
-                handleObj = handlers[ j ];
-
-                if ( ( mappedTypes || origType === handleObj.origType ) &&
-                    ( !handler || handler.guid === handleObj.guid ) &&
-                    ( !tmp || tmp.test( handleObj.namespace ) ) &&
-                    ( !selector || selector === handleObj.selector ||
-                        selector === "**" && handleObj.selector ) ) {
-                    handlers.splice( j, 1 );
-
-                    if ( handleObj.selector ) {
-                        handlers.delegateCount--;
-                    }
-                    if ( special.remove ) {
-                        special.remove.call( elem, handleObj );
-                    }
-                }
-            }
-
-            // Remove generic event handler if we removed something and no more handlers exist
-            // (avoids potential for endless recursion during removal of special event handlers)
-            if ( origCount && !handlers.length ) {
-                if ( !special.teardown ||
-                    special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
-
-                    jQuery.removeEvent( elem, type, elemData.handle );
-                }
-
-                delete events[ type ];
-            }
-        }
-
-        // Remove data and the expando if it's no longer used
-        if ( jQuery.isEmptyObject( events ) ) {
-            dataPriv.remove( elem, "handle events" );
-        }
-    },
-
-    dispatch: function( event ) {
-
-        // Make a writable jQuery.Event from the native event object
-        event = jQuery.event.fix( event );
-
-        var i, j, ret, matched, handleObj,
-            handlerQueue = [],
-            args = slice.call( arguments ),
-            handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [],
-            special = jQuery.event.special[ event.type ] || {};
-
-        // Use the fix-ed jQuery.Event rather than the (read-only) native event
-        args[ 0 ] = event;
-        event.delegateTarget = this;
-
-        // Call the preDispatch hook for the mapped type, and let it bail if desired
-        if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
-            return;
-        }
-
-        // Determine handlers
-        handlerQueue = jQuery.event.handlers.call( this, event, handlers );
-
-        // Run delegates first; they may want to stop propagation beneath us
-        i = 0;
-        while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
-            event.currentTarget = matched.elem;
-
-            j = 0;
-            while ( ( handleObj = matched.handlers[ j++ ] ) &&
-                !event.isImmediatePropagationStopped() ) {
-
-                // Triggered event must either 1) have no namespace, or 2) have namespace(s)
-                // a subset or equal to those in the bound event (both can have no namespace).
-                if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {
-
-                    event.handleObj = handleObj;
-                    event.data = handleObj.data;
-
-                    ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
-                        handleObj.handler ).apply( matched.elem, args );
-
-                    if ( ret !== undefined ) {
-                        if ( ( event.result = ret ) === false ) {
-                            event.preventDefault();
-                            event.stopPropagation();
-                        }
-                    }
-                }
-            }
-        }
-
-        // Call the postDispatch hook for the mapped type
-        if ( special.postDispatch ) {
-            special.postDispatch.call( this, event );
-        }
-
-        return event.result;
-    },
-
-    handlers: function( event, handlers ) {
-        var i, matches, sel, handleObj,
-            handlerQueue = [],
-            delegateCount = handlers.delegateCount,
-            cur = event.target;
-
-        // Support (at least): Chrome, IE9
-        // Find delegate handlers
-        // Black-hole SVG <use> instance trees (#13180)
-        //
-        // Support: Firefox<=42+
-        // Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343)
-        if ( delegateCount && cur.nodeType &&
-            ( event.type !== "click" || isNaN( event.button ) || event.button < 1 ) ) {
-
-            for ( ; cur !== this; cur = cur.parentNode || this ) {
-
-                // Don't check non-elements (#13208)
-                // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
-                if ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== "click" ) ) {
-                    matches = [];
-                    for ( i = 0; i < delegateCount; i++ ) {
-                        handleObj = handlers[ i ];
-
-                        // Don't conflict with Object.prototype properties (#13203)
-                        sel = handleObj.selector + " ";
-
-                        if ( matches[ sel ] === undefined ) {
-                            matches[ sel ] = handleObj.needsContext ?
-                                jQuery( sel, this ).index( cur ) > -1 :
-                                jQuery.find( sel, this, null, [ cur ] ).length;
-                        }
-                        if ( matches[ sel ] ) {
-                            matches.push( handleObj );
-                        }
-                    }
-                    if ( matches.length ) {
-                        handlerQueue.push( { elem: cur, handlers: matches } );
-                    }
-                }
-            }
-        }
-
-        // Add the remaining (directly-bound) handlers
-        if ( delegateCount < handlers.length ) {
-            handlerQueue.push( { elem: this, handlers: handlers.slice( delegateCount ) } );
-        }
-
-        return handlerQueue;
-    },
-
-    // Includes some event props shared by KeyEvent and MouseEvent
-    props: ( "altKey bubbles cancelable ctrlKey currentTarget detail eventPhase " +
-        "metaKey relatedTarget shiftKey target timeStamp view which" ).split( " " ),
-
-    fixHooks: {},
-
-    keyHooks: {
-        props: "char charCode key keyCode".split( " " ),
-        filter: function( event, original ) {
-
-            // Add which for key events
-            if ( event.which == null ) {
-                event.which = original.charCode != null ? original.charCode : original.keyCode;
-            }
-
-            return event;
-        }
-    },
-
-    mouseHooks: {
-        props: ( "button buttons clientX clientY offsetX offsetY pageX pageY " +
-            "screenX screenY toElement" ).split( " " ),
-        filter: function( event, original ) {
-            var eventDoc, doc, body,
-                button = original.button;
-
-            // Calculate pageX/Y if missing and clientX/Y available
-            if ( event.pageX == null && original.clientX != null ) {
-                eventDoc = event.target.ownerDocument || document;
-                doc = eventDoc.documentElement;
-                body = eventDoc.body;
-
-                event.pageX = original.clientX +
-                    ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) -
-                    ( doc && doc.clientLeft || body && body.clientLeft || 0 );
-                event.pageY = original.clientY +
-                    ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) -
-                    ( doc && doc.clientTop  || body && body.clientTop  || 0 );
-            }
-
-            // Add which for click: 1 === left; 2 === middle; 3 === right
-            // Note: button is not normalized, so don't use it
-            if ( !event.which && button !== undefined ) {
-                event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
-            }
-
-            return event;
-        }
-    },
-
-    fix: function( event ) {
-        if ( event[ jQuery.expando ] ) {
-            return event;
-        }
-
-        // Create a writable copy of the event object and normalize some properties
-        var i, prop, copy,
-            type = event.type,
-            originalEvent = event,
-            fixHook = this.fixHooks[ type ];
-
-        if ( !fixHook ) {
-            this.fixHooks[ type ] = fixHook =
-                rmouseEvent.test( type ) ? this.mouseHooks :
-                rkeyEvent.test( type ) ? this.keyHooks :
-                {};
-        }
-        copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
-
-        event = new jQuery.Event( originalEvent );
-
-        i = copy.length;
-        while ( i-- ) {
-            prop = copy[ i ];
-            event[ prop ] = originalEvent[ prop ];
-        }
-
-        // Support: Cordova 2.5 (WebKit) (#13255)
-        // All events should have a target; Cordova deviceready doesn't
-        if ( !event.target ) {
-            event.target = document;
-        }
-
-        // Support: Safari 6.0+, Chrome<28
-        // Target should not be a text node (#504, #13143)
-        if ( event.target.nodeType === 3 ) {
-            event.target = event.target.parentNode;
-        }
-
-        return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
-    },
-
-    special: {
-        load: {
-
-            // Prevent triggered image.load events from bubbling to window.load
-            noBubble: true
-        },
-        focus: {
-
-            // Fire native event if possible so blur/focus sequence is correct
-            trigger: function() {
-                if ( this !== safeActiveElement() && this.focus ) {
-                    this.focus();
-                    return false;
-                }
-            },
-            delegateType: "focusin"
-        },
-        blur: {
-            trigger: function() {
-                if ( this === safeActiveElement() && this.blur ) {
-                    this.blur();
-                    return false;
-                }
-            },
-            delegateType: "focusout"
-        },
-        click: {
-
-            // For checkbox, fire native event so checked state will be right
-            trigger: function() {
-                if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) {
-                    this.click();
-                    return false;
-                }
-            },
-
-            // For cross-browser consistency, don't fire native .click() on links
-            _default: function( event ) {
-                return jQuery.nodeName( event.target, "a" );
-            }
-        },
-
-        beforeunload: {
-            postDispatch: function( event ) {
-
-                // Support: Firefox 20+
-                // Firefox doesn't alert if the returnValue field is not set.
-                if ( event.result !== undefined && event.originalEvent ) {
-                    event.originalEvent.returnValue = event.result;
-                }
-            }
-        }
-    }
-};
-
-jQuery.removeEvent = function( elem, type, handle ) {
-
-    // This "if" is needed for plain objects
-    if ( elem.removeEventListener ) {
-        elem.removeEventListener( type, handle );
-    }
-};
-
-jQuery.Event = function( src, props ) {
-
-    // Allow instantiation without the 'new' keyword
-    if ( !( this instanceof jQuery.Event ) ) {
-        return new jQuery.Event( src, props );
-    }
-
-    // Event object
-    if ( src && src.type ) {
-        this.originalEvent = src;
-        this.type = src.type;
-
-        // Events bubbling up the document may have been marked as prevented
-        // by a handler lower down the tree; reflect the correct value.
-        this.isDefaultPrevented = src.defaultPrevented ||
-                src.defaultPrevented === undefined &&
-
-                // Support: Android<4.0
-                src.returnValue === false ?
-            returnTrue :
-            returnFalse;
-
-    // Event type
-    } else {
-        this.type = src;
-    }
-
-    // Put explicitly provided properties onto the event object
-    if ( props ) {
-        jQuery.extend( this, props );
-    }
-
-    // Create a timestamp if incoming event doesn't have one
-    this.timeStamp = src && src.timeStamp || jQuery.now();
-
-    // Mark it as fixed
-    this[ jQuery.expando ] = true;
-};
-
-// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
-// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
-jQuery.Event.prototype = {
-    constructor: jQuery.Event,
-    isDefaultPrevented: returnFalse,
-    isPropagationStopped: returnFalse,
-    isImmediatePropagationStopped: returnFalse,
-    isSimulated: false,
-
-    preventDefault: function() {
-        var e = this.originalEvent;
-
-        this.isDefaultPrevented = returnTrue;
-
-        if ( e && !this.isSimulated ) {
-            e.preventDefault();
-        }
-    },
-    stopPropagation: function() {
-        var e = this.originalEvent;
-
-        this.isPropagationStopped = returnTrue;
-
-        if ( e && !this.isSimulated ) {
-            e.stopPropagation();
-        }
-    },
-    stopImmediatePropagation: function() {
-        var e = this.originalEvent;
-
-        this.isImmediatePropagationStopped = returnTrue;
-
-        if ( e && !this.isSimulated ) {
-            e.stopImmediatePropagation();
-        }
-
-        this.stopPropagation();
-    }
-};
-
-// Create mouseenter/leave events using mouseover/out and event-time checks
-// so that event delegation works in jQuery.
-// Do the same for pointerenter/pointerleave and pointerover/pointerout
-//
-// Support: Safari 7 only
-// Safari sends mouseenter too often; see:
-// https://code.google.com/p/chromium/issues/detail?id=470258
-// for the description of the bug (it existed in older Chrome versions as well).
-jQuery.each( {
-    mouseenter: "mouseover",
-    mouseleave: "mouseout",
-    pointerenter: "pointerover",
-    pointerleave: "pointerout"
-}, function( orig, fix ) {
-    jQuery.event.special[ orig ] = {
-        delegateType: fix,
-        bindType: fix,
-
-        handle: function( event ) {
-            var ret,
-                target = this,
-                related = event.relatedTarget,
-                handleObj = event.handleObj;
-
-            // For mouseenter/leave call the handler if related is outside the target.
-            // NB: No relatedTarget if the mouse left/entered the browser window
-            if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
-                event.type = handleObj.origType;
-                ret = handleObj.handler.apply( this, arguments );
-                event.type = fix;
-            }
-            return ret;
-        }
-    };
-} );
-
-jQuery.fn.extend( {
-    on: function( types, selector, data, fn ) {
-        return on( this, types, selector, data, fn );
-    },
-    one: function( types, selector, data, fn ) {
-        return on( this, types, selector, data, fn, 1 );
-    },
-    off: function( types, selector, fn ) {
-        var handleObj, type;
-        if ( types && types.preventDefault && types.handleObj ) {
-
-            // ( event )  dispatched jQuery.Event
-            handleObj = types.handleObj;
-            jQuery( types.delegateTarget ).off(
-                handleObj.namespace ?
-                    handleObj.origType + "." + handleObj.namespace :
-                    handleObj.origType,
-                handleObj.selector,
-                handleObj.handler
-            );
-            return this;
-        }
-        if ( typeof types === "object" ) {
-
-            // ( types-object [, selector] )
-            for ( type in types ) {
-                this.off( type, selector, types[ type ] );
-            }
-            return this;
-        }
-        if ( selector === false || typeof selector === "function" ) {
-
-            // ( types [, fn] )
-            fn = selector;
-            selector = undefined;
-        }
-        if ( fn === false ) {
-            fn = returnFalse;
-        }
-        return this.each( function() {
-            jQuery.event.remove( this, types, fn, selector );
-        } );
-    }
-} );
-
-
-var
-    rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,
-
-    // Support: IE 10-11, Edge 10240+
-    // In IE/Edge using regex groups here causes severe slowdowns.
-    // See https://connect.microsoft.com/IE/feedback/details/1736512/
-    rnoInnerhtml = /<script|<style|<link/i,
-
-    // checked="checked" or checked
-    rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
-    rscriptTypeMasked = /^true\/(.*)/,
-    rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
-
-// Manipulating tables requires a tbody
-function manipulationTarget( elem, content ) {
-    return jQuery.nodeName( elem, "table" ) &&
-        jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ?
-
-        elem.getElementsByTagName( "tbody" )[ 0 ] ||
-            elem.appendChild( elem.ownerDocument.createElement( "tbody" ) ) :
-        elem;
-}
-
-// Replace/restore the type attribute of script elements for safe DOM manipulation
-function disableScript( elem ) {
-    elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;
-    return elem;
-}
-function restoreScript( elem ) {
-    var match = rscriptTypeMasked.exec( elem.type );
-
-    if ( match ) {
-        elem.type = match[ 1 ];
-    } else {
-        elem.removeAttribute( "type" );
-    }
-
-    return elem;
-}
-
-function cloneCopyEvent( src, dest ) {
-    var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
-
-    if ( dest.nodeType !== 1 ) {
-        return;
-    }
-
-    // 1. Copy private data: events, handlers, etc.
-    if ( dataPriv.hasData( src ) ) {
-        pdataOld = dataPriv.access( src );
-        pdataCur = dataPriv.set( dest, pdataOld );
-        events = pdataOld.events;
-
-        if ( events ) {
-            delete pdataCur.handle;
-            pdataCur.events = {};
-
-            for ( type in events ) {
-                for ( i = 0, l = events[ type ].length; i < l; i++ ) {
-                    jQuery.event.add( dest, type, events[ type ][ i ] );
-                }
-            }
-        }
-    }
-
-    // 2. Copy user data
-    if ( dataUser.hasData( src ) ) {
-        udataOld = dataUser.access( src );
-        udataCur = jQuery.extend( {}, udataOld );
-
-        dataUser.set( dest, udataCur );
-    }
-}
-
-// Fix IE bugs, see support tests
-function fixInput( src, dest ) {
-    var nodeName = dest.nodeName.toLowerCase();
-
-    // Fails to persist the checked state of a cloned checkbox or radio button.
-    if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
-        dest.checked = src.checked;
-
-    // Fails to return the selected option to the default selected state when cloning options
-    } else if ( nodeName === "input" || nodeName === "textarea" ) {
-        dest.defaultValue = src.defaultValue;
-    }
-}
-
-function domManip( collection, args, callback, ignored ) {
-
-    // Flatten any nested arrays
-    args = concat.apply( [], args );
-
-    var fragment, first, scripts, hasScripts, node, doc,
-        i = 0,
-        l = collection.length,
-        iNoClone = l - 1,
-        value = args[ 0 ],
-        isFunction = jQuery.isFunction( value );
-
-    // We can't cloneNode fragments that contain checked, in WebKit
-    if ( isFunction ||
-            ( l > 1 && typeof value === "string" &&
-                !support.checkClone && rchecked.test( value ) ) ) {
-        return collection.each( function( index ) {
-            var self = collection.eq( index );
-            if ( isFunction ) {
-                args[ 0 ] = value.call( this, index, self.html() );
-            }
-            domManip( self, args, callback, ignored );
-        } );
-    }
-
-    if ( l ) {
-        fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
-        first = fragment.firstChild;
-
-        if ( fragment.childNodes.length === 1 ) {
-            fragment = first;
-        }
-
-        // Require either new content or an interest in ignored elements to invoke the callback
-        if ( first || ignored ) {
-            scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
-            hasScripts = scripts.length;
-
-            // Use the original fragment for the last item
-            // instead of the first because it can end up
-            // being emptied incorrectly in certain situations (#8070).
-            for ( ; i < l; i++ ) {
-                node = fragment;
-
-                if ( i !== iNoClone ) {
-                    node = jQuery.clone( node, true, true );
-
-                    // Keep references to cloned scripts for later restoration
-                    if ( hasScripts ) {
-
-                        // Support: Android<4.1, PhantomJS<2
-                        // push.apply(_, arraylike) throws on ancient WebKit
-                        jQuery.merge( scripts, getAll( node, "script" ) );
-                    }
-                }
-
-                callback.call( collection[ i ], node, i );
-            }
-
-            if ( hasScripts ) {
-                doc = scripts[ scripts.length - 1 ].ownerDocument;
-
-                // Reenable scripts
-                jQuery.map( scripts, restoreScript );
-
-                // Evaluate executable scripts on first document insertion
-                for ( i = 0; i < hasScripts; i++ ) {
-                    node = scripts[ i ];
-                    if ( rscriptType.test( node.type || "" ) &&
-                        !dataPriv.access( node, "globalEval" ) &&
-                        jQuery.contains( doc, node ) ) {
-
-                        if ( node.src ) {
-
-                            // Optional AJAX dependency, but won't run scripts if not present
-                            if ( jQuery._evalUrl ) {
-                                jQuery._evalUrl( node.src );
-                            }
-                        } else {
-                            jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) );
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    return collection;
-}
-
-function remove( elem, selector, keepData ) {
-    var node,
-        nodes = selector ? jQuery.filter( selector, elem ) : elem,
-        i = 0;
-
-    for ( ; ( node = nodes[ i ] ) != null; i++ ) {
-        if ( !keepData && node.nodeType === 1 ) {
-            jQuery.cleanData( getAll( node ) );
-        }
-
-        if ( node.parentNode ) {
-            if ( keepData && jQuery.contains( node.ownerDocument, node ) ) {
-                setGlobalEval( getAll( node, "script" ) );
-            }
-            node.parentNode.removeChild( node );
-        }
-    }
-
-    return elem;
-}
-
-jQuery.extend( {
-    htmlPrefilter: function( html ) {
-        return html.replace( rxhtmlTag, "<$1></$2>" );
-    },
-
-    clone: function( elem, dataAndEvents, deepDataAndEvents ) {
-        var i, l, srcElements, destElements,
-            clone = elem.cloneNode( true ),
-            inPage = jQuery.contains( elem.ownerDocument, elem );
-
-        // Fix IE cloning issues
-        if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
-                !jQuery.isXMLDoc( elem ) ) {
-
-            // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
-            destElements = getAll( clone );
-            srcElements = getAll( elem );
-
-            for ( i = 0, l = srcElements.length; i < l; i++ ) {
-                fixInput( srcElements[ i ], destElements[ i ] );
-            }
-        }
-
-        // Copy the events from the original to the clone
-        if ( dataAndEvents ) {
-            if ( deepDataAndEvents ) {
-                srcElements = srcElements || getAll( elem );
-                destElements = destElements || getAll( clone );
-
-                for ( i = 0, l = srcElements.length; i < l; i++ ) {
-                    cloneCopyEvent( srcElements[ i ], destElements[ i ] );
-                }
-            } else {
-                cloneCopyEvent( elem, clone );
-            }
-        }
-
-        // Preserve script evaluation history
-        destElements = getAll( clone, "script" );
-        if ( destElements.length > 0 ) {
-            setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
-        }
-
-        // Return the cloned set
-        return clone;
-    },
-
-    cleanData: function( elems ) {
-        var data, elem, type,
-            special = jQuery.event.special,
-            i = 0;
-
-        for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {
-            if ( acceptData( elem ) ) {
-                if ( ( data = elem[ dataPriv.expando ] ) ) {
-                    if ( data.events ) {
-                        for ( type in data.events ) {
-                            if ( special[ type ] ) {
-                                jQuery.event.remove( elem, type );
-
-                            // This is a shortcut to avoid jQuery.event.remove's overhead
-                            } else {
-                                jQuery.removeEvent( elem, type, data.handle );
-                            }
-                        }
-                    }
-
-                    // Support: Chrome <= 35-45+
-                    // Assign undefined instead of using delete, see Data#remove
-                    elem[ dataPriv.expando ] = undefined;
-                }
-                if ( elem[ dataUser.expando ] ) {
-
-                    // Support: Chrome <= 35-45+
-                    // Assign undefined instead of using delete, see Data#remove
-                    elem[ dataUser.expando ] = undefined;
-                }
-            }
-        }
-    }
-} );
-
-jQuery.fn.extend( {
-
-    // Keep domManip exposed until 3.0 (gh-2225)
-    domManip: domManip,
-
-    detach: function( selector ) {
-        return remove( this, selector, true );
-    },
-
-    remove: function( selector ) {
-        return remove( this, selector );
-    },
-
-    text: function( value ) {
-        return access( this, function( value ) {
-            return value === undefined ?
-                jQuery.text( this ) :
-                this.empty().each( function() {
-                    if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
-                        this.textContent = value;
-                    }
-                } );
-        }, null, value, arguments.length );
-    },
-
-    append: function() {
-        return domManip( this, arguments, function( elem ) {
-            if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
-                var target = manipulationTarget( this, elem );
-                target.appendChild( elem );
-            }
-        } );
-    },
-
-    prepend: function() {
-        return domManip( this, arguments, function( elem ) {
-            if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
-                var target = manipulationTarget( this, elem );
-                target.insertBefore( elem, target.firstChild );
-            }
-        } );
-    },
-
-    before: function() {
-        return domManip( this, arguments, function( elem ) {
-            if ( this.parentNode ) {
-                this.parentNode.insertBefore( elem, this );
-            }
-        } );
-    },
-
-    after: function() {
-        return domManip( this, arguments, function( elem ) {
-            if ( this.parentNode ) {
-                this.parentNode.insertBefore( elem, this.nextSibling );
-            }
-        } );
-    },
-
-    empty: function() {
-        var elem,
-            i = 0;
-
-        for ( ; ( elem = this[ i ] ) != null; i++ ) {
-            if ( elem.nodeType === 1 ) {
-
-                // Prevent memory leaks
-                jQuery.cleanData( getAll( elem, false ) );
-
-                // Remove any remaining nodes
-                elem.textContent = "";
-            }
-        }
-
-        return this;
-    },
-
-    clone: function( dataAndEvents, deepDataAndEvents ) {
-        dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
-        deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
-
-        return this.map( function() {
-            return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
-        } );
-    },
-
-    html: function( value ) {
-        return access( this, function( value ) {
-            var elem = this[ 0 ] || {},
-                i = 0,
-                l = this.length;
-
-            if ( value === undefined && elem.nodeType === 1 ) {
-                return elem.innerHTML;
-            }
-
-            // See if we can take a shortcut and just use innerHTML
-            if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
-                !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
-
-                value = jQuery.htmlPrefilter( value );
-
-                try {
-                    for ( ; i < l; i++ ) {
-                        elem = this[ i ] || {};
-
-                        // Remove element nodes and prevent memory leaks
-                        if ( elem.nodeType === 1 ) {
-                            jQuery.cleanData( getAll( elem, false ) );
-                            elem.innerHTML = value;
-                        }
-                    }
-
-                    elem = 0;
-
-                // If using innerHTML throws an exception, use the fallback method
-                } catch ( e ) {}
-            }
-
-            if ( elem ) {
-                this.empty().append( value );
-            }
-        }, null, value, arguments.length );
-    },
-
-    replaceWith: function() {
-        var ignored = [];
-
-        // Make the changes, replacing each non-ignored context element with the new content
-        return domManip( this, arguments, function( elem ) {
-            var parent = this.parentNode;
-
-            if ( jQuery.inArray( this, ignored ) < 0 ) {
-                jQuery.cleanData( getAll( this ) );
-                if ( parent ) {
-                    parent.replaceChild( elem, this );
-                }
-            }
-
-        // Force callback invocation
-        }, ignored );
-    }
-} );
-
-jQuery.each( {
-    appendTo: "append",
-    prependTo: "prepend",
-    insertBefore: "before",
-    insertAfter: "after",
-    replaceAll: "replaceWith"
-}, function( name, original ) {
-    jQuery.fn[ name ] = function( selector ) {
-        var elems,
-            ret = [],
-            insert = jQuery( selector ),
-            last = insert.length - 1,
-            i = 0;
-
-        for ( ; i <= last; i++ ) {
-            elems = i === last ? this : this.clone( true );
-            jQuery( insert[ i ] )[ original ]( elems );
-
-            // Support: QtWebKit
-            // .get() because push.apply(_, arraylike) throws
-            push.apply( ret, elems.get() );
-        }
-
-        return this.pushStack( ret );
-    };
-} );
-
-
-var iframe,
-    elemdisplay = {
-
-        // Support: Firefox
-        // We have to pre-define these values for FF (#10227)
-        HTML: "block",
-        BODY: "block"
-    };
-
-/**
- * Retrieve the actual display of a element
- * @param {String} name nodeName of the element
- * @param {Object} doc Document object
- */
-
-// Called only from within defaultDisplay
-function actualDisplay( name, doc ) {
-    var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
-
-        display = jQuery.css( elem[ 0 ], "display" );
-
-    // We don't have any data stored on the element,
-    // so