[
  {
    "path": ".gitignore",
    "content": "# MacOSX\n.DS_Store\n\n# Logs\nlogs\n*.log\n\n# Runtime data\npids\n*.pid\n*.seed\n\n# Directory for instrumented libs generated by jscoverage/JSCover\nlib-cov\n\n# Coverage directory used by tools like istanbul\ncoverage\n\n# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)\n.grunt\n\n# Compiled binary addons (http://nodejs.org/api/addons.html)\nbuild/Release\n\n# Dependency directory\n# Deployed apps should consider commenting this line out:\n# see https://npmjs.org/doc/faq.html#Should-I-check-my-node_modules-folder-into-git\nnode_modules\n\nall.json\npackage-lock.json\n*.swp\nconnect.sh\nlocal-config.js\n.tern-port\n*~\n"
  },
  {
    "path": ".jshintrc",
    "content": "{\n  // Details: https://github.com/victorporof/Sublime-JSHint#using-your-own-jshintrc-options\n  // Example: https://github.com/jshint/jshint/blob/master/examples/.jshintrc\n  // Documentation: http://www.jshint.com/docs/\n  \"node\": true,\n  \"esnext\": true,\n  \"globals\": {\"escape\": true},\n  \"globalstrict\": true,\n  \"quotmark\": true,\n  \"smarttabs\": true,\n  \"trailing\": true,\n  \"undef\": true,\n  \"unused\": true\n}\n"
  },
  {
    "path": ".travis.yml",
    "content": "language: node_js\n\n# test on current node.js versions\nnode_js:\n  - 8\n  - 10\n\n# configure notifications (email, IRC, campfire etc)\n# please update this section to your needs!\n#notifications:\n#  irc: \"irc.freenode.org#travis\"\n\n"
  },
  {
    "path": "Gruntfile.js",
    "content": "'use strict';\n\nmodule.exports = function(grunt) {\n    grunt.initConfig({\n        jshint: {\n            files: [\n                '*.js',\n                'lib/*.js',\n                'lib/factors/*.js',\n                'bin/*.js'\n            ],\n            options: {\n                // use closest-through-parent jshint configuration file\n                jshintrc: true\n            }\n        }\n    });\n    grunt.loadNpmTasks('grunt-contrib-jshint');\n    grunt.registerTask('default', ['jshint']);\n};"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2014 Alex Fernández\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."
  },
  {
    "path": "README.md",
    "content": "[![Package quality](https://packagequality.com/shield/package-quality.svg)](https://packagequality.com/#?package=package-quality)\n[![Build Status](https://secure.travis-ci.org/alexfernandez/package-quality.svg)](http://travis-ci.org/alexfernandez/package-quality)\n\n[![Package quality](https://packagequality.com/badge/package-quality.png)](https://packagequality.com/#?package=package-quality)\n\n# package-quality\n\nMeasurements of quality for packages, initially for npm.\n\n## Add Your Badge\n\nTo show the quality of your npm package, just add one of these images to your GitHub README:\n\n```\n[![Package quality](https://packagequality.com/shield/yourpackage.svg)](https://packagequality.com/#?package=yourpackage)\n[![Package quality](https://packagequality.com/badge/yourpackage.png)](https://packagequality.com/#?package=yourpackage)\n```\n\nOr, in HTML markup:\n\n```\n<a href=\"https://packagequality.com/#?package=yourpackage\"><img src=\"https://packagequality.com/badge/yourpackage.png\"/></a>\n<a href=\"https://packagequality.com/#?package=yourpackage\"><img src=\"https://packagequality.com/shield/yourpackage.svg\"/></a>\n```\n\nreplacing `yourpackage` with (surprise!) the name of your package.\nYou can choose between badge or mini-badge; the latter is courtesy of [shields.io](https://shields.io).\n\n## Measuring Quality\n\nAny objective measurements of quality are going to be flawed one way or another.\n`package-quality` only attempts to give some indications about quality,\nnot be an absolute rating on which to bet your farm.\nIf you don't agree with our ratings, please [help us improve them](https://github.com/alexfernandez/package-quality/pulls)!\n\n### Algorithm\n\nThe following factors are considered when calculating the quality of a package:\n  - Versions quality (v): the more versions a package has, the more quality it is. We calculate v as ```v=1-1/total_number_of_versions```\n  - Downloads quality (d): the more downloads a package has, the more quality is it. We calculate d as ```d=1-1/number_of_downloads_last_year```\n  - Repo quality (r): if the package has no repo, the value of r is zero. Right now (there is an issue open to fix this), if the package does not have repo on Github, it's given ```r=0```. For those packages with a repo on Github, r is calculated considering these three factors:\n    - Total factor (rt), calculated as ```rt=1-1/total_number_of_issues```\n    - Open factor (ro): we consider \"healthy\" to have a 20% of open issues in your repo (20% of the total number of issues). Those packages with 20% or less open issues will have ```ro=1```. For those with more than 20%, ```ro=1.2-open_issues/total_number_of_issues```\n    - Long open factor (rlo): we consider long open issues those who have been open more that 1 year and are still open today. This factor is calculated as ```rlo=1-long_open_issues/total_number_of_issues```. If a package has no open issues, then ```rlo=1```.\n\nThe repo quality r is calculated as the average of rt, ro and rlo: ```r=(rt+ro+rlo)/3```.\n\nThe overall quality of a package is ```q=v*d*r```.\n\n### How to Understand Star Ratings\n\n[![By xkcd](http://imgs.xkcd.com/comics/star_ratings.png)](http://xkcd.com/1098/)\n\nJust joking.\nNew packages will always appear with low stars, until they get enough momentum.\nAlso, packages that \"just work\" and get no issues will be underrated by our system.\n\n### Other Package Managers\n\nRight now the quality is computed only for npm packages.\nBut it is trivial to extend the ratings to other package managers,\nsince there are only external measurements from GitHub and npm:\nwe don't even look at the code.\n\nIf you want to extend package-quality to a new package manager,\nyou just need:\n\n* a complete list of packages,\n* and some way to get the downloads per year.\n\n[Let us know](mailto:alexfernandeznpm@gmail.com) and we will set up a new subdomain.\n\n## Help Wanted\n\nThe following areas are a work in progress:\n\n* Improve the existing ratings.\n* Take other parameters into account, such as a working or broken Travis-CI build.\n* Extend to other package managers (see above).\n* Just let us know what you don't like about our project.\n\n[Just send mail](mailto:alexfernandeznpm@gmail.com) or, even better, a pull request.\n\n## License (The MIT License)\n\nCopyright (c) 2014-2015 Alex Fernández <alexfernandeznpm@gmail.com>,\n[Diego Lafuente](https://github.com/tufosa),\nSergio García Mondaray <sgmonda@gmail.com>\nand [contributors](https://github.com/alexfernandez/package-quality/graphs/contributors).\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n"
  },
  {
    "path": "app/badge.html",
    "content": "<img src=\"/badge/stdio.png\"/>\n"
  },
  {
    "path": "app/css/style.css",
    "content": ".package-share img {\n  display:block;\n  margin:auto;\n}\n\n.package-share input {\n  display: block;\n  width: 100%;\n  margin: 0 0 15px;\n  padding: 8px;\n  font-family: Menlo, Monaco, Courier, monospace;\n  font-size: 13px;\n  line-height: 1.72222;\n  color: inherit;\n  vertical-align: top;\n  cursor: text;\n  background-color: rgb(255, 255, 255);\n  border: 2px solid rgb(231, 233, 236);\n  border-radius: 6px;\n}\n"
  },
  {
    "path": "app/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" ng-app=\"PackageQuality\">\n\n\t<head>\n\t\t<meta charset=\"UTF-8\"/>\n\t\t<title>Package Quality</title>\n\n\t\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"/>\n\t\t<meta name=\"description\" content=\"\"/>\n\t\t<meta name=\"author\" content=\"\"/>\n\t\t<link rel=\"icon\" href=\"/favicon.ico\"/>\n\n\t\t<link rel=\"stylesheet\" href=\"css/style.css\" media=\"screen\" type=\"text/css\"/>\n\t\t<link rel=\"stylesheet\" href=\"//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css\"/>\n\t\t<link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css\"/>\n\t\t<link rel=\"stylesheet\" href=\"lib/flat-ui/css/flat-ui.min.css\"/>\n\t</head>\n\n\t<body ng-controller=\"MainController\" style=\"padding-top: 3em; padding-bottom: 3em\" class=\"container\">\n\n\t\t<!-- logo -->\n\n\t\t<div class=\"row\">\n\t\t\t<div class=\"col-lg-4 col-lg-offset-4 col-md-4 col-md-offset-4 col-sm-6 col-sm-offset-3 col-xs-10 col-xs-offset-1\">\n\t\t\t\t<img src=\"img/logo.png\" alt=\"Package\" style=\"display: block; margin: 1em auto; height: 7em\"/>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<!-- Fork me button -->\n\n\t\t<a href=\"https://github.com/alexfernandez/package-quality\" target=\"_blank\" style=\"position: fixed; top: 0; right: 0\" class=\"hidden-xs\">\n\t\t\t<img src=\"/img/forkme.png\"/>\n\t\t</a>\n\n\t\t<!-- Search box -->\n\n\t\t<div class=\"row\">\n\t\t\t<div class=\"col-lg-4 col-lg-offset-4 col-md-4 col-md-offset-4 col-sm-6 col-sm-offset-3 col-xs-10 col-xs-offset-1 form-group has-feedback\">\n\t\t\t\t<input ng-disabled=\"isLoadingPackage\"\n\t\t\t\t\t   type=\"text\"\n\t\t\t\t\t   ng-model=\"query\"\n\t\t\t\t\t   ng-keyup=\"keyup($event.keyCode)\"\n\t\t\t\t\t   typeahead=\"package for package in autocompletablePackages | filter:$viewValue\"\n\t\t\t\t\t   typeahead-min-length=\"4\"\n\t\t\t\t\t   typeahead-wait-ms=\"1000\"\n\t\t\t\t\t   class=\"form-control\"\n\t\t\t\t\t   placeholder=\"Type a package name and press ENTER\"/>\n\t\t\t\t<span class=\"form-control-feedback\" style=\"padding-right: 2.5em; color: #777\" ng-show=\"isLoadingPackage\">\n\t\t\t\t\t<i class=\"fa fa-spinner fa-spin\"></i>\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<!-- Package stats -->\n\n\t\t<div class=\"row\" ng-if=\"package.notfound\">\n\t\t\t<div class=\"col-lg-4 col-lg-offset-4 col-md-4 col-md-offset-4 col-sm-6 col-sm-offset-3 col-xs-10 col-xs-offset-1\">\n\t\t\t\tPackage \"{{ package.query }}\" not found.\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div class=\"row\" ng-if=\"package && !package.notfound\" style=\"padding-bottom: 1em\">\n\t\t\t<div class=\"col-lg-4 col-lg-offset-4 col-md-4 col-md-offset-4 col-sm-6 col-sm-offset-3 col-xs-10 col-xs-offset-1\">\n\t\t\t\t<!--\n\t\t\t\t<input type=\"range\" ng-model=\"package.quality\" min=\"0\" max=\"1\" step=\"0.01\"/>\n\t\t\t\t-->\n\t\t\t\t<div style=\"margin-bottom: 0.5em\">\n\t\t\t\t\t<h4 style=\"margin-bottom: 0\">\n\t\t\t\t\t\t{{ package.name }}\n\t\t\t\t\t\t<span class=\"pull-right\" style=\"font-size: smaller\">\n\t\t\t\t\t\t\t<span ng-repeat=\"range in [[0, 1], [12, 25], [37, 50], [62, 75], [87, 99]]\">\n\t\t\t\t\t\t\t\t<span class=\"fa fa-star-o\" ng-if=\"package.quality * 100 < range[0]\"></span>\n\t\t\t\t\t\t\t\t<span class=\"fa fa-star-half-empty\" ng-if=\"package.quality * 100 >= range[0] && package.quality * 100 <= range[1]\"></span>\n\t\t\t\t\t\t\t\t<span class=\"fa fa-star\" ng-if=\"package.quality * 100 > range[1]\"></span>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</h4>\n\t\t\t\t\t<h7 ng-if=\"!packageUrl(package)\">Package from <b>{{ package.source }}</b></h7>\n\t\t\t\t\t<h7 ng-if=\"packageUrl(package)\">Package from <a ng-href=\"{{ packageUrl(package) }}\"><b>{{ package.source }}</b></a></h7>\n\t\t\t\t</div>\n\t\t\t\t<p>{{ package.description }}</p>\n\n\t\t\t\t<div style=\"margin: 1.5em 0\">\n\n\t\t\t\t\t<div>\n\t\t\t\t\t\tPackage quality\n\t\t\t\t\t\t<span class=\"pull-right\">\n\t\t\t\t\t\t\t{{ ((package.quality || 0) * 100).toFixed(2) }}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<div class=\"progress\">\n\t\t\t\t\t\t\t<div class=\"progress-bar\" style=\"width: {{ package.quality * 100}}%;\"></div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div ng-repeat=\"metric in metrics\">\n\t\t\t\t\t\t{{ metric.label }}\n\t\t\t\t\t\t<span class=\"pull-right\">\n\t\t\t\t\t\t\t{{ ((package[metric.key][0] || 0) * 100).toFixed(2) }}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<div class=\"progress\">\n\t\t\t\t\t\t\t<div class=\"progress-bar\" style=\"width: {{ package[metric.key][0] * 100}}%;\"></div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div class=\"row package-share\" ng-if=\"package && !package.notfound\">\n\t\t\t<div class=\"col-lg-4 col-lg-offset-4 col-md-4 col-md-offset-4 col-sm-6 col-sm-offset-3 col-xs-10 col-xs-offset-1\">\n\t\t\t\t<hr>\n\n\t\t\t\t<h5>\n\t\t\t\t\tShare this package\n\t\t\t\t</h5>\n\t\t\t\t<p>\n\t\t\t\t\tUse the following snippets to share this package quality:\n\t\t\t\t</p>\n\t\t\t\t<img ng-src=\"{{ genShieldUrl(package) }}\"/>\n\n\t\t\t\t<img ng-src=\"{{ genBadgeUrl(package) }}\"/>\n\n\t\t\t\t<div ng-repeat=\"format in shareFormats\">\n\t\t\t\t\t<small ng-bind=\"format.title\"></small>\n\t\t\t\t\t<input readonly ng-value=\"format.markup(package)\" select-on-click/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div class=\"row\" ng-if=\"DEBUG && package\">\n\t\t\t<div class=\"col-lg-4 col-lg-offset-4 col-md-4 col-md-offset-4 col-sm-6 col-sm-offset-3 col-xs-10 col-xs-offset-1\">\n\t\t\t\t<h6>Debug info</h6>\n\t\t\t\t<pre>{{ package | json }}</pre>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<script src=\"//ajax.googleapis.com/ajax/libs/angularjs/1.3.6/angular.min.js\"></script>\n\t\t<script src=\"//ajax.googleapis.com/ajax/libs/angularjs/1.3.6/angular-animate.min.js\"></script>\n\t\t<script src=\"//ajax.googleapis.com/ajax/libs/angularjs/1.3.6/angular-aria.min.js\"></script>\n\t\t<script src=\"https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js\"></script>\n\t\t<script src=\"lib/flat-ui/js/flat-ui.min.js\"></script>\n\t\t<script src=\"js/main.js\"></script>\n\t\t<script src=\"lib/angular-ui/ui-bootstrap-tpls-0.9.0.min.js\"></script>\n\n\t\t<!-- LibreCounter -->\n\t\t<div class=\"row\" style=\"display: flex; justify-content: center;\">\n\t\t\t<a href=\"https://librecounter.org/packagequality.com/show\">\n\t\t\t\t<img src=\"https://librecounter.org/counter.svg\" referrerPolicy=\"unsafe-url\" width=\"64px\">\n\t\t\t</a>\n\t\t</div>\n\t</body>\n</html>\n"
  },
  {
    "path": "app/js/main.js",
    "content": "/*global angular, $*/\n\nvar app = angular.module('PackageQuality', ['ui.bootstrap']);\n\n/**\n * Packages HTTP access service\n **/\napp.factory('packages', ['$http', function ($http) {\n\t'use strict';\n\n\treturn {\n\t\tget: function (packageName, callback) {\n\t\t\tif (typeof packageName === 'function') {\n\t\t\t\tcallback = packageName;\n\t\t\t\tpackageName = null;\n\t\t\t}\n\t\t\tvar url = packageName ? '/package/' + packageName.replace(/\\//g, '%2F') : '/packages';\n\t\t\t$http.get(url).success(function (result) {\n\t\t\t\tcallback(null, result);\n\t\t\t}).error(function (description, status) {\n\t\t\t\tcallback({error: description, status: status});\n\t\t\t});\n\t\t}\n\t};\n}]);\n\n/**\n * Filter to transform dates into \"X days ago\" strings\n **/\napp.filter('timeAgo', function () {\n\t'use strict';\n\n\treturn function (date, attributesArray) {\n\n\t\tvar attributes = {};\n\t\tattributesArray.forEach(function (attr) {\n\t\t\tattributes[attr] = true;\n\t\t});\n\n\t\tif (typeof date === 'string') {\n\t\t\tdate = new Date(Date.parse(date));\n\t\t}\n\t\tvar date2 = new Date();\n\t\tvar diff = date2 - date;\n\n\t\tvar msec = diff;\n\t\tvar YY = Math.floor(msec / 1000 / 60 / 60 / 24 / 365);\n\t\tmsec -= YY * 1000 * 60 * 60 * 24 * 365;\n\t\tvar MM = Math.floor(msec / 1000 / 60 / 60 / 24 / 30);\n\t\tmsec -= MM * 1000 * 60 * 60 * 24 * 30;\n\t\tvar DD = Math.floor(msec / 1000 / 60 / 60 / 24);\n\t\tmsec -= DD * 1000 * 60 * 60 * 24;\n\t\tvar hh = Math.floor(msec / 1000 / 60 / 60);\n\t\tmsec -= hh * 1000 * 60 * 60;\n\t\tvar mm = Math.floor(msec / 1000 / 60);\n\t\tmsec -= mm * 1000 * 60;\n\t\tvar ss = Math.floor(msec / 1000);\n\t\tmsec -= ss * 1000;\n\n\t\tvar timeStr = [\n\t\t\t((YY && (!attributes || attributes.years)) ? YY + ' years ': ''),\n\t\t\t((MM && (!attributes || attributes.months)) ? MM + ' months ': ''),\n\t\t\t((DD && (!attributes || attributes.days)) ? DD + ' days ': ''),\n\t\t\t((hh && (!attributes || attributes.hours)) ? hh + ' hours ': ''),\n\t\t\t((mm && (!attributes || attributes.minutes)) ? mm + ' minutes ' : ''),\n\t\t\t((ss && (!attributes || attributes.seconds)) ? ss + ' seconds ' : '')\n\t\t].join('');\n\t\tif (!timeStr) {\n\t\t\treturn 'today';\n\t\t}\n\t\treturn timeStr + ' ago';\n\t};\n});\n\n/**\n * Directive for auto selecting text in input fields\n **/\napp.directive('selectOnClick', function () {\n    return {\n        restrict: 'A',\n        link: function (scope, element, attrs) {\n            element.on('click', function () {\n                this.select();\n            });\n        }\n    };\n});\n\n/**\n * Main controller\n * This handles GUI components for packages search\n **/\napp.controller('MainController', ['$scope', '$location', 'packages', function($scope, $location, packages){\n\t'use strict';\n\n\t/**\n\t * Flags and main properties declaration\n\t **/\n\t$scope.query = null;\n\t$scope['package'] = null;\n\t$scope.DEBUG = $location.search().debug === 'true';\n\n\t/**\n\t * Autocompletable packages\n\t **/\n\t$scope.autocompletablePackages = ['hola', 'adios'];\n\tpackages.get(function (err, packages) {\n\t\tif (err || !Array.isArray(packages)) {\n\t\t\treturn;\n\t\t}\n\t\t$scope.autocompletablePackages = packages;\n\t\tconsole.log('Available packages ready!: %d packages', packages.length);\n\t});\n\n\t/**\n\t * When location changes\n\t **/\n\t$scope.$on('$locationChangeSuccess', function () {\n\t\tconsole.log('Location change! Arguments:', $location.search());\n\t\t$scope.query = $location.search()['package'];\n\t\tif ($scope.query) {\n\t\t\tloadPackage($location.search()['package']);\n\t\t}\n\t});\n\n\t/**\n\t * Available metrics\n\t **/\n\t$scope.metrics = [{\n\t\tkey: 'repoTotalIssues',\n\t\tlabel: 'Total issues'\n\t}, {\n\t\tkey: 'repoOpenIssues',\n\t\tlabel: 'Open issues'\n\t}, {\n\t\tkey: 'repoLongOpenIssues',\n\t\tlabel: 'Long open issues'\n\t}, {\n\t\tkey: 'versions',\n\t\tlabel: 'Versions quality'\n\t}, {\n\t\tkey: 'downloads',\n\t\tlabel: 'Downloads quality'\n\t}];\n\n\t/**\n\t * Retrieve the package info through HTTP\n\t **/\n\tfunction loadPackage(packageName) {\n\t\t$scope.isLoadingPackage = true;\n\t\tpackages.get(packageName, function (err, result) {\n\t\t\t$scope.isLoadingPackage = false;\n\t\t\tif (err) {\n\t\t\t\t$scope['package'] = {query: packageName, notfound: true};\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t$scope['package'] = result;\n\t\t});\n\t}\n\n\t/**\n\t * Enter press event handler. Changes the location to start a search\n\t **/\n\t$scope.keyup = function (keyCode) {\n\t\tvar isEnter = (keyCode === 13);\n\t\tif (!isEnter) {\n\t\t\treturn;\n\t\t}\n\t\tvar args = {};\n\t\tif ($scope.query) {\n\t\t\targs['package'] = $scope.query;\n\t\t}\n\t\tif ($scope.DEBUG) {\n\t\t\targs.debug = 'true';\n\t\t}\n\t\t$location.search(args);\n\t};\n\n\t/**\n\t * URLs\n\t **/\n\t// TODO: this should be a property on the package\n\t$scope.siteUrl = function (pkg) {\n\t\treturn 'https://packagequality.com/#?package=' + encodeURIComponent(pkg.name);\n\t};\n\t$scope.packageUrl = function (pkg) {\n\t\tif (pkg.source !== 'npm') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn 'https://www.npmjs.com/package/' + encodeURIComponent(pkg.name);\n\t};\n\n\t/**\n\t * Badges\n\t **/\n\t// TODO: this should probably be generated on the backend and passed down as a property\n\t$scope.genBadgeUrl = function (pkg) {\n\t\treturn ['https://packagequality.com/badge/', encodeURIComponent(pkg.name), '.png'].join('');\n\t};\n\t$scope.genShieldUrl = function (pkg) {\n\t\treturn ['https://packagequality.com/shield/', encodeURIComponent(pkg.name), '.svg'].join('');\n\t};\n\t$scope.shareFormats = [\n\t\t{\n\t\t\ttitle: 'Image',\n\t\t\tmarkup: $scope.genBadgeUrl\n\t\t}, {\n\t\t\ttitle: 'HTML',\n\t\t\tmarkup: function (pkg) {\n\t\t\t\treturn ['<img src=\"', $scope.genBadgeUrl(pkg), '\"/>'].join('');\n\t\t\t}\n\t\t}, {\n\t\t\ttitle: 'Markdown',\n\t\t\tmarkup: function (pkg) {\n\t\t\t\treturn ['[![Package Quality](', $scope.genBadgeUrl(pkg), ')](', $scope.siteUrl(pkg), ')'].join('');\n\t\t\t}\n\t\t}, {\n\t\t\ttitle: 'Textile',\n\t\t\tmarkup: function (pkg) {\n\t\t\t\treturn ['!', $scope.genBadgeUrl(pkg), '!:', $scope.siteUrl(pkg)].join('');\n\t\t\t}\n\t\t}, {\n\t\t\ttitle: 'Shield',\n\t\t\tmarkup: $scope.genShieldUrl\n\t\t}, {\n\t\t\ttitle: 'Shield markdown',\n\t\t\tmarkup: function (pkg) {\n\t\t\t\treturn ['[![Package Quality](', $scope.genShieldUrl(pkg), ')](', $scope.siteUrl(pkg), ')'].join('');\n\t\t\t}\n\t\t}\n\t];\n}]);\n"
  },
  {
    "path": "app/lib/flat-ui/css/flat-ui.css",
    "content": "/*!\n * Flat UI Free v2.2.2 (http://designmodo.github.io/Flat-UI/)\n * Copyright 2013-2014 Designmodo, Inc.\n */\n\n@font-face {\n  font-family: 'Lato';\n  font-style: normal;\n  font-weight: 900;\n\n  src: url('../fonts/lato/lato-black.eot');\n  src: url('../fonts/lato/lato-black.eot?#iefix') format('embedded-opentype'), url('../fonts/lato/lato-black.woff') format('woff'), url('../fonts/lato/lato-black.ttf') format('truetype'), url('../fonts/lato/lato-black.svg#latoblack') format('svg');\n  }\n@font-face {\n  font-family: 'Lato';\n  font-style: normal;\n  font-weight: bold;\n\n  src: url('../fonts/lato/lato-bold.eot');\n  src: url('../fonts/lato/lato-bold.eot?#iefix') format('embedded-opentype'), url('../fonts/lato/lato-bold.woff') format('woff'), url('../fonts/lato/lato-bold.ttf') format('truetype'), url('../fonts/lato/lato-bold.svg#latobold') format('svg');\n  }\n@font-face {\n  font-family: 'Lato';\n  font-style: italic;\n  font-weight: bold;\n\n  src: url('../fonts/lato/lato-bolditalic.eot');\n  src: url('../fonts/lato/lato-bolditalic.eot?#iefix') format('embedded-opentype'), url('../fonts/lato/lato-bolditalic.woff') format('woff'), url('../fonts/lato/lato-bolditalic.ttf') format('truetype'), url('../fonts/lato/lato-bolditalic.svg#latobold-italic') format('svg');\n  }\n@font-face {\n  font-family: 'Lato';\n  font-style: italic;\n  font-weight: normal;\n\n  src: url('../fonts/lato/lato-italic.eot');\n  src: url('../fonts/lato/lato-italic.eot?#iefix') format('embedded-opentype'), url('../fonts/lato/lato-italic.woff') format('woff'), url('../fonts/lato/lato-italic.ttf') format('truetype'), url('../fonts/lato/lato-italic.svg#latoitalic') format('svg');\n  }\n@font-face {\n  font-family: 'Lato';\n  font-style: normal;\n  font-weight: 300;\n\n  src: url('../fonts/lato/lato-light.eot');\n  src: url('../fonts/lato/lato-light.eot?#iefix') format('embedded-opentype'), url('../fonts/lato/lato-light.woff') format('woff'), url('../fonts/lato/lato-light.ttf') format('truetype'), url('../fonts/lato/lato-light.svg#latolight') format('svg');\n  }\n@font-face {\n  font-family: 'Lato';\n  font-style: normal;\n  font-weight: normal;\n\n  src: url('../fonts/lato/lato-regular.eot');\n  src: url('../fonts/lato/lato-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/lato/lato-regular.woff') format('woff'), url('../fonts/lato/lato-regular.ttf') format('truetype'), url('../fonts/lato/lato-regular.svg#latoregular') format('svg');\n  }\n@font-face {\n  font-family: 'Flat-UI-Icons';\n\n  src: url('../fonts/glyphicons/flat-ui-icons-regular.eot');\n  src: url('../fonts/glyphicons/flat-ui-icons-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons/flat-ui-icons-regular.woff') format('woff'), url('../fonts/glyphicons/flat-ui-icons-regular.ttf') format('truetype'), url('../fonts/glyphicons/flat-ui-icons-regular.svg#flat-ui-icons-regular') format('svg');\n  }\n[class^=\"fui-\"],\n[class*=\"fui-\"] {\n  font-family: 'Flat-UI-Icons';\n  font-style: normal;\n  font-weight: normal;\n  font-variant: normal;\n  text-transform: none;\n\n  speak: none;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  }\n.fui-triangle-up:before {\n  content: \"\\e600\";\n  }\n.fui-triangle-down:before {\n  content: \"\\e601\";\n  }\n.fui-triangle-up-small:before {\n  content: \"\\e602\";\n  }\n.fui-triangle-down-small:before {\n  content: \"\\e603\";\n  }\n.fui-triangle-left-large:before {\n  content: \"\\e604\";\n  }\n.fui-triangle-right-large:before {\n  content: \"\\e605\";\n  }\n.fui-arrow-left:before {\n  content: \"\\e606\";\n  }\n.fui-arrow-right:before {\n  content: \"\\e607\";\n  }\n.fui-plus:before {\n  content: \"\\e608\";\n  }\n.fui-cross:before {\n  content: \"\\e609\";\n  }\n.fui-check:before {\n  content: \"\\e60a\";\n  }\n.fui-radio-unchecked:before {\n  content: \"\\e60b\";\n  }\n.fui-radio-checked:before {\n  content: \"\\e60c\";\n  }\n.fui-checkbox-unchecked:before {\n  content: \"\\e60d\";\n  }\n.fui-checkbox-checked:before {\n  content: \"\\e60e\";\n  }\n.fui-info-circle:before {\n  content: \"\\e60f\";\n  }\n.fui-alert-circle:before {\n  content: \"\\e610\";\n  }\n.fui-question-circle:before {\n  content: \"\\e611\";\n  }\n.fui-check-circle:before {\n  content: \"\\e612\";\n  }\n.fui-cross-circle:before {\n  content: \"\\e613\";\n  }\n.fui-plus-circle:before {\n  content: \"\\e614\";\n  }\n.fui-pause:before {\n  content: \"\\e615\";\n  }\n.fui-play:before {\n  content: \"\\e616\";\n  }\n.fui-volume:before {\n  content: \"\\e617\";\n  }\n.fui-mute:before {\n  content: \"\\e618\";\n  }\n.fui-resize:before {\n  content: \"\\e619\";\n  }\n.fui-list:before {\n  content: \"\\e61a\";\n  }\n.fui-list-thumbnailed:before {\n  content: \"\\e61b\";\n  }\n.fui-list-small-thumbnails:before {\n  content: \"\\e61c\";\n  }\n.fui-list-large-thumbnails:before {\n  content: \"\\e61d\";\n  }\n.fui-list-numbered:before {\n  content: \"\\e61e\";\n  }\n.fui-list-columned:before {\n  content: \"\\e61f\";\n  }\n.fui-list-bulleted:before {\n  content: \"\\e620\";\n  }\n.fui-window:before {\n  content: \"\\e621\";\n  }\n.fui-windows:before {\n  content: \"\\e622\";\n  }\n.fui-loop:before {\n  content: \"\\e623\";\n  }\n.fui-cmd:before {\n  content: \"\\e624\";\n  }\n.fui-mic:before {\n  content: \"\\e625\";\n  }\n.fui-heart:before {\n  content: \"\\e626\";\n  }\n.fui-location:before {\n  content: \"\\e627\";\n  }\n.fui-new:before {\n  content: \"\\e628\";\n  }\n.fui-video:before {\n  content: \"\\e629\";\n  }\n.fui-photo:before {\n  content: \"\\e62a\";\n  }\n.fui-time:before {\n  content: \"\\e62b\";\n  }\n.fui-eye:before {\n  content: \"\\e62c\";\n  }\n.fui-chat:before {\n  content: \"\\e62d\";\n  }\n.fui-home:before {\n  content: \"\\e62e\";\n  }\n.fui-upload:before {\n  content: \"\\e62f\";\n  }\n.fui-search:before {\n  content: \"\\e630\";\n  }\n.fui-user:before {\n  content: \"\\e631\";\n  }\n.fui-mail:before {\n  content: \"\\e632\";\n  }\n.fui-lock:before {\n  content: \"\\e633\";\n  }\n.fui-power:before {\n  content: \"\\e634\";\n  }\n.fui-calendar:before {\n  content: \"\\e635\";\n  }\n.fui-gear:before {\n  content: \"\\e636\";\n  }\n.fui-bookmark:before {\n  content: \"\\e637\";\n  }\n.fui-exit:before {\n  content: \"\\e638\";\n  }\n.fui-trash:before {\n  content: \"\\e639\";\n  }\n.fui-folder:before {\n  content: \"\\e63a\";\n  }\n.fui-bubble:before {\n  content: \"\\e63b\";\n  }\n.fui-export:before {\n  content: \"\\e63c\";\n  }\n.fui-calendar-solid:before {\n  content: \"\\e63d\";\n  }\n.fui-star:before {\n  content: \"\\e63e\";\n  }\n.fui-star-2:before {\n  content: \"\\e63f\";\n  }\n.fui-credit-card:before {\n  content: \"\\e640\";\n  }\n.fui-clip:before {\n  content: \"\\e641\";\n  }\n.fui-link:before {\n  content: \"\\e642\";\n  }\n.fui-tag:before {\n  content: \"\\e643\";\n  }\n.fui-document:before {\n  content: \"\\e644\";\n  }\n.fui-image:before {\n  content: \"\\e645\";\n  }\n.fui-facebook:before {\n  content: \"\\e646\";\n  }\n.fui-youtube:before {\n  content: \"\\e647\";\n  }\n.fui-vimeo:before {\n  content: \"\\e648\";\n  }\n.fui-twitter:before {\n  content: \"\\e649\";\n  }\n.fui-spotify:before {\n  content: \"\\e64a\";\n  }\n.fui-skype:before {\n  content: \"\\e64b\";\n  }\n.fui-pinterest:before {\n  content: \"\\e64c\";\n  }\n.fui-path:before {\n  content: \"\\e64d\";\n  }\n.fui-linkedin:before {\n  content: \"\\e64e\";\n  }\n.fui-google-plus:before {\n  content: \"\\e64f\";\n  }\n.fui-dribbble:before {\n  content: \"\\e650\";\n  }\n.fui-behance:before {\n  content: \"\\e651\";\n  }\n.fui-stumbleupon:before {\n  content: \"\\e652\";\n  }\n.fui-yelp:before {\n  content: \"\\e653\";\n  }\n.fui-wordpress:before {\n  content: \"\\e654\";\n  }\n.fui-windows-8:before {\n  content: \"\\e655\";\n  }\n.fui-vine:before {\n  content: \"\\e656\";\n  }\n.fui-tumblr:before {\n  content: \"\\e657\";\n  }\n.fui-paypal:before {\n  content: \"\\e658\";\n  }\n.fui-lastfm:before {\n  content: \"\\e659\";\n  }\n.fui-instagram:before {\n  content: \"\\e65a\";\n  }\n.fui-html5:before {\n  content: \"\\e65b\";\n  }\n.fui-github:before {\n  content: \"\\e65c\";\n  }\n.fui-foursquare:before {\n  content: \"\\e65d\";\n  }\n.fui-dropbox:before {\n  content: \"\\e65e\";\n  }\n.fui-android:before {\n  content: \"\\e65f\";\n  }\n.fui-apple:before {\n  content: \"\\e660\";\n  }\nbody {\n  font-family: \"Lato\", Helvetica, Arial, sans-serif;\n  font-size: 18px;\n  line-height: 1.72222;\n  color: #34495e;\n  background-color: #fff;\n  }\na {\n  color: #16a085;\n  text-decoration: none;\n  -webkit-transition: .25s;\n          transition: .25s;\n  }\na:hover,\na:focus {\n  color: #1abc9c;\n  text-decoration: none;\n  }\na:focus {\n  outline: none;\n  }\n.img-rounded {\n  border-radius: 6px;\n  }\n.img-thumbnail {\n  display: inline-block;\n  max-width: 100%;\n  height: auto;\n  padding: 4px;\n  line-height: 1.72222;\n  background-color: #fff;\n  border: 2px solid #bdc3c7;\n  border-radius: 6px;\n  -webkit-transition: all .25s ease-in-out;\n          transition: all .25s ease-in-out;\n  }\n.img-comment {\n  margin: 24px 0;\n  font-size: 15px;\n  font-style: italic;\n  line-height: 1.2;\n  }\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n  font-family: inherit;\n  font-weight: 700;\n  line-height: 1.1;\n  color: inherit;\n  }\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small {\n  color: #e7e9ec;\n  }\nh1,\nh2,\nh3 {\n  margin-top: 30px;\n  margin-bottom: 15px;\n  }\nh4,\nh5,\nh6 {\n  margin-top: 15px;\n  margin-bottom: 15px;\n  }\nh6 {\n  font-weight: normal;\n  }\nh1,\n.h1 {\n  font-size: 61px;\n  }\nh2,\n.h2 {\n  font-size: 53px;\n  }\nh3,\n.h3 {\n  font-size: 40px;\n  }\nh4,\n.h4 {\n  font-size: 29px;\n  }\nh5,\n.h5 {\n  font-size: 28px;\n  }\nh6,\n.h6 {\n  font-size: 24px;\n  }\np {\n  margin: 0 0 15px;\n  font-size: 18px;\n  line-height: 1.72222;\n  }\n.lead {\n  margin-bottom: 30px;\n  font-size: 28px;\n  font-weight: 300;\n  line-height: 1.46428571;\n  }\n@media (min-width: 768px) {\n  .lead {\n    font-size: 30.006px;\n    }\n  }\nsmall,\n.small {\n  font-size: 83%;\n  line-height: 2.067;\n  }\n.text-muted {\n  color: #bdc3c7;\n  }\n.text-inverse {\n  color: #fff;\n  }\n.text-primary {\n  color: #1abc9c;\n  }\na.text-primary:hover {\n  color: #148f77;\n  }\n.text-warning {\n  color: #f1c40f;\n  }\na.text-warning:hover {\n  color: #c29d0b;\n  }\n.text-danger {\n  color: #e74c3c;\n  }\na.text-danger:hover {\n  color: #d62c1a;\n  }\n.text-success {\n  color: #2ecc71;\n  }\na.text-success:hover {\n  color: #25a25a;\n  }\n.text-info {\n  color: #3498db;\n  }\na.text-info:hover {\n  color: #217dbb;\n  }\n.bg-primary {\n  color: #fff;\n  background-color: #34495e;\n  }\na.bg-primary:hover {\n  background-color: #222f3d;\n  }\n.bg-success {\n  background-color: #dff0d8;\n  }\na.bg-success:hover {\n  background-color: #c1e2b3;\n  }\n.bg-info {\n  background-color: #d9edf7;\n  }\na.bg-info:hover {\n  background-color: #afd9ee;\n  }\n.bg-warning {\n  background-color: #fcf8e3;\n  }\na.bg-warning:hover {\n  background-color: #f7ecb5;\n  }\n.bg-danger {\n  background-color: #f2dede;\n  }\na.bg-danger:hover {\n  background-color: #e4b9b9;\n  }\n.page-header {\n  padding-bottom: 14px;\n  margin: 60px 0 30px;\n  border-bottom: 2px solid #e7e9ec;\n  }\nul,\nol {\n  margin-bottom: 15px;\n  }\ndl {\n  margin-bottom: 30px;\n  }\ndt,\ndd {\n  line-height: 1.72222;\n  }\n@media (min-width: 768px) {\n  .dl-horizontal dt {\n    width: 160px;\n    }\n  .dl-horizontal dd {\n    margin-left: 180px;\n    }\n  }\nabbr[title],\nabbr[data-original-title] {\n  border-bottom: 1px dotted #bdc3c7;\n  }\nblockquote {\n  padding: 0 0 0 16px;\n  margin: 0 0 30px;\n  border-left: 3px solid #e7e9ec;\n  }\nblockquote p {\n  margin-bottom: .4em;\n  font-size: 20px;\n  font-weight: normal;\n  line-height: 1.55;\n  }\nblockquote small,\nblockquote .small {\n  font-size: 18px;\n  font-style: italic;\n  line-height: 1.72222;\n  color: inherit;\n  }\nblockquote small:before,\nblockquote .small:before {\n  content: \"\";\n  }\nblockquote.pull-right {\n  padding-right: 16px;\n  padding-left: 0;\n  border-right: 3px solid #e7e9ec;\n  border-left: 0;\n  }\nblockquote.pull-right small:after {\n  content: \"\";\n  }\naddress {\n  margin-bottom: 30px;\n  line-height: 1.72222;\n  }\nsub,\nsup {\n  font-size: 70%;\n  }\ncode,\nkbd,\npre,\nsamp {\n  font-family: Monaco, Menlo, Consolas, \"Courier New\", monospace;\n  }\ncode {\n  padding: 2px 6px;\n  font-size: 85%;\n  color: #c7254e;\n  background-color: #f9f2f4;\n  border-radius: 4px;\n  }\nkbd {\n  padding: 2px 6px;\n  font-size: 85%;\n  color: #fff;\n  background-color: #34495e;\n  border-radius: 4px;\n  box-shadow: none;\n  }\npre {\n  padding: 8px;\n  margin: 0 0 15px;\n  font-size: 13px;\n  line-height: 1.72222;\n  color: inherit;\n  white-space: pre;\n  background-color: #fff;\n  border: 2px solid #e7e9ec;\n  border-radius: 6px;\n  }\n.pre-scrollable {\n  max-height: 340px;\n  }\n.thumbnail {\n  display: block;\n  padding: 4px;\n  margin-bottom: 5px;\n  line-height: 1.72222;\n  background-color: #fff;\n  border: 2px solid #bdc3c7;\n  border-radius: 6px;\n  -webkit-transition: border .25s ease-in-out;\n          transition: border .25s ease-in-out;\n  }\n.thumbnail > img,\n.thumbnail a > img {\n  display: block;\n  max-width: 100%;\n  height: auto;\n  margin-right: auto;\n  margin-left: auto;\n  }\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n  border-color: #16a085;\n  }\n.thumbnail .caption {\n  padding: 9px;\n  color: #34495e;\n  }\n.btn {\n  padding: 10px 15px;\n  font-size: 15px;\n  font-weight: normal;\n  line-height: 1.4;\n  border: none;\n  border-radius: 4px;\n  -webkit-transition: border .25s linear, color .25s linear, background-color .25s linear;\n          transition: border .25s linear, color .25s linear, background-color .25s linear;\n\n  -webkit-font-smoothing: subpixel-antialiased;\n  }\n.btn:hover,\n.btn:focus {\n  color: #fff;\n  outline: none;\n  }\n.btn:active,\n.btn.active {\n  outline: none;\n  box-shadow: none;\n  }\n.btn:focus:active {\n  outline: none;\n  }\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n  color: rgba(255, 255, 255, .75);\n  cursor: not-allowed;\n  background-color: #bdc3c7;\n  filter: alpha(opacity=70);\n  opacity: .7;\n  }\n.btn [class^=\"fui-\"] {\n  position: relative;\n  top: 1px;\n  margin: 0 1px;\n  line-height: 1;\n  }\n.btn-xs.btn [class^=\"fui-\"] {\n  top: 0;\n  font-size: 11px;\n  }\n.btn-hg.btn [class^=\"fui-\"] {\n  top: 2px;\n  }\n.btn-default {\n  color: #fff;\n  background-color: #bdc3c7;\n  }\n.btn-default:hover,\n.btn-default.hover,\n.btn-default:focus,\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n  color: #fff;\n  background-color: #cacfd2;\n  border-color: #cacfd2;\n  }\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n  background: #a1a6a9;\n  border-color: #a1a6a9;\n  }\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled.hover,\n.btn-default[disabled].hover,\nfieldset[disabled] .btn-default.hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n  background-color: #bdc3c7;\n  border-color: #bdc3c7;\n  }\n.btn-default .badge {\n  color: #bdc3c7;\n  background-color: #fff;\n  }\n.btn-primary {\n  color: #fff;\n  background-color: #1abc9c;\n  }\n.btn-primary:hover,\n.btn-primary.hover,\n.btn-primary:focus,\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n  color: #fff;\n  background-color: #48c9b0;\n  border-color: #48c9b0;\n  }\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n  background: #16a085;\n  border-color: #16a085;\n  }\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled.hover,\n.btn-primary[disabled].hover,\nfieldset[disabled] .btn-primary.hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n  background-color: #bdc3c7;\n  border-color: #1abc9c;\n  }\n.btn-primary .badge {\n  color: #1abc9c;\n  background-color: #fff;\n  }\n.btn-info {\n  color: #fff;\n  background-color: #3498db;\n  }\n.btn-info:hover,\n.btn-info.hover,\n.btn-info:focus,\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n  color: #fff;\n  background-color: #5dade2;\n  border-color: #5dade2;\n  }\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n  background: #2c81ba;\n  border-color: #2c81ba;\n  }\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled.hover,\n.btn-info[disabled].hover,\nfieldset[disabled] .btn-info.hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n  background-color: #bdc3c7;\n  border-color: #3498db;\n  }\n.btn-info .badge {\n  color: #3498db;\n  background-color: #fff;\n  }\n.btn-danger {\n  color: #fff;\n  background-color: #e74c3c;\n  }\n.btn-danger:hover,\n.btn-danger.hover,\n.btn-danger:focus,\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n  color: #fff;\n  background-color: #ec7063;\n  border-color: #ec7063;\n  }\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n  background: #c44133;\n  border-color: #c44133;\n  }\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled.hover,\n.btn-danger[disabled].hover,\nfieldset[disabled] .btn-danger.hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n  background-color: #bdc3c7;\n  border-color: #e74c3c;\n  }\n.btn-danger .badge {\n  color: #e74c3c;\n  background-color: #fff;\n  }\n.btn-success {\n  color: #fff;\n  background-color: #2ecc71;\n  }\n.btn-success:hover,\n.btn-success.hover,\n.btn-success:focus,\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n  color: #fff;\n  background-color: #58d68d;\n  border-color: #58d68d;\n  }\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n  background: #27ad60;\n  border-color: #27ad60;\n  }\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled.hover,\n.btn-success[disabled].hover,\nfieldset[disabled] .btn-success.hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n  background-color: #bdc3c7;\n  border-color: #2ecc71;\n  }\n.btn-success .badge {\n  color: #2ecc71;\n  background-color: #fff;\n  }\n.btn-warning {\n  color: #fff;\n  background-color: #f1c40f;\n  }\n.btn-warning:hover,\n.btn-warning.hover,\n.btn-warning:focus,\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n  color: #fff;\n  background-color: #f4d313;\n  border-color: #f4d313;\n  }\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n  background: #cda70d;\n  border-color: #cda70d;\n  }\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled.hover,\n.btn-warning[disabled].hover,\nfieldset[disabled] .btn-warning.hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n  background-color: #bdc3c7;\n  border-color: #f1c40f;\n  }\n.btn-warning .badge {\n  color: #f1c40f;\n  background-color: #fff;\n  }\n.btn-inverse {\n  color: #fff;\n  background-color: #34495e;\n  }\n.btn-inverse:hover,\n.btn-inverse.hover,\n.btn-inverse:focus,\n.btn-inverse:active,\n.btn-inverse.active,\n.open > .dropdown-toggle.btn-inverse {\n  color: #fff;\n  background-color: #415b76;\n  border-color: #415b76;\n  }\n.btn-inverse:active,\n.btn-inverse.active,\n.open > .dropdown-toggle.btn-inverse {\n  background: #2c3e50;\n  border-color: #2c3e50;\n  }\n.btn-inverse.disabled,\n.btn-inverse[disabled],\nfieldset[disabled] .btn-inverse,\n.btn-inverse.disabled:hover,\n.btn-inverse[disabled]:hover,\nfieldset[disabled] .btn-inverse:hover,\n.btn-inverse.disabled.hover,\n.btn-inverse[disabled].hover,\nfieldset[disabled] .btn-inverse.hover,\n.btn-inverse.disabled:focus,\n.btn-inverse[disabled]:focus,\nfieldset[disabled] .btn-inverse:focus,\n.btn-inverse.disabled:active,\n.btn-inverse[disabled]:active,\nfieldset[disabled] .btn-inverse:active,\n.btn-inverse.disabled.active,\n.btn-inverse[disabled].active,\nfieldset[disabled] .btn-inverse.active {\n  background-color: #bdc3c7;\n  border-color: #34495e;\n  }\n.btn-inverse .badge {\n  color: #34495e;\n  background-color: #fff;\n  }\n.btn-embossed {\n  box-shadow: inset 0 -2px 0 rgba(0, 0, 0, .15);\n  }\n.btn-embossed.active,\n.btn-embossed:active {\n  box-shadow: inset 0 2px 0 rgba(0, 0, 0, .15);\n  }\n.btn-wide {\n  min-width: 140px;\n  padding-right: 30px;\n  padding-left: 30px;\n  }\n.btn-link {\n  color: #16a085;\n  }\n.btn-link:hover,\n.btn-link:focus {\n  color: #1abc9c;\n  text-decoration: underline;\n  background-color: transparent;\n  }\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n  color: #bdc3c7;\n  text-decoration: none;\n  }\n.btn-hg,\n.btn-group-hg > .btn {\n  padding: 13px 20px;\n  font-size: 22px;\n  line-height: 1.227;\n  border-radius: 6px;\n  }\n.btn-lg,\n.btn-group-lg > .btn {\n  padding: 10px 19px;\n  font-size: 17px;\n  line-height: 1.471;\n  border-radius: 6px;\n  }\n.btn-sm,\n.btn-group-sm > .btn {\n  padding: 9px 13px;\n  font-size: 13px;\n  line-height: 1.385;\n  border-radius: 4px;\n  }\n.btn-xs,\n.btn-group-xs > .btn {\n  padding: 6px 9px;\n  font-size: 12px;\n  line-height: 1.083;\n  border-radius: 3px;\n  }\n.btn-tip {\n  padding-left: 10px;\n  font-size: 92%;\n  font-weight: 300;\n  }\n.btn-block {\n  white-space: normal;\n  }\n[class*=\"btn-social-\"] {\n  padding: 10px 15px;\n  font-size: 13px;\n  line-height: 1.077;\n  border-radius: 4px;\n  }\n.btn-social-pinterest {\n  color: #fff;\n  background-color: #cb2028;\n  }\n.btn-social-pinterest:hover,\n.btn-social-pinterest:focus {\n  background-color: #d54d53;\n  }\n.btn-social-pinterest:active,\n.btn-social-pinterest.active {\n  background-color: #ad1b22;\n  }\n.btn-social-linkedin {\n  color: #fff;\n  background-color: #0072b5;\n  }\n.btn-social-linkedin:hover,\n.btn-social-linkedin:focus {\n  background-color: #338ec4;\n  }\n.btn-social-linkedin:active,\n.btn-social-linkedin.active {\n  background-color: #00619a;\n  }\n.btn-social-stumbleupon {\n  color: #fff;\n  background-color: #ed4a13;\n  }\n.btn-social-stumbleupon:hover,\n.btn-social-stumbleupon:focus {\n  background-color: #f16e42;\n  }\n.btn-social-stumbleupon:active,\n.btn-social-stumbleupon.active {\n  background-color: #c93f10;\n  }\n.btn-social-googleplus {\n  color: #fff;\n  background-color: #2d2d2d;\n  }\n.btn-social-googleplus:hover,\n.btn-social-googleplus:focus {\n  background-color: #575757;\n  }\n.btn-social-googleplus:active,\n.btn-social-googleplus.active {\n  background-color: #262626;\n  }\n.btn-social-facebook {\n  color: #fff;\n  background-color: #2f4b93;\n  }\n.btn-social-facebook:hover,\n.btn-social-facebook:focus {\n  background-color: #596fa9;\n  }\n.btn-social-facebook:active,\n.btn-social-facebook.active {\n  background-color: #28407d;\n  }\n.btn-social-twitter {\n  color: #fff;\n  background-color: #00bdef;\n  }\n.btn-social-twitter:hover,\n.btn-social-twitter:focus {\n  background-color: #33caf2;\n  }\n.btn-social-twitter:active,\n.btn-social-twitter.active {\n  background-color: #00a1cb;\n  }\n.btn-group > .btn + .btn {\n  margin-left: 0;\n  }\n.btn-group > .btn + .dropdown-toggle {\n  padding: 10px 12px;\n  border-left: 2px solid rgba(52, 73, 94, .15);\n  }\n.btn-group > .btn + .dropdown-toggle .caret {\n  margin-right: 3px;\n  margin-left: 3px;\n  }\n.btn-group > .btn.btn-gh + .dropdown-toggle .caret {\n  margin-right: 7px;\n  margin-left: 7px;\n  }\n.btn-group > .btn.btn-sm + .dropdown-toggle .caret {\n  margin-right: 0;\n  margin-left: 0;\n  }\n.dropdown-toggle .caret {\n  margin-left: 8px;\n  }\n.btn-group-xs > .btn + .dropdown-toggle {\n  padding: 6px 9px;\n  }\n.btn-group-sm > .btn + .dropdown-toggle {\n  padding: 9px 13px;\n  }\n.btn-group-lg > .btn + .dropdown-toggle {\n  padding: 10px 19px;\n  }\n.btn-group-hg > .btn + .dropdown-toggle {\n  padding: 13px 20px;\n  }\n.btn-xs .caret {\n  border-width: 6px 4px 0;\n  border-bottom-width: 0;\n  }\n.btn-lg .caret {\n  border-width: 8px 6px 0;\n  border-bottom-width: 0;\n  }\n.dropup .btn-lg .caret {\n  border-width: 0 6px 8px;\n  }\n.dropup .btn-xs .caret {\n  border-width: 0 4px 6px;\n  }\n.btn-group > .btn,\n.btn-group > .dropdown-menu,\n.btn-group > .popover {\n  font-weight: 400;\n  }\n.btn-group:focus .dropdown-toggle {\n  outline: none;\n  -webkit-transition: .25s;\n          transition: .25s;\n  }\n.btn-group.open .dropdown-toggle {\n  color: rgba(255, 255, 255, .75);\n  box-shadow: none;\n  }\n.btn-toolbar .btn.active {\n  color: #fff;\n  }\n.btn-toolbar .btn > [class^=\"fui-\"] {\n  margin: 0 1px;\n  font-size: 16px;\n  }\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 30px / 2;\n  font-size: 24px;\n  line-height: inherit;\n  color: inherit;\n  border-bottom: none;\n  }\ntextarea {\n  padding: 5px 11px;\n  font-size: 20px;\n  line-height: 24px;\n  }\ninput[type=\"search\"] {\n  -webkit-appearance: none !important;\n  }\nlabel {\n  font-size: 15px;\n  font-weight: normal;\n  line-height: 2.3;\n  }\n.form-control::-moz-placeholder,\n.select2-search input[type=\"text\"]::-moz-placeholder {\n  color: #b2bcc5;\n  opacity: 1;\n  }\n.form-control:-ms-input-placeholder,\n.select2-search input[type=\"text\"]:-ms-input-placeholder {\n  color: #b2bcc5;\n  }\n.form-control::-webkit-input-placeholder,\n.select2-search input[type=\"text\"]::-webkit-input-placeholder {\n  color: #b2bcc5;\n  }\n.form-control,\n.select2-search input[type=\"text\"] {\n  height: 42px;\n  padding: 8px 12px;\n  font-family: \"Lato\", Helvetica, Arial, sans-serif;\n  font-size: 15px;\n  line-height: 1.467;\n  color: #34495e;\n  border: 2px solid #bdc3c7;\n  border-radius: 6px;\n  box-shadow: none;\n  -webkit-transition: border .25s linear, color .25s linear, background-color .25s linear;\n          transition: border .25s linear, color .25s linear, background-color .25s linear;\n  }\n.form-group.focus .form-control,\n.form-control:focus,\n.form-group.focus .select2-search input[type=\"text\"],\n.select2-search input[type=\"text\"]:focus {\n  border-color: #1abc9c;\n  outline: 0;\n  box-shadow: none;\n  }\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control,\n.select2-search input[type=\"text\"][disabled],\n.select2-search input[type=\"text\"][readonly],\nfieldset[disabled] .select2-search input[type=\"text\"] {\n  color: #d5dbdb;\n  cursor: default;\n  background-color: #f4f6f6;\n  filter: alpha(opacity=70);\n  border-color: #d5dbdb;\n  opacity: .7;\n  }\n.form-control.flat,\n.select2-search input[type=\"text\"].flat {\n  border-color: transparent;\n  }\n.form-control.flat:hover,\n.select2-search input[type=\"text\"].flat:hover {\n  border-color: #bdc3c7;\n  }\n.form-control.flat:focus,\n.select2-search input[type=\"text\"].flat:focus {\n  border-color: #1abc9c;\n  }\n.input-sm,\n.form-group-sm .form-control,\n.form-group-sm .select2-search input[type=\"text\"],\n.select2-search input[type=\"text\"] {\n  height: 35px;\n  padding: 6px 10px;\n  font-size: 13px;\n  line-height: 1.462;\n  border-radius: 6px;\n  }\nselect.input-sm,\nselect.form-group-sm .form-control,\nselect.form-group-sm .select2-search input[type=\"text\"],\nselect.select2-search input[type=\"text\"] {\n  height: 35px;\n  line-height: 35px;\n  }\ntextarea.input-sm,\ntextarea.form-group-sm .form-control,\nselect[multiple].input-sm,\nselect[multiple].form-group-sm .form-control,\ntextarea.form-group-sm .select2-search input[type=\"text\"],\nselect[multiple].form-group-sm .select2-search input[type=\"text\"],\ntextarea.select2-search input[type=\"text\"],\nselect[multiple].select2-search input[type=\"text\"] {\n  height: auto;\n  }\n.input-lg,\n.form-group-lg .form-control,\n.form-group-lg .select2-search input[type=\"text\"] {\n  height: 45px;\n  padding: 10px 15px;\n  font-size: 17px;\n  line-height: 1.235;\n  border-radius: 6px;\n  }\nselect.input-lg,\nselect.form-group-lg .form-control,\nselect.form-group-lg .select2-search input[type=\"text\"] {\n  height: 45px;\n  line-height: 45px;\n  }\ntextarea.input-lg,\ntextarea.form-group-lg .form-control,\nselect[multiple].input-lg,\nselect[multiple].form-group-lg .form-control,\ntextarea.form-group-lg .select2-search input[type=\"text\"],\nselect[multiple].form-group-lg .select2-search input[type=\"text\"] {\n  height: auto;\n  }\n.input-hg,\n.form-group-hg .form-control,\n.form-horizontal .form-group-hg .form-control,\n.form-group-hg .select2-search input[type=\"text\"],\n.form-horizontal .form-group-hg .select2-search input[type=\"text\"] {\n  height: 53px;\n  padding: 10px 16px;\n  font-size: 22px;\n  line-height: 1.318;\n  border-radius: 6px;\n  }\nselect.input-hg,\nselect.form-group-hg .form-control,\nselect.form-group-hg .select2-search input[type=\"text\"] {\n  height: 53px;\n  line-height: 53px;\n  }\ntextarea.input-hg,\ntextarea.form-group-hg .form-control,\nselect[multiple].input-hg,\nselect[multiple].form-group-hg .form-control,\ntextarea.form-group-hg .select2-search input[type=\"text\"],\nselect[multiple].form-group-hg .select2-search input[type=\"text\"] {\n  height: auto;\n  }\n.form-control-feedback {\n  position: absolute;\n  top: 2px;\n  right: 2px;\n  padding: 0 12px 0 0;\n  margin-top: 1px;\n  font-size: 17px;\n  line-height: 36px;\n  color: #b2bcc5;\n  pointer-events: none;\n  background-color: transparent;\n  border-radius: 6px;\n  }\n.input-hg + .form-control-feedback,\n.control-feedback-hg {\n  width: auto;\n  height: 48px;\n  padding-right: 16px;\n  font-size: 20px;\n  line-height: 48px;\n  }\n.input-lg + .form-control-feedback,\n.control-feedback-lg {\n  width: auto;\n  height: 40px;\n  padding-right: 15px;\n  font-size: 18px;\n  line-height: 40px;\n  }\n.input-sm + .form-control-feedback,\n.control-feedback-sm,\n.select2-search input[type=\"text\"] + .form-control-feedback {\n  width: auto;\n  height: 29px;\n  padding-right: 10px;\n  line-height: 29px;\n  }\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline {\n  color: #2ecc71;\n  }\n.has-success .form-control,\n.has-success .select2-search input[type=\"text\"] {\n  color: #2ecc71;\n  border-color: #2ecc71;\n  box-shadow: none;\n  }\n.has-success .form-control::-moz-placeholder,\n.has-success .select2-search input[type=\"text\"]::-moz-placeholder {\n  color: #2ecc71;\n  opacity: 1;\n  }\n.has-success .form-control:-ms-input-placeholder,\n.has-success .select2-search input[type=\"text\"]:-ms-input-placeholder {\n  color: #2ecc71;\n  }\n.has-success .form-control::-webkit-input-placeholder,\n.has-success .select2-search input[type=\"text\"]::-webkit-input-placeholder {\n  color: #2ecc71;\n  }\n.has-success .form-control:focus,\n.has-success .select2-search input[type=\"text\"]:focus {\n  border-color: #2ecc71;\n  box-shadow: none;\n  }\n.has-success .input-group-addon {\n  color: #2ecc71;\n  background-color: #fff;\n  border-color: #2ecc71;\n  }\n.has-success .form-control-feedback {\n  color: #2ecc71;\n  }\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline {\n  color: #f1c40f;\n  }\n.has-warning .form-control,\n.has-warning .select2-search input[type=\"text\"] {\n  color: #f1c40f;\n  border-color: #f1c40f;\n  box-shadow: none;\n  }\n.has-warning .form-control::-moz-placeholder,\n.has-warning .select2-search input[type=\"text\"]::-moz-placeholder {\n  color: #f1c40f;\n  opacity: 1;\n  }\n.has-warning .form-control:-ms-input-placeholder,\n.has-warning .select2-search input[type=\"text\"]:-ms-input-placeholder {\n  color: #f1c40f;\n  }\n.has-warning .form-control::-webkit-input-placeholder,\n.has-warning .select2-search input[type=\"text\"]::-webkit-input-placeholder {\n  color: #f1c40f;\n  }\n.has-warning .form-control:focus,\n.has-warning .select2-search input[type=\"text\"]:focus {\n  border-color: #f1c40f;\n  box-shadow: none;\n  }\n.has-warning .input-group-addon {\n  color: #f1c40f;\n  background-color: #fff;\n  border-color: #f1c40f;\n  }\n.has-warning .form-control-feedback {\n  color: #f1c40f;\n  }\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline {\n  color: #e74c3c;\n  }\n.has-error .form-control,\n.has-error .select2-search input[type=\"text\"] {\n  color: #e74c3c;\n  border-color: #e74c3c;\n  box-shadow: none;\n  }\n.has-error .form-control::-moz-placeholder,\n.has-error .select2-search input[type=\"text\"]::-moz-placeholder {\n  color: #e74c3c;\n  opacity: 1;\n  }\n.has-error .form-control:-ms-input-placeholder,\n.has-error .select2-search input[type=\"text\"]:-ms-input-placeholder {\n  color: #e74c3c;\n  }\n.has-error .form-control::-webkit-input-placeholder,\n.has-error .select2-search input[type=\"text\"]::-webkit-input-placeholder {\n  color: #e74c3c;\n  }\n.has-error .form-control:focus,\n.has-error .select2-search input[type=\"text\"]:focus {\n  border-color: #e74c3c;\n  box-shadow: none;\n  }\n.has-error .input-group-addon {\n  color: #e74c3c;\n  background-color: #fff;\n  border-color: #e74c3c;\n  }\n.has-error .form-control-feedback {\n  color: #e74c3c;\n  }\n.form-control[disabled] + .form-control-feedback,\n.form-control[readonly] + .form-control-feedback,\nfieldset[disabled] .form-control + .form-control-feedback,\n.form-control.disabled + .form-control-feedback,\n.select2-search input[type=\"text\"][disabled] + .form-control-feedback,\n.select2-search input[type=\"text\"][readonly] + .form-control-feedback,\nfieldset[disabled] .select2-search input[type=\"text\"] + .form-control-feedback,\n.select2-search input[type=\"text\"].disabled + .form-control-feedback {\n  color: #d5dbdb;\n  cursor: not-allowed;\n  background-color: transparent;\n  filter: alpha(opacity=70);\n  opacity: .7;\n  }\n.help-block {\n  margin-bottom: 5px;\n  font-size: 14px;\n  color: #6b7a88;\n  }\n.form-group {\n  position: relative;\n  margin-bottom: 20px;\n  }\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n  padding-top: 0;\n  margin-top: 0;\n  margin-bottom: 0;\n  }\n@media (min-width: 768px) {\n  .form-horizontal .control-label {\n    padding-top: 3px;\n    padding-bottom: 3px;\n    }\n  }\n.form-horizontal .form-group {\n  margin-right: -15px;\n  margin-left: -15px;\n  }\n.form-horizontal .form-control-static {\n  padding-top: 6px;\n  padding-bottom: 6px;\n  }\n@media (min-width: 768px) {\n  .form-horizontal .form-group-hg .control-label {\n    padding-top: 2px;\n    padding-bottom: 0;\n    font-size: 22px;\n    }\n  }\n@media (min-width: 768px) {\n  .form-horizontal .form-group-lg .control-label {\n    padding-top: 3px;\n    padding-bottom: 2px;\n    font-size: 17px;\n    }\n  }\n@media (min-width: 768px) {\n  .form-horizontal .form-group-sm .control-label {\n    padding-top: 2px;\n    padding-bottom: 2px;\n    font-size: 13px;\n    }\n  }\n.input-group .form-control,\n.input-group .select2-search input[type=\"text\"] {\n  position: static;\n  }\n.input-group-hg > .form-control,\n.input-group-hg > .input-group-addon,\n.input-group-hg > .input-group-btn > .btn,\n.input-group-hg > .select2-search input[type=\"text\"] {\n  height: 53px;\n  padding: 10px 16px;\n  font-size: 22px;\n  line-height: 1.318;\n  border-radius: 6px;\n  }\nselect.input-group-hg > .form-control,\nselect.input-group-hg > .input-group-addon,\nselect.input-group-hg > .input-group-btn > .btn,\nselect.input-group-hg > .select2-search input[type=\"text\"] {\n  height: 53px;\n  line-height: 53px;\n  }\ntextarea.input-group-hg > .form-control,\ntextarea.input-group-hg > .input-group-addon,\ntextarea.input-group-hg > .input-group-btn > .btn,\nselect[multiple].input-group-hg > .form-control,\nselect[multiple].input-group-hg > .input-group-addon,\nselect[multiple].input-group-hg > .input-group-btn > .btn,\ntextarea.input-group-hg > .select2-search input[type=\"text\"],\nselect[multiple].input-group-hg > .select2-search input[type=\"text\"] {\n  height: auto;\n  }\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn,\n.input-group-lg > .select2-search input[type=\"text\"] {\n  height: 45px;\n  padding: 10px 15px;\n  font-size: 17px;\n  line-height: 1.235;\n  border-radius: 6px;\n  }\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn,\nselect.input-group-lg > .select2-search input[type=\"text\"] {\n  height: 45px;\n  line-height: 45px;\n  }\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn,\ntextarea.input-group-lg > .select2-search input[type=\"text\"],\nselect[multiple].input-group-lg > .select2-search input[type=\"text\"] {\n  height: auto;\n  }\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn,\n.input-group-sm > .select2-search input[type=\"text\"] {\n  height: 35px;\n  padding: 6px 10px;\n  font-size: 13px;\n  line-height: 1.462;\n  border-radius: 6px;\n  }\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn,\nselect.input-group-sm > .select2-search input[type=\"text\"] {\n  height: 35px;\n  line-height: 35px;\n  }\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn,\ntextarea.input-group-sm > .select2-search input[type=\"text\"],\nselect[multiple].input-group-sm > .select2-search input[type=\"text\"] {\n  height: auto;\n  }\n.input-group-addon {\n  padding: 10px 12px;\n  font-size: 15px;\n  color: #fff;\n  text-align: center;\n  background-color: #bdc3c7;\n  border: 2px solid #bdc3c7;\n  border-radius: 6px;\n  -webkit-transition: border .25s linear, color .25s linear, background-color .25s linear;\n          transition: border .25s linear, color .25s linear, background-color .25s linear;\n  }\n.input-group-hg .input-group-addon,\n.input-group-lg .input-group-addon,\n.input-group-sm .input-group-addon {\n  line-height: 1;\n  }\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group .select2-search input[type=\"text\"]:first-child {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n  }\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group .select2-search input[type=\"text\"]:last-child {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n  }\n.form-group.focus .input-group-addon,\n.input-group.focus .input-group-addon {\n  background-color: #1abc9c;\n  border-color: #1abc9c;\n  }\n.form-group.focus .input-group-btn > .btn-default + .btn-default,\n.input-group.focus .input-group-btn > .btn-default + .btn-default {\n  border-left-color: #16a085;\n  }\n.form-group.focus .input-group-btn .btn,\n.input-group.focus .input-group-btn .btn {\n  color: #1abc9c;\n  background-color: #fff;\n  border-color: #1abc9c;\n  }\n.form-group.focus .input-group-btn .btn-default,\n.input-group.focus .input-group-btn .btn-default {\n  color: #fff;\n  background-color: #1abc9c;\n  }\n.form-group.focus .input-group-btn .btn-default:hover,\n.input-group.focus .input-group-btn .btn-default:hover,\n.form-group.focus .input-group-btn .btn-default.hover,\n.input-group.focus .input-group-btn .btn-default.hover,\n.form-group.focus .input-group-btn .btn-default:focus,\n.input-group.focus .input-group-btn .btn-default:focus,\n.form-group.focus .input-group-btn .btn-default:active,\n.input-group.focus .input-group-btn .btn-default:active,\n.form-group.focus .input-group-btn .btn-default.active,\n.input-group.focus .input-group-btn .btn-default.active,\n.open > .dropdown-toggle.form-group.focus .input-group-btn .btn-default,\n.open > .dropdown-toggle.input-group.focus .input-group-btn .btn-default {\n  color: #fff;\n  background-color: #48c9b0;\n  border-color: #48c9b0;\n  }\n.form-group.focus .input-group-btn .btn-default:active,\n.input-group.focus .input-group-btn .btn-default:active,\n.form-group.focus .input-group-btn .btn-default.active,\n.input-group.focus .input-group-btn .btn-default.active,\n.open > .dropdown-toggle.form-group.focus .input-group-btn .btn-default,\n.open > .dropdown-toggle.input-group.focus .input-group-btn .btn-default {\n  background: #16a085;\n  border-color: #16a085;\n  }\n.form-group.focus .input-group-btn .btn-default.disabled,\n.input-group.focus .input-group-btn .btn-default.disabled,\n.form-group.focus .input-group-btn .btn-default[disabled],\n.input-group.focus .input-group-btn .btn-default[disabled],\nfieldset[disabled] .form-group.focus .input-group-btn .btn-default,\nfieldset[disabled] .input-group.focus .input-group-btn .btn-default,\n.form-group.focus .input-group-btn .btn-default.disabled:hover,\n.input-group.focus .input-group-btn .btn-default.disabled:hover,\n.form-group.focus .input-group-btn .btn-default[disabled]:hover,\n.input-group.focus .input-group-btn .btn-default[disabled]:hover,\nfieldset[disabled] .form-group.focus .input-group-btn .btn-default:hover,\nfieldset[disabled] .input-group.focus .input-group-btn .btn-default:hover,\n.form-group.focus .input-group-btn .btn-default.disabled.hover,\n.input-group.focus .input-group-btn .btn-default.disabled.hover,\n.form-group.focus .input-group-btn .btn-default[disabled].hover,\n.input-group.focus .input-group-btn .btn-default[disabled].hover,\nfieldset[disabled] .form-group.focus .input-group-btn .btn-default.hover,\nfieldset[disabled] .input-group.focus .input-group-btn .btn-default.hover,\n.form-group.focus .input-group-btn .btn-default.disabled:focus,\n.input-group.focus .input-group-btn .btn-default.disabled:focus,\n.form-group.focus .input-group-btn .btn-default[disabled]:focus,\n.input-group.focus .input-group-btn .btn-default[disabled]:focus,\nfieldset[disabled] .form-group.focus .input-group-btn .btn-default:focus,\nfieldset[disabled] .input-group.focus .input-group-btn .btn-default:focus,\n.form-group.focus .input-group-btn .btn-default.disabled:active,\n.input-group.focus .input-group-btn .btn-default.disabled:active,\n.form-group.focus .input-group-btn .btn-default[disabled]:active,\n.input-group.focus .input-group-btn .btn-default[disabled]:active,\nfieldset[disabled] .form-group.focus .input-group-btn .btn-default:active,\nfieldset[disabled] .input-group.focus .input-group-btn .btn-default:active,\n.form-group.focus .input-group-btn .btn-default.disabled.active,\n.input-group.focus .input-group-btn .btn-default.disabled.active,\n.form-group.focus .input-group-btn .btn-default[disabled].active,\n.input-group.focus .input-group-btn .btn-default[disabled].active,\nfieldset[disabled] .form-group.focus .input-group-btn .btn-default.active,\nfieldset[disabled] .input-group.focus .input-group-btn .btn-default.active {\n  background-color: #bdc3c7;\n  border-color: #1abc9c;\n  }\n.form-group.focus .input-group-btn .btn-default .badge,\n.input-group.focus .input-group-btn .btn-default .badge {\n  color: #1abc9c;\n  background-color: #fff;\n  }\n.input-group-btn .btn {\n  height: 42px;\n  line-height: 18px;\n  color: #bdc3c7;\n  background-color: #fff;\n  border: 2px solid #bdc3c7;\n  }\n.input-group-btn .btn-default {\n  color: #fff;\n  background-color: #bdc3c7;\n  }\n.input-group-btn .btn-default:hover,\n.input-group-btn .btn-default.hover,\n.input-group-btn .btn-default:focus,\n.input-group-btn .btn-default:active,\n.input-group-btn .btn-default.active,\n.open > .dropdown-toggle.input-group-btn .btn-default {\n  color: #fff;\n  background-color: #cacfd2;\n  border-color: #cacfd2;\n  }\n.input-group-btn .btn-default:active,\n.input-group-btn .btn-default.active,\n.open > .dropdown-toggle.input-group-btn .btn-default {\n  background: #a1a6a9;\n  border-color: #a1a6a9;\n  }\n.input-group-btn .btn-default.disabled,\n.input-group-btn .btn-default[disabled],\nfieldset[disabled] .input-group-btn .btn-default,\n.input-group-btn .btn-default.disabled:hover,\n.input-group-btn .btn-default[disabled]:hover,\nfieldset[disabled] .input-group-btn .btn-default:hover,\n.input-group-btn .btn-default.disabled.hover,\n.input-group-btn .btn-default[disabled].hover,\nfieldset[disabled] .input-group-btn .btn-default.hover,\n.input-group-btn .btn-default.disabled:focus,\n.input-group-btn .btn-default[disabled]:focus,\nfieldset[disabled] .input-group-btn .btn-default:focus,\n.input-group-btn .btn-default.disabled:active,\n.input-group-btn .btn-default[disabled]:active,\nfieldset[disabled] .input-group-btn .btn-default:active,\n.input-group-btn .btn-default.disabled.active,\n.input-group-btn .btn-default[disabled].active,\nfieldset[disabled] .input-group-btn .btn-default.active {\n  background-color: #bdc3c7;\n  border-color: #bdc3c7;\n  }\n.input-group-btn .btn-default .badge {\n  color: #bdc3c7;\n  background-color: #fff;\n  }\n.input-group-hg .input-group-btn .btn {\n  line-height: 31px;\n  }\n.input-group-lg .input-group-btn .btn {\n  line-height: 21px;\n  }\n.input-group-sm .input-group-btn .btn {\n  line-height: 19px;\n  }\n.input-group-btn:first-child > .btn {\n  margin-right: -3px;\n  border-right-width: 0;\n  }\n.input-group-btn:last-child > .btn {\n  margin-left: -3px;\n  border-left-width: 0;\n  }\n.input-group-btn > .btn-default + .btn-default {\n  border-left: 2px solid #bdc3c7;\n  }\n.input-group-btn > .btn:first-child + .btn .caret {\n  margin-left: 0;\n  }\n.input-group-rounded .input-group-btn + .form-control,\n.input-group-rounded .input-group-btn:last-child .btn,\n.input-group-rounded .input-group-btn + .select2-search input[type=\"text\"] {\n  border-top-right-radius: 20px;\n  border-bottom-right-radius: 20px;\n  }\n.input-group-hg.input-group-rounded .input-group-btn + .form-control,\n.input-group-hg.input-group-rounded .input-group-btn:last-child .btn,\n.input-group-hg.input-group-rounded .input-group-btn + .select2-search input[type=\"text\"] {\n  border-top-right-radius: 27px;\n  border-bottom-right-radius: 27px;\n  }\n.input-group-lg.input-group-rounded .input-group-btn + .form-control,\n.input-group-lg.input-group-rounded .input-group-btn:last-child .btn,\n.input-group-lg.input-group-rounded .input-group-btn + .select2-search input[type=\"text\"] {\n  border-top-right-radius: 25px;\n  border-bottom-right-radius: 25px;\n  }\n.input-group-rounded .form-control:first-child,\n.input-group-rounded .input-group-btn:first-child .btn,\n.input-group-rounded .select2-search input[type=\"text\"]:first-child {\n  border-top-left-radius: 20px;\n  border-bottom-left-radius: 20px;\n  }\n.input-group-hg.input-group-rounded .form-control:first-child,\n.input-group-hg.input-group-rounded .input-group-btn:first-child .btn,\n.input-group-hg.input-group-rounded .select2-search input[type=\"text\"]:first-child {\n  border-top-left-radius: 27px;\n  border-bottom-left-radius: 27px;\n  }\n.input-group-lg.input-group-rounded .form-control:first-child,\n.input-group-lg.input-group-rounded .input-group-btn:first-child .btn,\n.input-group-lg.input-group-rounded .select2-search input[type=\"text\"]:first-child {\n  border-top-left-radius: 25px;\n  border-bottom-left-radius: 25px;\n  }\n.input-group-rounded .input-group-btn + .form-control,\n.input-group-rounded .input-group-btn + .select2-search input[type=\"text\"] {\n  padding-left: 0;\n  }\n.checkbox,\n.radio {\n  position: relative;\n  padding-left: 32px;\n  margin-bottom: 12px;\n  font-size: 14px;\n  line-height: 1.5;\n  -webkit-transition: color .25s linear;\n          transition: color .25s linear;\n  }\n.checkbox .icons,\n.radio .icons {\n  position: absolute;\n  top: 0;\n  left: 0;\n  display: block;\n  width: 20px;\n  height: 20px;\n  font-size: 20px;\n  line-height: 20px;\n  color: #bdc3c7;\n  text-align: center;\n  cursor: pointer;\n  }\n.checkbox .icons .icon-checked,\n.radio .icons .icon-checked {\n  filter: alpha(opacity=0);\n  opacity: 0;\n  }\n.checkbox .icon-checked,\n.radio .icon-checked,\n.checkbox .icon-unchecked,\n.radio .icon-unchecked {\n  position: absolute;\n  top: 0;\n  left: 0;\n  display: inline-table;\n  margin: 0;\n  background-color: transparent;\n          filter: none;\n  opacity: 1;\n  -webkit-transition: color .25s linear;\n          transition: color .25s linear;\n\n  -webkit-filter: none;\n  }\n.checkbox .icon-checked:before,\n.radio .icon-checked:before,\n.checkbox .icon-unchecked:before,\n.radio .icon-unchecked:before {\n  font-family: 'Flat-UI-Icons';\n  font-style: normal;\n  font-weight: normal;\n  font-variant: normal;\n  text-transform: none;\n\n  speak: none;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  }\n.checkbox .icon-checked:before {\n  content: \"\\e60e\";\n  }\n.checkbox .icon-unchecked:before {\n  content: \"\\e60d\";\n  }\n.radio .icon-checked:before {\n  content: \"\\e60c\";\n  }\n.radio .icon-unchecked:before {\n  content: \"\\e60b\";\n  }\n.checkbox input[type=\"checkbox\"].custom-checkbox,\n.radio input[type=\"checkbox\"].custom-checkbox,\n.checkbox input[type=\"radio\"].custom-radio,\n.radio input[type=\"radio\"].custom-radio {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 20px;\n  height: 20px;\n  padding: 0;\n  margin: 0;\n  outline: none !important;\n  opacity: 0;\n  }\n.checkbox input[type=\"checkbox\"].custom-checkbox:hover:not(.nohover):not(:disabled) + .icons .icon-unchecked,\n.radio input[type=\"checkbox\"].custom-checkbox:hover:not(.nohover):not(:disabled) + .icons .icon-unchecked,\n.checkbox input[type=\"radio\"].custom-radio:hover:not(.nohover):not(:disabled) + .icons .icon-unchecked,\n.radio input[type=\"radio\"].custom-radio:hover:not(.nohover):not(:disabled) + .icons .icon-unchecked {\n  filter: alpha(opacity=0);\n  opacity: 0;\n  }\n.checkbox input[type=\"checkbox\"].custom-checkbox:hover:not(.nohover):not(:disabled) + .icons .icon-checked,\n.radio input[type=\"checkbox\"].custom-checkbox:hover:not(.nohover):not(:disabled) + .icons .icon-checked,\n.checkbox input[type=\"radio\"].custom-radio:hover:not(.nohover):not(:disabled) + .icons .icon-checked,\n.radio input[type=\"radio\"].custom-radio:hover:not(.nohover):not(:disabled) + .icons .icon-checked {\n          filter: none;\n  opacity: 1;\n\n  -webkit-filter: none;\n  }\n.checkbox input[type=\"checkbox\"].custom-checkbox:checked + .icons,\n.radio input[type=\"checkbox\"].custom-checkbox:checked + .icons,\n.checkbox input[type=\"radio\"].custom-radio:checked + .icons,\n.radio input[type=\"radio\"].custom-radio:checked + .icons {\n  color: #1abc9c;\n  }\n.checkbox input[type=\"checkbox\"].custom-checkbox:checked + .icons .icon-unchecked,\n.radio input[type=\"checkbox\"].custom-checkbox:checked + .icons .icon-unchecked,\n.checkbox input[type=\"radio\"].custom-radio:checked + .icons .icon-unchecked,\n.radio input[type=\"radio\"].custom-radio:checked + .icons .icon-unchecked {\n  filter: alpha(opacity=0);\n  opacity: 0;\n  }\n.checkbox input[type=\"checkbox\"].custom-checkbox:checked + .icons .icon-checked,\n.radio input[type=\"checkbox\"].custom-checkbox:checked + .icons .icon-checked,\n.checkbox input[type=\"radio\"].custom-radio:checked + .icons .icon-checked,\n.radio input[type=\"radio\"].custom-radio:checked + .icons .icon-checked {\n  color: #1abc9c;\n          filter: none;\n  opacity: 1;\n\n  -webkit-filter: none;\n  }\n.checkbox input[type=\"checkbox\"].custom-checkbox:disabled + .icons,\n.radio input[type=\"checkbox\"].custom-checkbox:disabled + .icons,\n.checkbox input[type=\"radio\"].custom-radio:disabled + .icons,\n.radio input[type=\"radio\"].custom-radio:disabled + .icons {\n  color: #e6e8ea;\n  cursor: default;\n  }\n.checkbox input[type=\"checkbox\"].custom-checkbox:disabled + .icons .icon-unchecked,\n.radio input[type=\"checkbox\"].custom-checkbox:disabled + .icons .icon-unchecked,\n.checkbox input[type=\"radio\"].custom-radio:disabled + .icons .icon-unchecked,\n.radio input[type=\"radio\"].custom-radio:disabled + .icons .icon-unchecked {\n          filter: none;\n  opacity: 1;\n\n  -webkit-filter: none;\n  }\n.checkbox input[type=\"checkbox\"].custom-checkbox:disabled + .icons .icon-checked,\n.radio input[type=\"checkbox\"].custom-checkbox:disabled + .icons .icon-checked,\n.checkbox input[type=\"radio\"].custom-radio:disabled + .icons .icon-checked,\n.radio input[type=\"radio\"].custom-radio:disabled + .icons .icon-checked {\n  filter: alpha(opacity=0);\n  opacity: 0;\n  }\n.checkbox input[type=\"checkbox\"].custom-checkbox:disabled:checked + .icons,\n.radio input[type=\"checkbox\"].custom-checkbox:disabled:checked + .icons,\n.checkbox input[type=\"radio\"].custom-radio:disabled:checked + .icons,\n.radio input[type=\"radio\"].custom-radio:disabled:checked + .icons {\n  color: #e6e8ea;\n  }\n.checkbox input[type=\"checkbox\"].custom-checkbox:disabled:checked + .icons .icon-unchecked,\n.radio input[type=\"checkbox\"].custom-checkbox:disabled:checked + .icons .icon-unchecked,\n.checkbox input[type=\"radio\"].custom-radio:disabled:checked + .icons .icon-unchecked,\n.radio input[type=\"radio\"].custom-radio:disabled:checked + .icons .icon-unchecked {\n  filter: alpha(opacity=0);\n  opacity: 0;\n  }\n.checkbox input[type=\"checkbox\"].custom-checkbox:disabled:checked + .icons .icon-checked,\n.radio input[type=\"checkbox\"].custom-checkbox:disabled:checked + .icons .icon-checked,\n.checkbox input[type=\"radio\"].custom-radio:disabled:checked + .icons .icon-checked,\n.radio input[type=\"radio\"].custom-radio:disabled:checked + .icons .icon-checked {\n  color: #e6e8ea;\n          filter: none;\n  opacity: 1;\n\n  -webkit-filter: none;\n  }\n.checkbox input[type=\"checkbox\"].custom-checkbox:indeterminate + .icons,\n.radio input[type=\"checkbox\"].custom-checkbox:indeterminate + .icons,\n.checkbox input[type=\"radio\"].custom-radio:indeterminate + .icons,\n.radio input[type=\"radio\"].custom-radio:indeterminate + .icons {\n  color: #bdc3c7;\n  }\n.checkbox input[type=\"checkbox\"].custom-checkbox:indeterminate + .icons .icon-unchecked,\n.radio input[type=\"checkbox\"].custom-checkbox:indeterminate + .icons .icon-unchecked,\n.checkbox input[type=\"radio\"].custom-radio:indeterminate + .icons .icon-unchecked,\n.radio input[type=\"radio\"].custom-radio:indeterminate + .icons .icon-unchecked {\n          filter: none;\n  opacity: 1;\n\n  -webkit-filter: none;\n  }\n.checkbox input[type=\"checkbox\"].custom-checkbox:indeterminate + .icons .icon-checked,\n.radio input[type=\"checkbox\"].custom-checkbox:indeterminate + .icons .icon-checked,\n.checkbox input[type=\"radio\"].custom-radio:indeterminate + .icons .icon-checked,\n.radio input[type=\"radio\"].custom-radio:indeterminate + .icons .icon-checked {\n  filter: alpha(opacity=0);\n  opacity: 0;\n  }\n.checkbox input[type=\"checkbox\"].custom-checkbox:indeterminate + .icons:before,\n.radio input[type=\"checkbox\"].custom-checkbox:indeterminate + .icons:before,\n.checkbox input[type=\"radio\"].custom-radio:indeterminate + .icons:before,\n.radio input[type=\"radio\"].custom-radio:indeterminate + .icons:before {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 10;\n  width: 20px;\n  font-size: 22px;\n  line-height: 20px;\n  color: #fff;\n  text-align: center;\n  content: \"\\2013\";\n  }\n.checkbox.primary input[type=\"checkbox\"].custom-checkbox + .icons,\n.radio.primary input[type=\"checkbox\"].custom-checkbox + .icons,\n.checkbox.primary input[type=\"radio\"].custom-radio + .icons,\n.radio.primary input[type=\"radio\"].custom-radio + .icons {\n  color: #34495e;\n  }\n.checkbox.primary input[type=\"checkbox\"].custom-checkbox:checked + .icons,\n.radio.primary input[type=\"checkbox\"].custom-checkbox:checked + .icons,\n.checkbox.primary input[type=\"radio\"].custom-radio:checked + .icons,\n.radio.primary input[type=\"radio\"].custom-radio:checked + .icons {\n  color: #1abc9c;\n  }\n.checkbox.primary input[type=\"checkbox\"].custom-checkbox:disabled + .icons,\n.radio.primary input[type=\"checkbox\"].custom-checkbox:disabled + .icons,\n.checkbox.primary input[type=\"radio\"].custom-radio:disabled + .icons,\n.radio.primary input[type=\"radio\"].custom-radio:disabled + .icons {\n  color: #bdc3c7;\n  cursor: default;\n  }\n.checkbox.primary input[type=\"checkbox\"].custom-checkbox:disabled + .icons.checked,\n.radio.primary input[type=\"checkbox\"].custom-checkbox:disabled + .icons.checked,\n.checkbox.primary input[type=\"radio\"].custom-radio:disabled + .icons.checked,\n.radio.primary input[type=\"radio\"].custom-radio:disabled + .icons.checked {\n  color: #bdc3c7;\n  }\n.checkbox.primary input[type=\"checkbox\"].custom-checkbox:indeterminate + .icons,\n.radio.primary input[type=\"checkbox\"].custom-checkbox:indeterminate + .icons,\n.checkbox.primary input[type=\"radio\"].custom-radio:indeterminate + .icons,\n.radio.primary input[type=\"radio\"].custom-radio:indeterminate + .icons {\n  color: #34495e;\n  }\n.input-group-addon .radio,\n.input-group-addon .checkbox {\n  padding-left: 20px;\n  margin: -2px 0;\n  }\n.input-group-addon .radio .icons,\n.input-group-addon .checkbox .icons {\n  color: #e6e8ea;\n  }\n.input-group-addon .radio input[type=\"checkbox\"].custom-checkbox:checked + .icons,\n.input-group-addon .checkbox input[type=\"checkbox\"].custom-checkbox:checked + .icons,\n.input-group-addon .radio input[type=\"radio\"].custom-radio:checked + .icons,\n.input-group-addon .checkbox input[type=\"radio\"].custom-radio:checked + .icons {\n  color: #fff;\n  }\n.input-group-addon .radio input[type=\"checkbox\"].custom-checkbox:checked + .icons .icon-checked,\n.input-group-addon .checkbox input[type=\"checkbox\"].custom-checkbox:checked + .icons .icon-checked,\n.input-group-addon .radio input[type=\"radio\"].custom-radio:checked + .icons .icon-checked,\n.input-group-addon .checkbox input[type=\"radio\"].custom-radio:checked + .icons .icon-checked {\n  color: #fff;\n  }\n.input-group-addon .radio input[type=\"checkbox\"].custom-checkbox:disabled + .icons,\n.input-group-addon .checkbox input[type=\"checkbox\"].custom-checkbox:disabled + .icons,\n.input-group-addon .radio input[type=\"radio\"].custom-radio:disabled + .icons,\n.input-group-addon .checkbox input[type=\"radio\"].custom-radio:disabled + .icons {\n  color: rgba(230, 232, 234, .6);\n  }\n.input-group-addon .radio input[type=\"checkbox\"].custom-checkbox:disabled:checked + .icons,\n.input-group-addon .checkbox input[type=\"checkbox\"].custom-checkbox:disabled:checked + .icons,\n.input-group-addon .radio input[type=\"radio\"].custom-radio:disabled:checked + .icons,\n.input-group-addon .checkbox input[type=\"radio\"].custom-radio:disabled:checked + .icons {\n  color: rgba(230, 232, 234, .6);\n  }\n.input-group-addon .radio input[type=\"checkbox\"].custom-checkbox:disabled:checked + .icons .icon-checked,\n.input-group-addon .checkbox input[type=\"checkbox\"].custom-checkbox:disabled:checked + .icons .icon-checked,\n.input-group-addon .radio input[type=\"radio\"].custom-radio:disabled:checked + .icons .icon-checked,\n.input-group-addon .checkbox input[type=\"radio\"].custom-radio:disabled:checked + .icons .icon-checked {\n  color: rgba(230, 232, 234, .6);\n  }\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: 10px;\n  }\n.form-inline .checkbox,\n.form-inline .radio {\n  padding-left: 32px;\n  }\n.bootstrap-tagsinput {\n  padding: 6px 1px 1px 6px;\n  margin-bottom: 18px;\n  font-size: 0;\n  text-align: left;\n  background-color: #fff;\n  border: 2px solid #ebedef;\n  border-radius: 6px;\n  }\n.bootstrap-tagsinput .tag {\n  position: relative;\n  display: inline-block;\n  height: 27px;\n  padding: 6px 21px;\n  margin: 0 5px 5px 0;\n  overflow: hidden;\n  font-size: 13px;\n  line-height: 15px;\n  color: #7b8996;\n  vertical-align: middle;\n  cursor: pointer;\n  background-color: #ebedef;\n  border-radius: 4px;\n  -webkit-transition: .25s linear;\n          transition: .25s linear;\n  }\n.bootstrap-tagsinput .tag > span {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  z-index: 2;\n  width: 100%;\n  padding: 0 10px 0 0;\n  font-size: 12px;\n  color: #fff;\n  text-align: right;\n  text-decoration: none;\n  cursor: pointer;\n  filter: alpha(opacity=0);\n  opacity: 0;\n  -webkit-transition: opacity .25s linear;\n          transition: opacity .25s linear;\n  }\n.bootstrap-tagsinput .tag > span:after {\n  font-family: \"Flat-UI-Icons\";\n  line-height: 27px;\n  content: \"\\e609\";\n\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  }\n.bootstrap-tagsinput .tag:hover {\n  padding-right: 28px;\n  padding-left: 14px;\n  color: #fff;\n  background-color: #16a085;\n  }\n.bootstrap-tagsinput .tag:hover > span {\n          filter: none;\n  opacity: 1;\n\n  -webkit-filter: none;\n  }\n.bootstrap-tagsinput input[type=\"text\"] {\n  width: auto !important;\n  min-width: 80px;\n  max-width: inherit;\n  height: 29px;\n  padding: 0;\n  margin: 0;\n  font-size: 14px;\n  color: #34495e;\n  vertical-align: top;\n  background-color: transparent;\n  border: none;\n  outline: none;\n  box-shadow: none;\n  }\n.bootstrap-tagsinput input[type=\"text\"]:first-child {\n  height: 23px;\n  margin: 3px 0 8px;\n  }\n.tags_clear {\n  width: 100%;\n  height: 0;\n  clear: both;\n  }\n.not_valid {\n  margin-left: 5px !important;\n  color: #90111a !important;\n  background: #fbd8db !important;\n  }\n.tagsinput-primary {\n  margin-bottom: 18px;\n  }\n.tagsinput-primary .bootstrap-tagsinput {\n  margin-bottom: 0;\n  border-color: #1abc9c;\n  }\n.tagsinput-primary .tag {\n  color: #fff;\n  background-color: #1abc9c;\n  }\n.tagsinput-primary .tag:hover {\n  color: #fff;\n  background-color: #16a085;\n  }\n.bootstrap-tagsinput .twitter-typeahead {\n  width: auto;\n  vertical-align: top;\n  }\n.bootstrap-tagsinput .twitter-typeahead .tt-input {\n  min-width: 200px;\n  }\n.bootstrap-tagsinput .twitter-typeahead .tt-dropdown-menu {\n  width: auto;\n  min-width: 120px;\n  margin-top: 11px;\n  }\n.twitter-typeahead {\n  width: 100%;\n  }\n.twitter-typeahead .tt-dropdown-menu {\n  width: 100%;\n  padding: 5px 0;\n  margin-top: 5px;\n  background-color: #fff;\n  border: 2px solid #1abc9c;\n  border-radius: 6px;\n  }\n.twitter-typeahead .tt-suggestion p {\n  padding: 6px 14px;\n  margin: 0;\n  font-size: 14px;\n  line-height: 1.429;\n  }\n.twitter-typeahead .tt-suggestion:first-child p,\n.twitter-typeahead .tt-suggestion:last-child p {\n  padding: 6px 14px;\n  }\n.twitter-typeahead .tt-suggestion.tt-is-under-cursor,\n.twitter-typeahead .tt-suggestion.tt-cursor {\n  color: #fff;\n  cursor: pointer;\n  background-color: #16a085;\n  }\n.progress {\n  height: 12px;\n  background: #ebedef;\n  border-radius: 32px;\n  box-shadow: none;\n  }\n.progress-bar {\n  line-height: 12px;\n  background: #1abc9c;\n  box-shadow: none;\n  }\n.progress-bar-success {\n  background-color: #2ecc71;\n  }\n.progress-bar-warning {\n  background-color: #f1c40f;\n  }\n.progress-bar-danger {\n  background-color: #e74c3c;\n  }\n.progress-bar-info {\n  background-color: #3498db;\n  }\n.ui-slider {\n  position: relative;\n  height: 12px;\n  margin-bottom: 20px;\n  cursor: pointer;\n  background: #ebedef;\n  border-radius: 32px;\n  box-shadow: none;\n  }\n.ui-slider-handle {\n  position: absolute;\n  z-index: 2;\n  width: 18px;\n  height: 18px;\n  cursor: pointer;\n  background-color: #16a085;\n  border-radius: 50%;\n  -webkit-transition: background .25s;\n          transition: background .25s;\n  }\n.ui-slider-handle:hover,\n.ui-slider-handle:focus {\n  background-color: #48c9b0;\n  outline: none;\n  }\n.ui-slider-handle:active {\n  background-color: #16a085;\n  }\n.ui-slider-range {\n  position: absolute;\n  z-index: 1;\n  display: block;\n  height: 100%;\n  background-color: #1abc9c;\n  }\n.ui-slider-segment {\n  width: 6px;\n  height: 6px;\n  background-color: #d9dbdd;\n  border-radius: 50%;\n  }\n.ui-slider-value {\n  float: right;\n  margin-top: 12px;\n  font-size: 13px;\n  }\n.ui-slider-value.first {\n  float: left;\n  clear: left;\n  }\n.ui-slider-horizontal .ui-slider-handle {\n  top: -3px;\n  margin-left: -9px;\n  }\n.ui-slider-horizontal .ui-slider-handle[style*=\"100\"] {\n  margin-left: -15px;\n  }\n.ui-slider-horizontal .ui-slider-range {\n  border-radius: 30px 0 0 30px;\n  }\n.ui-slider-horizontal .ui-slider-segment {\n  float: left;\n  margin: 3px -6px 0 0;\n  }\n.ui-slider-vertical {\n  width: 12px;\n  }\n.ui-slider-vertical .ui-slider-handle {\n  top: auto;\n  margin-bottom: -11px;\n  margin-left: -3px;\n  }\n.ui-slider-vertical .ui-slider-range {\n  bottom: 0;\n  width: 100%;\n  border-radius: 0 0 30px 30px;\n  }\n.ui-slider-vertical .ui-slider-segment {\n  position: absolute;\n  right: 3px;\n  }\n.pager {\n  display: inline-block;\n  font-size: 16px;\n  font-weight: 700;\n  color: #fff;\n  background-color: #34495e;\n  border-radius: 6px;\n  }\n.pager li:first-child > a,\n.pager li:first-child > span {\n  border-left: none;\n  border-radius: 6px 0 0 6px;\n  }\n.pager li > a,\n.pager li > span {\n  padding: 9px 15px 10px;\n  line-height: 1.313;\n  color: #fff;\n  text-decoration: none;\n  white-space: nowrap;\n  background: none;\n  border: none;\n  border-left: 2px solid #2c3e50;\n  border-radius: 0 6px 6px 0;\n  }\n.pager li > a:hover,\n.pager li > span:hover,\n.pager li > a:focus,\n.pager li > span:focus {\n  background-color: #2c3e50;\n  }\n.pager li > a:active,\n.pager li > span:active {\n  background-color: #2c3e50;\n  }\n.pager li > a [class*=\"fui-\"] + span,\n.pager li > span [class*=\"fui-\"] + span {\n  margin-left: 8px;\n  }\n.pager li > a span + [class*=\"fui-\"],\n.pager li > span span + [class*=\"fui-\"] {\n  margin-left: 8px;\n  }\n.pagination {\n  position: relative;\n  display: block;\n  }\n@media (min-width: 768px) {\n  .pagination {\n    display: inline-block;\n    }\n  }\n.pagination > ul {\n  display: inline-block;\n  padding: 0;\n  margin: 0;\n  color: #fff;\n  word-spacing: -.5px;\n  background: #d6dbdf;\n  border-radius: 6px;\n  }\n@media (max-width: 767px) {\n  .pagination > ul {\n    height: 41px;\n    padding: 0 55px 0 52px;\n    overflow: auto;\n    white-space: nowrap;\n    border-radius: 6px;\n    }\n  }\n.pagination li {\n  display: inline-block;\n  margin-right: -3px;\n  word-spacing: normal;\n  vertical-align: middle;\n  }\n.pagination li.active > a,\n.pagination li.active > span {\n  color: #fff;\n  background-color: #1abc9c;\n  border-color: #dfe2e5;\n  }\n.pagination li.active.previous > a,\n.pagination li.active.next > a,\n.pagination li.active.previous > span,\n.pagination li.active.next > span {\n  margin: 0;\n  }\n.pagination li.active.previous > a,\n.pagination li.active.next > a,\n.pagination li.active.previous > span,\n.pagination li.active.next > span,\n.pagination li.active.previous > a:hover,\n.pagination li.active.next > a:hover,\n.pagination li.active.previous > span:hover,\n.pagination li.active.next > span:hover,\n.pagination li.active.previous > a:focus,\n.pagination li.active.next > a:focus,\n.pagination li.active.previous > span:focus,\n.pagination li.active.next > span:focus {\n  color: #fff;\n  background-color: #1abc9c;\n  }\n.pagination li:first-child > a,\n.pagination li:first-child > span {\n  border-left: none;\n  border-radius: 6px 0 0 6px;\n  }\n.pagination li:first-child.previous + li > a,\n.pagination li:first-child.previous + li > span {\n  border-left-width: 0;\n  }\n.pagination li:last-child {\n  margin-right: 0;\n  }\n.pagination li:last-child > a,\n.pagination li:last-child > span,\n.pagination li:last-child > a:hover,\n.pagination li:last-child > span:hover,\n.pagination li:last-child > a:focus,\n.pagination li:last-child > span:focus {\n  border-radius: 0 6px 6px 0;\n  }\n.pagination li.previous > a,\n.pagination li.next > a,\n.pagination li.previous > span,\n.pagination li.next > span {\n  min-width: auto;\n  padding: 12px 17px;\n  font-size: 16px;\n  background-color: transparent;\n  border-right: 2px solid #e4e7ea;\n  }\n.pagination li.next > a,\n.pagination li.next > span {\n  border-right: none;\n  }\n.pagination li.disabled > a,\n.pagination li.disabled > span {\n  color: #fff;\n  cursor: not-allowed;\n  background-color: rgba(255, 255, 255, .3);\n  border-right-color: #dfe2e5;\n  }\n.pagination li.disabled > a:hover,\n.pagination li.disabled > span:hover,\n.pagination li.disabled > a:focus,\n.pagination li.disabled > span:focus,\n.pagination li.disabled > a:active,\n.pagination li.disabled > span:active {\n  color: #fff;\n  background-color: rgba(255, 255, 255, .4);\n  }\n@media (max-width: 767px) {\n  .pagination li.next,\n  .pagination li.previous {\n    position: absolute;\n    top: 0;\n    right: 0;\n    z-index: 10;\n    background-color: #d6dbdf;\n    border-radius: 0 6px 6px 0;\n    }\n  .pagination li.previous {\n    right: auto;\n    left: 0;\n    border-radius: 6px 0 0 6px;\n    }\n  }\n.pagination li > a,\n.pagination li > span {\n  display: inline-block;\n  min-width: 41px;\n  min-height: 41px;\n  padding: 12px 10px;\n  font-size: 14px;\n  line-height: 16px;\n  color: #fff;\n  text-align: center;\n  background: transparent;\n  border: none;\n  border-left: 2px solid #e4e7ea;\n  outline: none;\n  -webkit-transition: .25s ease-out;\n          transition: .25s ease-out;\n  }\n.pagination li > a:hover,\n.pagination li > span:hover,\n.pagination li > a:focus,\n.pagination li > span:focus {\n  color: #fff;\n  background-color: #1abc9c;\n  }\n.pagination li > a:active,\n.pagination li > span:active {\n  color: #fff;\n  background-color: #1abc9c;\n  }\n.pagination > .btn.previous,\n.pagination > .btn.next {\n  padding-right: 23px;\n  padding-left: 23px;\n  margin-right: 8px;\n  font-size: 14px;\n  line-height: 1.429;\n  }\n.pagination > .btn.previous [class*=\"fui-\"],\n.pagination > .btn.next [class*=\"fui-\"] {\n  margin-top: -2px;\n  margin-left: -2px;\n  font-size: 16px;\n  }\n.pagination > .btn.next {\n  margin-right: 0;\n  margin-left: 8px;\n  }\n.pagination > .btn.next [class*=\"fui-\"] {\n  margin-right: -2px;\n  margin-left: 4px;\n  }\n@media (max-width: 767px) {\n  .pagination > .btn {\n    display: block;\n    width: 50%;\n    margin: 0;\n    }\n  .pagination > .btn:first-child {\n    border-bottom: 2px solid #dfe2e5;\n    border-radius: 6px 0 0;\n    }\n  .pagination > .btn:first-child.btn-primary {\n    border-bottom-color: #48c9b0;\n    }\n  .pagination > .btn:first-child.btn-danger {\n    border-bottom-color: #ec7063;\n    }\n  .pagination > .btn:first-child.btn-warning {\n    border-bottom-color: #f4d03f;\n    }\n  .pagination > .btn:first-child.btn-success {\n    border-bottom-color: #58d68d;\n    }\n  .pagination > .btn:first-child.btn-info {\n    border-bottom-color: #5dade2;\n    }\n  .pagination > .btn:first-child.btn-inverse {\n    border-bottom-color: #5d6d7e;\n    }\n  .pagination > .btn:first-child > [class*=\"fui\"] {\n    margin-left: -20px;\n    }\n  .pagination > .btn + ul {\n    padding: 0;\n    text-align: center;\n    border-radius: 0 0 6px 6px;\n    }\n  .pagination > .btn + ul + .btn {\n    position: absolute;\n    top: 0;\n    right: 0;\n    border-bottom: 2px solid #dfe2e5;\n    border-radius: 0 6px 0 0;\n    }\n  .pagination > .btn + ul + .btn.btn-primary {\n    border-bottom-color: #48c9b0;\n    }\n  .pagination > .btn + ul + .btn.btn-danger {\n    border-bottom-color: #ec7063;\n    }\n  .pagination > .btn + ul + .btn.btn-warning {\n    border-bottom-color: #f4d03f;\n    }\n  .pagination > .btn + ul + .btn.btn-success {\n    border-bottom-color: #58d68d;\n    }\n  .pagination > .btn + ul + .btn.btn-info {\n    border-bottom-color: #5dade2;\n    }\n  .pagination > .btn + ul + .btn.btn-inverse {\n    border-bottom-color: #5d6d7e;\n    }\n  .pagination > .btn + ul + .btn > [class*=\"fui\"] {\n    margin-right: -20px;\n    }\n  .pagination ul {\n    display: block;\n    }\n  .pagination ul > li > a {\n    border-radius: 0;\n    }\n  }\n.pagination-danger ul {\n  background-color: #e74c3c;\n  }\n.pagination-danger ul li.previous > a {\n  border-right-color: #ef897e;\n  }\n.pagination-danger ul li > a,\n.pagination-danger ul li > span {\n  border-left-color: #ef897e;\n  }\n.pagination-danger ul li > a:hover,\n.pagination-danger ul li > span:hover,\n.pagination-danger ul li > a:focus,\n.pagination-danger ul li > span:focus {\n  background-color: #ec7063;\n  }\n.pagination-danger ul li > a:active,\n.pagination-danger ul li > span:active {\n  background-color: #c44133;\n  }\n.pagination-danger ul li.active > a,\n.pagination-danger ul li.active > span {\n  background-color: #c44133;\n  }\n.pagination-success ul {\n  background-color: #2ecc71;\n  }\n.pagination-success ul li.previous > a {\n  border-right-color: #75dda1;\n  }\n.pagination-success ul li > a,\n.pagination-success ul li > span {\n  border-left-color: #75dda1;\n  }\n.pagination-success ul li > a:hover,\n.pagination-success ul li > span:hover,\n.pagination-success ul li > a:focus,\n.pagination-success ul li > span:focus {\n  background-color: #58d68d;\n  }\n.pagination-success ul li > a:active,\n.pagination-success ul li > span:active {\n  background-color: #27ad60;\n  }\n.pagination-success ul li.active > a,\n.pagination-success ul li.active > span {\n  background-color: #27ad60;\n  }\n.pagination-warning ul {\n  background-color: #f1c40f;\n  }\n.pagination-warning ul li.previous > a {\n  border-right-color: #f6d861;\n  }\n.pagination-warning ul li > a,\n.pagination-warning ul li > span {\n  border-left-color: #f6d861;\n  }\n.pagination-warning ul li > a:hover,\n.pagination-warning ul li > span:hover,\n.pagination-warning ul li > a:focus,\n.pagination-warning ul li > span:focus {\n  background-color: #f4d313;\n  }\n.pagination-warning ul li > a:active,\n.pagination-warning ul li > span:active {\n  background-color: #cda70d;\n  }\n.pagination-warning ul li.active > a,\n.pagination-warning ul li.active > span {\n  background-color: #cda70d;\n  }\n.pagination-info ul {\n  background-color: #3498db;\n  }\n.pagination-info ul li.previous > a {\n  border-right-color: #79bbe7;\n  }\n.pagination-info ul li > a,\n.pagination-info ul li > span {\n  border-left-color: #79bbe7;\n  }\n.pagination-info ul li > a:hover,\n.pagination-info ul li > span:hover,\n.pagination-info ul li > a:focus,\n.pagination-info ul li > span:focus {\n  background-color: #5dade2;\n  }\n.pagination-info ul li > a:active,\n.pagination-info ul li > span:active {\n  background-color: #2c81ba;\n  }\n.pagination-info ul li.active > a,\n.pagination-info ul li.active > span {\n  background-color: #2c81ba;\n  }\n.pagination-inverse ul {\n  background-color: #34495e;\n  }\n.pagination-inverse ul li.previous > a {\n  border-right-color: #798795;\n  }\n.pagination-inverse ul li > a,\n.pagination-inverse ul li > span {\n  border-left-color: #798795;\n  }\n.pagination-inverse ul li > a:hover,\n.pagination-inverse ul li > span:hover,\n.pagination-inverse ul li > a:focus,\n.pagination-inverse ul li > span:focus {\n  background-color: #415b76;\n  }\n.pagination-inverse ul li > a:active,\n.pagination-inverse ul li > span:active {\n  background-color: #2c3e50;\n  }\n.pagination-inverse ul li.active > a,\n.pagination-inverse ul li.active > span {\n  background-color: #2c3e50;\n  }\n.pagination-minimal > ul > li:first-child {\n  border-radius: 6px 0 0 6px;\n  }\n.pagination-minimal > ul > li:first-child.previous + li > a,\n.pagination-minimal > ul > li:first-child.previous + li > span {\n  border-left-width: 5px;\n  }\n.pagination-minimal > ul > li:last-child {\n  border-radius: 0 6px 6px 0;\n  }\n.pagination-minimal > ul > li.previous > a,\n.pagination-minimal > ul > li.next > a,\n.pagination-minimal > ul > li.previous > span,\n.pagination-minimal > ul > li.next > span {\n  padding: 12px 17px;\n  margin: 0 9px 0 0;\n  background: transparent;\n  border: none;\n  border-right: 2px solid #e4e7ea;\n  border-radius: 6px 0 0 6px;\n  }\n.pagination-minimal > ul > li.previous > a,\n.pagination-minimal > ul > li.next > a,\n.pagination-minimal > ul > li.previous > span,\n.pagination-minimal > ul > li.next > span,\n.pagination-minimal > ul > li.previous > a:hover,\n.pagination-minimal > ul > li.next > a:hover,\n.pagination-minimal > ul > li.previous > span:hover,\n.pagination-minimal > ul > li.next > span:hover,\n.pagination-minimal > ul > li.previous > a:focus,\n.pagination-minimal > ul > li.next > a:focus,\n.pagination-minimal > ul > li.previous > span:focus,\n.pagination-minimal > ul > li.next > span:focus {\n  border-color: #e4e7ea !important;\n  }\n@media (max-width: 767px) {\n  .pagination-minimal > ul > li.previous > a,\n  .pagination-minimal > ul > li.next > a,\n  .pagination-minimal > ul > li.previous > span,\n  .pagination-minimal > ul > li.next > span {\n    margin-right: 0;\n    }\n  }\n.pagination-minimal > ul > li.next {\n  margin-left: 9px;\n  }\n.pagination-minimal > ul > li.next > a,\n.pagination-minimal > ul > li.next > span {\n  margin: 0;\n  border-right: none;\n  border-left: 2px solid #e4e7ea;\n  border-radius: 0 6px 6px 0;\n  }\n.pagination-minimal > ul > li.active > a,\n.pagination-minimal > ul > li.active > span {\n  margin: 10px 5px 9px;\n  color: #d6dbdf;\n  background-color: #fff;\n  border-color: #fff;\n  border-width: 2px !important;\n  }\n.pagination-minimal > ul > li.active > a:hover,\n.pagination-minimal > ul > li.active > span:hover,\n.pagination-minimal > ul > li.active > a:focus,\n.pagination-minimal > ul > li.active > span:focus {\n  color: #d6dbdf;\n  background-color: #fff;\n  border-color: #fff;\n  }\n.pagination-minimal > ul > li.active.previous,\n.pagination-minimal > ul > li.active.next {\n  border-color: #e4e7ea;\n  }\n.pagination-minimal > ul > li.active.previous {\n  margin-right: 6px;\n  }\n.pagination-minimal > ul > li > a,\n.pagination-minimal > ul > li > span {\n  min-width: 0;\n  min-height: 16px;\n  padding: 0 4px;\n  margin: 7px 2px 6px;\n  line-height: 16px;\n  color: #fff;\n  background: #fff;\n  background-clip: padding-box;\n  border: 5px solid #d6dbdf;\n  border-radius: 50px;\n  -webkit-transition: background .2s ease-out, border-color 0s ease-out, color .2s ease-out;\n          transition: background .2s ease-out, border-color 0s ease-out, color .2s ease-out;\n  }\n.pagination-minimal > ul > li > a:hover,\n.pagination-minimal > ul > li > span:hover,\n.pagination-minimal > ul > li > a:focus,\n.pagination-minimal > ul > li > span:focus {\n  color: #fff;\n  background-color: #1abc9c;\n  border-color: #1abc9c;\n  -webkit-transition: background .2s ease-out, border-color .2s ease-out, color .2s ease-out;\n          transition: background .2s ease-out, border-color .2s ease-out, color .2s ease-out;\n  }\n.pagination-minimal > ul > li > a:active,\n.pagination-minimal > ul > li > span:active {\n  background-color: #16a085;\n  border-color: #16a085;\n  }\n.pagination-plain {\n  height: 57px;\n  padding: 0;\n  margin: 0 0 20px;\n  font-size: 16px;\n  font-weight: 700;\n  list-style-type: none;\n  }\n.pagination-plain > li {\n  display: inline;\n  }\n.pagination-plain > li.previous {\n  padding-right: 23px;\n  }\n.pagination-plain > li.next {\n  padding-left: 20px;\n  }\n.pagination-plain > li.active > a {\n  color: #d3d7da;\n  }\n.pagination-plain > li > a {\n  padding: 0 5px;\n  }\n@media (max-width: 480px) {\n  .pagination-plain {\n    overflow: hidden;\n    text-align: center;\n    }\n  .pagination-plain > li.previous {\n    display: block;\n    width: 50%;\n    margin-bottom: 10px;\n    text-align: left;\n    }\n  .pagination-plain > li.next {\n    float: right;\n    width: 50%;\n    margin-top: -64px;\n    text-align: right;\n    }\n  }\n@media (min-width: 768px) {\n  .pagination-plain {\n    height: auto;\n    }\n  }\n.pagination-dropdown ul {\n  left: 50%;\n  width: auto;\n  min-width: 67px;\n  margin-left: -34px;\n  }\n.pagination-dropdown ul li {\n  display: block;\n  margin-right: 0;\n  }\n.pagination-dropdown ul li:first-child > a,\n.pagination-dropdown ul li:first-child > span {\n  border-radius: 6px 6px 0 0;\n  }\n.pagination-dropdown ul li:last-child > a,\n.pagination-dropdown ul li:last-child > span {\n  border-radius: 0 0 6px 6px !important;\n  }\n.pagination-dropdown ul li > a,\n.pagination-dropdown ul li > span {\n  display: block;\n  float: none;\n  min-height: 0;\n  padding: 8px 10px 7px;\n  text-align: center;\n  border-left: none;\n  }\n.pagination-dropdown.dropup {\n  position: relative;\n  }\n.tooltip {\n  z-index: 1070;\n  font-size: 14px;\n  line-height: 1.286;\n  }\n.tooltip.in {\n  filter: alpha(opacity=100);\n  opacity: 1;\n  }\n.tooltip.top {\n  padding: 9px 0;\n  margin-top: -5px;\n  }\n.tooltip.right {\n  padding: 0 9px;\n  margin-left: 5px;\n  }\n.tooltip.bottom {\n  padding: 9px 0;\n  margin-top: 5px;\n  }\n.tooltip.left {\n  padding: 0 9px;\n  margin-left: -5px;\n  }\n.tooltip-inner {\n  max-width: 183px;\n  padding: 12px 12px;\n  line-height: 1.286;\n  color: #fff;\n  background-color: #34495e;\n  border-radius: 6px;\n  }\n.tooltip.top .tooltip-arrow {\n  margin-left: -9px;\n  border-width: 9px 9px 0;\n  border-top-color: #34495e;\n  }\n.tooltip.right .tooltip-arrow {\n  margin-top: -9px;\n  border-width: 9px 9px 9px 0;\n  border-right-color: #34495e;\n  }\n.tooltip.left .tooltip-arrow {\n  margin-top: -9px;\n  border-width: 9px 0 9px 9px;\n  border-left-color: #34495e;\n  }\n.tooltip.bottom .tooltip-arrow {\n  margin-left: -9px;\n  border-width: 0 9px 9px;\n  border-bottom-color: #34495e;\n  }\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 5px;\n  vertical-align: middle;\n  border-top: 8px solid;\n  border-right: 6px solid transparent;\n  border-left: 6px solid transparent;\n  -webkit-transition: border-color .25s, color .25s;\n          transition: border-color .25s, color .25s;\n  }\n.dropdown-menu,\n.select2-drop {\n  z-index: 1000;\n  min-width: 220px;\n  padding: 0;\n  margin-top: 9px;\n  font-size: 14px;\n  background-color: #f3f4f5;\n  border: none;\n  border-radius: 4px;\n  box-shadow: none;\n  }\n.dropdown-menu .divider {\n  height: 2px;\n  margin: 3px 0;\n  overflow: hidden;\n  background-color: rgba(202, 206, 209, .5);\n  }\n.dropdown-menu > li > a {\n  padding: 8px 16px;\n  line-height: 1.429;\n  color: #606d7a;\n  }\n.dropdown-menu > li:first-child > a:first-child {\n  border-top-left-radius: 4px;\n  border-top-right-radius: 4px;\n  }\n.dropdown-menu > li:last-child > a:first-child {\n  border-bottom-right-radius: 4px;\n  border-bottom-left-radius: 4px;\n  }\n.dropdown-menu.typeahead {\n  display: none;\n  width: auto;\n  padding: 5px 0;\n  margin-top: 5px;\n  background-color: #fff;\n  border: 2px solid #1abc9c;\n  border-radius: 6px;\n  }\n.dropdown-menu.typeahead li a {\n  padding: 6px 14px;\n  }\n.dropdown-menu.typeahead li:first-child a,\n.dropdown-menu.typeahead li:last-child a {\n  padding: 6px 14px;\n  border-radius: 0;\n  }\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  color: #55606c;\n  background-color: rgba(202, 206, 209, .5);\n  }\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  color: #fff;\n  background-color: #1abc9c;\n  }\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  color: #bdc3c7;\n  cursor: not-allowed;\n  background-color: transparent;\n  }\n.dropdown-menu-right {\n  right: 0;\n  left: auto;\n  }\n.dropdown-menu-left {\n  right: auto;\n  left: 0;\n  }\n.dropdown-header {\n  padding: 8px 16px;\n  font-size: 13px;\n  line-height: 1.538;\n  color: rgba(52, 73, 94, .6);\n  text-transform: uppercase;\n  }\n.dropdown-header:first-child {\n  margin-top: 3px;\n  }\n.dropdown-backdrop {\n  z-index: 990;\n  }\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n  margin-bottom: .25em;\n  border-bottom: 8px solid;\n  }\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n  margin-top: 0;\n  margin-bottom: 9px;\n  }\n.dropdown-menu-inverse {\n  background-color: #34495e;\n  }\n.dropdown-menu-inverse .divider {\n  height: 2px;\n  margin: 3px 0;\n  overflow: hidden;\n  background-color: rgba(43, 60, 78, .5);\n  }\n.dropdown-menu-inverse > li > a {\n  color: rgba(255, 255, 255, .85);\n  }\n.dropdown-menu-inverse > li > a:hover,\n.dropdown-menu-inverse > li > a:focus {\n  color: rgba(255, 255, 255, .85);\n  background-color: rgba(43, 60, 78, .5);\n  }\n.dropdown-menu-inverse > .active > a,\n.dropdown-menu-inverse > .active > a:hover,\n.dropdown-menu-inverse > .active > a:focus {\n  color: rgba(255, 255, 255, .85);\n  background-color: #1abc9c;\n  }\n.dropdown-menu-inverse > .disabled > a,\n.dropdown-menu-inverse > .disabled > a:hover,\n.dropdown-menu-inverse > .disabled > a:focus {\n  color: rgba(255, 255, 255, .5);\n  }\n.dropdown-menu-inverse > .disabled > a:hover,\n.dropdown-menu-inverse > .disabled > a:focus {\n  background-color: transparent;\n  }\n.dropdown-menu-inverse .dropdown-header {\n  color: rgba(255, 255, 255, .4);\n  }\n@media (min-width: 768px) {\n  .navbar-right .dropdown-menu {\n    right: 0;\n    left: auto;\n    }\n  .navbar-right .dropdown-menu-left {\n    right: auto;\n    left: 0;\n    }\n  }\n.select {\n  position: relative;\n  display: inline-block;\n  width: auto;\n  min-width: 220px;\n  vertical-align: top;\n  }\n.form-group .select {\n  width: 100%;\n  }\n.form-group .select > .select2-choice {\n  width: 100%;\n  }\n.select.form-control,\n.select.select2-search input[type=\"text\"] {\n  height: auto;\n  padding: 0;\n  border: none;\n  }\n.select2-choice {\n  position: relative;\n  display: inline-block;\n  width: 100%;\n  padding: 10px 39px 10px 15px;\n  font-size: 15px;\n  font-weight: normal;\n  line-height: 1.4;\n  border: none;\n  border-radius: 4px;\n  -webkit-transition: border .25s linear, color .25s linear, background-color .25s linear;\n          transition: border .25s linear, color .25s linear, background-color .25s linear;\n  }\n.select2-choice:hover,\n.select2-choice:focus {\n  outline: none;\n  }\n.select2-choice:active {\n  outline: none;\n  box-shadow: none;\n  }\n.select2-container-disabled .select2-choice {\n  filter: alpha(opacity=70);\n  opacity: .7;\n  }\n.select2-chosen {\n  overflow: hidden;\n  text-align: left;\n  }\n.select2-arrow {\n  position: absolute;\n  top: 42%;\n  right: 16px;\n  display: inline-block;\n  border-color: #34495e transparent;\n  border-style: solid;\n  border-width: 8px 6px;\n  border-bottom-style: none;\n  -webkit-transform: scale(1.001);\n      -ms-transform: scale(1.001);\n          transform: scale(1.001);\n  }\n.select2-arrow b {\n  display: none;\n  }\n.btn-lg .select2-arrow {\n  border-top-width: 8px;\n  border-right-width: 6px;\n  border-left-width: 6px;\n  }\n.select-default .select2-choice {\n  color: #fff;\n  background-color: #bdc3c7;\n  }\n.select-default .select2-choice:hover,\n.select-default .select2-choice.hover,\n.select-default .select2-choice:focus,\n.select-default .select2-choice:active {\n  color: #fff;\n  background-color: #cacfd2;\n  border-color: #cacfd2;\n  }\n.select-default .select2-choice:active {\n  background: #a1a6a9;\n  border-color: #a1a6a9;\n  }\n.select2-container-disabled.select-default .select2-choice,\n.select2-container-disabled.select-default .select2-choice:hover,\n.select2-container-disabled.select-default .select2-choice:focus,\n.select2-container-disabled.select-default .select2-choice:active {\n  background-color: #bdc3c7;\n  border-color: #bdc3c7;\n  }\n.select-default .select2-choice .select2-arrow {\n  border-top-color: #fff;\n  }\n.select-primary .select2-choice {\n  color: #fff;\n  background-color: #1abc9c;\n  }\n.select-primary .select2-choice:hover,\n.select-primary .select2-choice.hover,\n.select-primary .select2-choice:focus,\n.select-primary .select2-choice:active {\n  color: #fff;\n  background-color: #48c9b0;\n  border-color: #48c9b0;\n  }\n.select-primary .select2-choice:active {\n  background: #16a085;\n  border-color: #16a085;\n  }\n.select2-container-disabled.select-primary .select2-choice,\n.select2-container-disabled.select-primary .select2-choice:hover,\n.select2-container-disabled.select-primary .select2-choice:focus,\n.select2-container-disabled.select-primary .select2-choice:active {\n  background-color: #bdc3c7;\n  border-color: #1abc9c;\n  }\n.select-primary .select2-choice .select2-arrow {\n  border-top-color: #fff;\n  }\n.select-info .select2-choice {\n  color: #fff;\n  background-color: #3498db;\n  }\n.select-info .select2-choice:hover,\n.select-info .select2-choice.hover,\n.select-info .select2-choice:focus,\n.select-info .select2-choice:active {\n  color: #fff;\n  background-color: #5dade2;\n  border-color: #5dade2;\n  }\n.select-info .select2-choice:active {\n  background: #2c81ba;\n  border-color: #2c81ba;\n  }\n.select2-container-disabled.select-info .select2-choice,\n.select2-container-disabled.select-info .select2-choice:hover,\n.select2-container-disabled.select-info .select2-choice:focus,\n.select2-container-disabled.select-info .select2-choice:active {\n  background-color: #bdc3c7;\n  border-color: #3498db;\n  }\n.select-info .select2-choice .select2-arrow {\n  border-top-color: #fff;\n  }\n.select-danger .select2-choice {\n  color: #fff;\n  background-color: #e74c3c;\n  }\n.select-danger .select2-choice:hover,\n.select-danger .select2-choice.hover,\n.select-danger .select2-choice:focus,\n.select-danger .select2-choice:active {\n  color: #fff;\n  background-color: #ec7063;\n  border-color: #ec7063;\n  }\n.select-danger .select2-choice:active {\n  background: #c44133;\n  border-color: #c44133;\n  }\n.select2-container-disabled.select-danger .select2-choice,\n.select2-container-disabled.select-danger .select2-choice:hover,\n.select2-container-disabled.select-danger .select2-choice:focus,\n.select2-container-disabled.select-danger .select2-choice:active {\n  background-color: #bdc3c7;\n  border-color: #e74c3c;\n  }\n.select-danger .select2-choice .select2-arrow {\n  border-top-color: #fff;\n  }\n.select-success .select2-choice {\n  color: #fff;\n  background-color: #2ecc71;\n  }\n.select-success .select2-choice:hover,\n.select-success .select2-choice.hover,\n.select-success .select2-choice:focus,\n.select-success .select2-choice:active {\n  color: #fff;\n  background-color: #58d68d;\n  border-color: #58d68d;\n  }\n.select-success .select2-choice:active {\n  background: #27ad60;\n  border-color: #27ad60;\n  }\n.select2-container-disabled.select-success .select2-choice,\n.select2-container-disabled.select-success .select2-choice:hover,\n.select2-container-disabled.select-success .select2-choice:focus,\n.select2-container-disabled.select-success .select2-choice:active {\n  background-color: #bdc3c7;\n  border-color: #2ecc71;\n  }\n.select-success .select2-choice .select2-arrow {\n  border-top-color: #fff;\n  }\n.select-warning .select2-choice {\n  color: #fff;\n  background-color: #f1c40f;\n  }\n.select-warning .select2-choice:hover,\n.select-warning .select2-choice.hover,\n.select-warning .select2-choice:focus,\n.select-warning .select2-choice:active {\n  color: #fff;\n  background-color: #f4d313;\n  border-color: #f4d313;\n  }\n.select-warning .select2-choice:active {\n  background: #cda70d;\n  border-color: #cda70d;\n  }\n.select2-container-disabled.select-warning .select2-choice,\n.select2-container-disabled.select-warning .select2-choice:hover,\n.select2-container-disabled.select-warning .select2-choice:focus,\n.select2-container-disabled.select-warning .select2-choice:active {\n  background-color: #bdc3c7;\n  border-color: #f1c40f;\n  }\n.select-warning .select2-choice .select2-arrow {\n  border-top-color: #fff;\n  }\n.select-inverse .select2-choice {\n  color: #fff;\n  background-color: #34495e;\n  }\n.select-inverse .select2-choice:hover,\n.select-inverse .select2-choice.hover,\n.select-inverse .select2-choice:focus,\n.select-inverse .select2-choice:active {\n  color: #fff;\n  background-color: #415b76;\n  border-color: #415b76;\n  }\n.select-inverse .select2-choice:active {\n  background: #2c3e50;\n  border-color: #2c3e50;\n  }\n.select2-container-disabled.select-inverse .select2-choice,\n.select2-container-disabled.select-inverse .select2-choice:hover,\n.select2-container-disabled.select-inverse .select2-choice:focus,\n.select2-container-disabled.select-inverse .select2-choice:active {\n  background-color: #bdc3c7;\n  border-color: #34495e;\n  }\n.select-inverse .select2-choice .select2-arrow {\n  border-top-color: #fff;\n  }\n.select2-container.select-hg > .select2-choice {\n  min-height: 53px;\n  padding: 13px 20px;\n  padding-right: 49px;\n  font-size: 22px;\n  line-height: 1.227;\n  border-radius: 6px;\n  }\n.select2-container.select-hg > .select2-choice .filter-option {\n  top: 13px;\n  right: 40px;\n  left: 20px;\n  }\n.select2-container.select-hg > .select2-choice .select2-arrow {\n  right: 20px;\n  }\n.select2-container.select-hg > .select2-choice > [class^=\"fui-\"] {\n  top: 2px;\n  }\n.select2-container.select-lg > .select2-choice {\n  min-height: 45px;\n  padding: 10px 19px;\n  padding-right: 47px;\n  font-size: 17px;\n  line-height: 1.471;\n  border-radius: 6px;\n  }\n.select2-container.select-lg > .select2-choice .filter-option {\n  right: 38px;\n  left: 18px;\n  }\n.select2-container.select-sm > .select2-choice {\n  min-height: 36px;\n  padding: 9px 13px;\n  padding-right: 35px;\n  font-size: 13px;\n  line-height: 1.385;\n  border-radius: 4px;\n  }\n.select2-container.select-sm > .select2-choice .filter-option {\n  right: 33px;\n  left: 13px;\n  }\n.select2-container.select-sm > .select2-choice .select2-arrow {\n  right: 13px;\n  }\n.multiselect {\n  position: relative;\n  display: inline-block;\n  width: auto;\n  min-width: 220px;\n  max-width: none;\n  font-size: 0;\n  text-align: left;\n  vertical-align: top;\n  background-color: #fff;\n  border-radius: 6px;\n  }\n.form-group .multiselect {\n  width: 100%;\n  }\n.form-group .multiselect > .select2-choice {\n  width: 100%;\n  }\n.multiselect.form-control,\n.multiselect.select2-search input[type=\"text\"] {\n  height: auto;\n  padding: 6px 1px 1px 6px;\n  border: 2px solid #ebedef;\n  }\n.select2-choices {\n  position: relative;\n  min-height: 26px;\n  padding: 0;\n  margin: 0;\n  overflow: hidden;\n  cursor: text;\n  }\n.select2-choices li {\n  float: left;\n  list-style: none;\n  }\n.select2-search-choice {\n  position: relative;\n  display: inline-block;\n  height: 27px;\n  padding: 6px 21px;\n  margin: 0 5px 4px 0;\n  overflow: hidden;\n  font-size: 13px;\n  line-height: 15px;\n  color: #fff;\n  vertical-align: middle;\n  cursor: pointer;\n  border-radius: 4px;\n  -webkit-transition: .25s linear;\n          transition: .25s linear;\n  }\n.select2-search-choice:hover {\n  padding-right: 28px;\n  padding-left: 14px;\n  color: #fff;\n  }\n.select2-search-choice:hover .select2-search-choice-close {\n  color: inherit;\n          filter: none;\n  opacity: 1;\n\n  -webkit-filter: none;\n  }\n.select2-search-choice .select2-search-choice-close {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  z-index: 2;\n  width: 100%;\n  padding-right: 10px;\n  font-size: 12px;\n  color: #fff;\n  text-align: right;\n  text-decoration: none;\n  cursor: pointer;\n  filter: alpha(opacity=0);\n  opacity: 0;\n  -webkit-transition: opacity .25s linear;\n          transition: opacity .25s linear;\n  }\n.select2-search-choice .select2-search-choice-close:after {\n  font-family: \"Flat-UI-Icons\";\n  line-height: 27px;\n  content: \"\\e609\";\n\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  }\n.select2-search-field input[type=\"text\"] {\n  width: auto;\n  min-width: 80px;\n  max-width: inherit;\n  height: 29px;\n  padding: 0;\n  margin: 0;\n  font-size: 14px;\n  color: #34495e;\n  vertical-align: top;\n  background-color: transparent;\n  border: none;\n  outline: none;\n  box-shadow: none;\n  }\n.select2-search-field:first-child input[type=\"text\"] {\n  height: 23px;\n  margin: 3px 0 5px;\n  }\n.select2-container-multi.multiselect-default {\n  border-color: #bdc3c7;\n  }\n.select2-container-multi.multiselect-default .select2-search-choice {\n  background-color: #bdc3c7;\n  }\n.select2-container-multi.multiselect-default .select2-search-choice:hover {\n  background-color: #cacfd2;\n  }\n.select2-container-multi.multiselect-primary {\n  border-color: #1abc9c;\n  }\n.select2-container-multi.multiselect-primary .select2-search-choice {\n  background-color: #1abc9c;\n  }\n.select2-container-multi.multiselect-primary .select2-search-choice:hover {\n  background-color: #48c9b0;\n  }\n.select2-container-multi.multiselect-info {\n  border-color: #3498db;\n  }\n.select2-container-multi.multiselect-info .select2-search-choice {\n  background-color: #3498db;\n  }\n.select2-container-multi.multiselect-info .select2-search-choice:hover {\n  background-color: #5dade2;\n  }\n.select2-container-multi.multiselect-danger {\n  border-color: #e74c3c;\n  }\n.select2-container-multi.multiselect-danger .select2-search-choice {\n  background-color: #e74c3c;\n  }\n.select2-container-multi.multiselect-danger .select2-search-choice:hover {\n  background-color: #ec7063;\n  }\n.select2-container-multi.multiselect-success {\n  border-color: #2ecc71;\n  }\n.select2-container-multi.multiselect-success .select2-search-choice {\n  background-color: #2ecc71;\n  }\n.select2-container-multi.multiselect-success .select2-search-choice:hover {\n  background-color: #58d68d;\n  }\n.select2-container-multi.multiselect-warning {\n  border-color: #f1c40f;\n  }\n.select2-container-multi.multiselect-warning .select2-search-choice {\n  background-color: #f1c40f;\n  }\n.select2-container-multi.multiselect-warning .select2-search-choice:hover {\n  background-color: #f4d313;\n  }\n.select2-container-multi.multiselect-inverse {\n  border-color: #34495e;\n  }\n.select2-container-multi.multiselect-inverse .select2-search-choice {\n  background-color: #34495e;\n  }\n.select2-container-multi.multiselect-inverse .select2-search-choice:hover {\n  background-color: #415b76;\n  }\n.select2-drop {\n  position: absolute;\n  top: 100%;\n  z-index: 9999;\n  min-width: 220px;\n  margin-top: 9px;\n  font-size: 14px;\n  visibility: visible;\n          filter: none;\n  border-radius: 4px;\n  opacity: 1;\n  -webkit-transition: none;\n          transition: none;\n\n  -webkit-filter: none;\n  }\n.select2-drop.select2-drop-above {\n  margin-top: -9px;\n  }\n.select2-drop.select2-drop-auto-width {\n  width: auto;\n  }\n.select2-drop.show-select-search .select2-search {\n  display: block;\n  }\n.select2-drop.show-select-search .select2-search + .select2-results > li:first-child .select2-result-label {\n  border-radius: 0;\n  }\n.select2-drop .select2-results {\n  padding: 0;\n  margin: 0;\n  list-style: none;\n  }\n.select2-drop .select2-results > li:first-child > .select2-result-label {\n  border-top-left-radius: 4px;\n  border-top-right-radius: 4px;\n  }\n.select2-drop .select2-results > li:last-child > .select2-result-label {\n  border-bottom-right-radius: 4px;\n  border-bottom-left-radius: 4px;\n  }\n.select2-drop .select2-result-sub {\n  padding: 0;\n  margin: 0;\n  list-style: none;\n  }\n.select2-drop .select2-result-sub > li:last-child > .select2-result-label {\n  border-bottom-right-radius: 4px;\n  border-bottom-left-radius: 4px;\n  }\n.select2-drop .select2-no-results {\n  padding: 8px 15px;\n  }\n.select2-drop .select2-result-label {\n  padding: 8px 16px;\n  line-height: 1.429;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n          user-select: none;\n  -webkit-transition: background-color .25s, color .25s;\n          transition: background-color .25s, color .25s;\n  }\n.select2-drop .select2-result-selectable .select2-result-label {\n  color: rgba(52, 73, 94, .85);\n  cursor: pointer;\n  }\n.select2-drop .select2-result-selectable .select2-result-label:focus,\n.select2-drop .select2-result-selectable .select2-result-label:hover,\n.select2-drop .select2-result-selectable .select2-result-label:active {\n  color: inherit;\n  background-color: #e1e4e7;\n  outline: none;\n  }\n.select2-drop .select2-disabled {\n  color: rgba(52, 73, 94, .95);\n  cursor: default;\n  filter: alpha(opacity=40);\n  opacity: .4;\n  }\n.select2-drop .select2-disabled:focus,\n.select2-drop .select2-disabled:hover,\n.select2-drop .select2-disabled:active {\n  background: none !important;\n  }\n.select2-drop .select2-highlighted > .select2-result-label {\n  color: #fff;\n  background: #1abc9c;\n  }\n.select2-drop .select2-result-with-children > .select2-result-label {\n  margin-top: 5px;\n  font-size: 13px;\n  color: rgba(52, 73, 94, .6);\n  text-transform: uppercase;\n  }\n.select2-drop .select2-result-with-children + .select2-result-with-children > .select2-result-label {\n  margin-top: 11px;\n  }\n.select2-results {\n  position: relative;\n  max-height: 200px;\n  overflow-x: hidden;\n  overflow-y: auto;\n\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n  }\n.select2-search {\n  display: none;\n  width: 100%;\n  padding: 8px 6px;\n  }\n.select2-search input[type=\"text\"] {\n  width: 100%;\n  height: auto !important;\n  }\n.select-inverse-dropdown {\n  color: rgba(255, 255, 255, .75);\n  background-color: #34495e;\n  }\n.select-inverse-dropdown .select2-results .select2-result-label {\n  color: #fff;\n  }\n.select-inverse-dropdown .select2-results .select2-result-label:focus,\n.select-inverse-dropdown .select2-results .select2-result-label:hover,\n.select-inverse-dropdown .select2-results .select2-result-label:active {\n  background: #2c3e50;\n  }\n.select-inverse-dropdown .select2-results.select2-disabled .select2-result-label:hover {\n  color: #fff;\n  }\n.select-inverse-dropdown .select2-result-with-children > .select2-result-label {\n  color: rgba(255, 255, 255, .6);\n  }\n.select-inverse-dropdown .select2-result-with-children > .select2-result-label:hover {\n  color: #fff;\n  background: none !important;\n  }\n.select2-drop-multi {\n  border-radius: 6px;\n  }\n.select2-drop-multi .select2-results {\n  padding: 2px 0;\n  }\n.select2-drop-multi .select2-result {\n  padding: 2px 4px;\n  }\n.select2-drop-multi .select2-result-label {\n  border-radius: 4px;\n  }\n.select2-drop-multi .select2-selected {\n  display: none;\n  }\n.select2-offscreen,\n.select2-offscreen:focus {\n  position: absolute !important;\n  top: 0 !important;\n  left: 0 !important;\n  width: 1px !important;\n  height: 1px !important;\n  padding: 0 !important;\n  margin: 0 !important;\n  overflow: hidden !important;\n  clip: rect(0 0 0 0) !important;\n  border: 0 !important;\n  outline: 0 !important;\n  }\n.select2-hidden-accessible {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0 0 0 0);\n  border: 0;\n  }\n.select2-offscreen,\n.select2-offscreen:focus {\n  position: absolute !important;\n  top: 0 !important;\n  left: 0 !important;\n  width: 1px !important;\n  height: 1px !important;\n  padding: 0 !important;\n  margin: 0 !important;\n  overflow: hidden !important;\n  clip: rect(0 0 0 0) !important;\n  border: 0 !important;\n  outline: 0 !important;\n  }\n.select2-display-none {\n  display: none;\n  }\n.select2-measure-scrollbar {\n  position: absolute;\n  top: -10000px;\n  left: -10000px;\n  width: 100px;\n  height: 100px;\n  overflow: scroll;\n  }\n.select2-drop-mask {\n  position: fixed;\n  top: 0;\n  left: 0;\n  z-index: 9998;\n  width: auto;\n  min-width: 100%;\n  height: auto;\n  min-height: 100%;\n  padding: 0;\n  margin: 0;\n  /* styles required for IE to work */\n  background-color: #fff;\n  filter: alpha(opacity=0);\n  border: 0;\n  opacity: 0;\n  }\n.tile {\n  position: relative;\n  padding: 14px;\n  margin-bottom: 20px;\n  text-align: center;\n  background-color: #eff0f2;\n  border-radius: 6px;\n  }\n.tile .tile-hot-ribbon {\n  position: absolute;\n  top: -4px;\n  right: -4px;\n  display: block;\n  width: 82px;\n  }\n.tile p {\n  margin-bottom: 33px;\n  font-size: 15px;\n  }\n.tile-image {\n  height: 100px;\n  margin: 31px 0 27px;\n  vertical-align: bottom;\n  }\n.tile-image.big-illustration {\n  width: 112px;\n  height: 111px;\n  margin-top: 20px;\n  }\n.tile-title {\n  margin: 0;\n  font-size: 20px;\n  }\n.navbar {\n  min-height: 53px;\n  margin-bottom: 30px;\n  font-size: 16px;\n  border: none;\n  border-radius: 6px;\n  }\n@media (min-width: 768px) {\n  .navbar-header {\n    float: left;\n    }\n  }\n.navbar-collapse {\n  padding-right: 21px;\n  padding-left: 21px;\n  box-shadow: none;\n  }\n.navbar-collapse .navbar-form:first-child {\n  border: none;\n  }\n@media (min-width: 768px) {\n  .navbar-collapse .navbar-nav.navbar-left:first-child {\n    margin-left: -21px;\n    }\n  .navbar-collapse .navbar-nav.navbar-left:first-child > li:first-child a {\n    border-top-left-radius: 6px;\n    border-bottom-left-radius: 6px;\n    }\n  .navbar-collapse .navbar-nav.navbar-right:last-child {\n    margin-right: -21px;\n    }\n  .navbar-collapse .navbar-nav.navbar-right:last-child > .dropdown:last-child > a {\n    border-radius: 0 6px 6px 0;\n    }\n  .navbar-fixed-top .navbar-collapse .navbar-form.navbar-right:last-child,\n  .navbar-fixed-bottom .navbar-collapse .navbar-form.navbar-right:last-child {\n    margin-right: 0;\n    }\n  }\n@media (max-width: 767px) {\n  .navbar-collapse .navbar-nav.navbar-right:last-child {\n    margin-bottom: 3px;\n    }\n  }\n.navbar .container,\n.navbar .container-fluid {\n  padding-right: 21px;\n  padding-left: 21px;\n  }\n.navbar .container > .navbar-header,\n.navbar .container-fluid > .navbar-header,\n.navbar .container > .navbar-collapse,\n.navbar .container-fluid > .navbar-collapse {\n  margin-right: -21px;\n  margin-left: -21px;\n  }\n@media (min-width: 768px) {\n  .navbar .container > .navbar-header,\n  .navbar .container-fluid > .navbar-header,\n  .navbar .container > .navbar-collapse,\n  .navbar .container-fluid > .navbar-collapse {\n    margin-right: 0;\n    margin-left: 0;\n    }\n  }\n.navbar-static-top {\n  z-index: 1000;\n  border-width: 0;\n  border-radius: 0;\n  }\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  z-index: 1030;\n  border-radius: 0;\n  }\n.navbar-fixed-top {\n  border-width: 0;\n  }\n.navbar-fixed-bottom {\n  margin-bottom: 0;\n  border-width: 0;\n  }\n.navbar-brand {\n  height: 53px;\n  padding: 14px 21px;\n  font-size: 24px;\n  font-weight: 700;\n  line-height: 1.042;\n  }\n.navbar-brand > [class*=\"fui-\"] {\n  font-size: 19px;\n  line-height: 1.263;\n  vertical-align: top;\n  }\n@media (min-width: 768px) {\n  .navbar > .container .navbar-brand,\n  .navbar > .container-fluid .navbar-brand {\n    margin-left: -21px;\n    }\n  }\n.navbar-toggle {\n  height: 53px;\n  padding: 0 21px;\n  margin: 0 0 0 21px;\n  line-height: 53px;\n  color: #34495e;\n  border: none;\n  }\n.navbar-toggle:before {\n  font-family: \"Flat-UI-Icons\";\n  font-size: 22px;\n  font-style: normal;\n  font-weight: normal;\n  color: #16a085;\n  content: \"\\e61a\";\n  -webkit-transition: color .25s linear;\n          transition: color .25s linear;\n\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  }\n.navbar-toggle:hover,\n.navbar-toggle:focus {\n  outline: none;\n  }\n.navbar-toggle:hover:before,\n.navbar-toggle:focus:before {\n  color: #1abc9c;\n  }\n.navbar-toggle .icon-bar {\n  display: none;\n  }\n@media (min-width: 768px) {\n  .navbar-toggle {\n    display: none;\n    }\n  }\n.navbar-nav {\n  margin: 0;\n  }\n.navbar-nav > li > a {\n  padding: 15px 21px;\n  font-size: 16px;\n  font-weight: 700;\n  line-height: 23px;\n  }\n.navbar-nav > li > a:hover,\n.navbar-nav > li > a:focus,\n.navbar-nav .open > a:focus,\n.navbar-nav .open > a:hover {\n  background-color: transparent;\n  }\n.navbar-nav [class^=\"fui-\"] {\n  position: relative;\n  top: 1px;\n  line-height: 20px;\n  }\n.navbar-nav .visible-sm > [class^=\"fui-\"],\n.navbar-nav .visible-xs > [class^=\"fui-\"] {\n  margin-left: 12px;\n  }\n@media (max-width: 767px) {\n  .navbar-nav {\n    margin: 0 -21px;\n    }\n  .navbar-nav .open .dropdown-menu > li > a,\n  .navbar-nav .open .dropdown-menu .dropdown-header {\n    padding: 7px 15px 7px 31px !important;\n    }\n  .navbar-nav .open .dropdown-menu > li > a {\n    line-height: 23px;\n    }\n  .navbar-nav > li > a {\n    padding-top: 7px;\n    padding-bottom: 7px;\n    }\n  }\n.navbar-input {\n  height: 35px;\n  padding: 5px 10px;\n  font-size: 13px;\n  line-height: 1.4;\n  border-radius: 6px;\n  }\nselect.navbar-input {\n  height: 35px;\n  line-height: 35px;\n  }\ntextarea.navbar-input,\nselect[multiple].navbar-input {\n  height: auto;\n  }\n.navbar-form {\n  padding-top: 9px;\n  padding-right: 19px;\n  padding-bottom: 9px;\n  padding-left: 19px;\n  margin-top: 0;\n  margin-bottom: 0;\n  box-shadow: none;\n  }\n@media (max-width: 767px) {\n  .navbar-form {\n    width: auto;\n    margin: 3px -21px;\n    }\n  }\n.navbar-form .form-control,\n.navbar-form .input-group-addon,\n.navbar-form .btn,\n.navbar-form .select2-search input[type=\"text\"] {\n  height: 35px;\n  padding: 5px 10px;\n  font-size: 13px;\n  line-height: 1.4;\n  border-radius: 6px;\n  }\nselect.navbar-form .form-control,\nselect.navbar-form .input-group-addon,\nselect.navbar-form .btn,\nselect.navbar-form .select2-search input[type=\"text\"] {\n  height: 35px;\n  line-height: 35px;\n  }\ntextarea.navbar-form .form-control,\ntextarea.navbar-form .input-group-addon,\ntextarea.navbar-form .btn,\nselect[multiple].navbar-form .form-control,\nselect[multiple].navbar-form .input-group-addon,\nselect[multiple].navbar-form .btn,\ntextarea.navbar-form .select2-search input[type=\"text\"],\nselect[multiple].navbar-form .select2-search input[type=\"text\"] {\n  height: auto;\n  }\n.navbar-form .btn {\n  margin: 0;\n  }\n.navbar-form .input-group .form-control:first-child,\n.navbar-form .input-group-addon:first-child,\n.navbar-form .input-group-btn:first-child > .btn,\n.navbar-form .input-group-btn:first-child > .dropdown-toggle,\n.navbar-form .input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.navbar-form .input-group .select2-search input[type=\"text\"]:first-child {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n  }\n.navbar-form .input-group .form-control:last-child,\n.navbar-form .input-group-addon:last-child,\n.navbar-form .input-group-btn:last-child > .btn,\n.navbar-form .input-group-btn:last-child > .dropdown-toggle,\n.navbar-form .input-group-btn:first-child > .btn:not(:first-child),\n.navbar-form .input-group .select2-search input[type=\"text\"]:last-child {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n  }\n.navbar-form .form-control,\n.navbar-form .select2-search input[type=\"text\"] {\n  display: table-cell;\n  font-size: 15px;\n  border-radius: 5px;\n  }\n.navbar-form .form-group ~ .btn {\n  margin-left: 5px;\n  font-size: 15px;\n  border-radius: 5px;\n  }\n.navbar-form .form-group + .btn {\n  margin-right: 5px;\n  }\n@media (min-width: 768px) {\n  .navbar-form .input-group {\n    width: 195px;\n    }\n  }\n@media (max-width: 767px) {\n  .navbar-form .form-group {\n    margin-bottom: 7px;\n    }\n  .navbar-form .form-group:last-child {\n    margin-bottom: 0;\n    }\n  .navbar-form .form-group + .btn {\n    margin-left: 0;\n    }\n  }\n.navbar-nav > li > .dropdown-menu {\n  min-width: 100%;\n  margin-top: 9px;\n  border-radius: 4px;\n  }\n@media (max-width: 767px) {\n  .navbar-nav > li.open > .dropdown-menu {\n    margin-top: 0 !important;\n    }\n  }\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  border-bottom-right-radius: 4px;\n  border-bottom-left-radius: 4px;\n  }\n.navbar-nav > .open > .dropdown-toggle,\n.navbar-nav > .open > .dropdown-toggle:focus,\n.navbar-nav > .open > .dropdown-toggle:hover {\n  background-color: transparent;\n  }\n.navbar-text {\n  padding-top: 15px;\n  padding-bottom: 15px;\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: 16px;\n  line-height: 1.438;\n  color: #34495e;\n  }\n@media (min-width: 768px) {\n  .navbar-text {\n    margin-right: 21px;\n    margin-left: 21px;\n    }\n  .navbar-text.navbar-right:last-child {\n    margin-right: 0;\n    }\n  }\n.navbar-btn {\n  margin-top: 6px;\n  margin-bottom: 6px;\n  }\n.navbar-btn.btn-sm {\n  margin-top: 9px;\n  margin-bottom: 8px;\n  }\n.navbar-btn.btn-xs {\n  margin-top: 14px;\n  margin-bottom: 14px;\n  }\n.navbar-unread,\n.navbar-new {\n  position: absolute;\n  top: 35%;\n  right: 12px;\n  z-index: 10;\n  width: 6px;\n  height: 6px;\n  font-family: \"Lato\", Helvetica, Arial, sans-serif;\n  font-size: 0;\n  font-weight: 700;\n  line-height: 1;\n  color: #fff;\n  text-align: center;\n  background-color: #1abc9c;\n  border-radius: 50%;\n  }\n@media (max-width: 768px) {\n  .navbar-unread,\n  .navbar-new {\n    position: static;\n    float: right;\n    margin: 0 0 0 10px;\n    }\n  }\n.active .navbar-unread,\n.active .navbar-new {\n  display: none;\n  background-color: #fff;\n  }\n.navbar-new {\n  width: auto;\n  min-width: 18px;\n  height: 18px;\n  padding: 0 1px;\n  margin: -6px -10px;\n  font-size: 12px;\n  line-height: 17px;\n  background-color: #e74c3c;\n\n  -webkit-font-smoothing: subpixel-antialiased;\n  }\n.navbar-default {\n  background-color: #ecf0f1;\n  }\n.navbar-default .navbar-brand {\n  color: #34495e;\n  }\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n  color: #1abc9c;\n  background-color: transparent;\n  }\n.navbar-default .navbar-toggle:before {\n  color: #34495e;\n  }\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n  background-color: transparent;\n  }\n.navbar-default .navbar-toggle:hover:before,\n.navbar-default .navbar-toggle:focus:before {\n  color: #1abc9c;\n  }\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n  border-color: #e5e9ea;\n  border-width: 2px;\n  }\n.navbar-default .navbar-nav > li > a {\n  color: #34495e;\n  }\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n  color: #1abc9c;\n  background-color: transparent;\n  }\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n  color: #1abc9c;\n  background-color: transparent;\n  }\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n  color: #ccc;\n  background-color: transparent;\n  }\n.navbar-default .navbar-nav > .dropdown > a .caret {\n  border-top-color: #34495e;\n  border-bottom-color: #34495e;\n  }\n.navbar-default .navbar-nav > .active > a .caret {\n  border-top-color: #1abc9c;\n  border-bottom-color: #1abc9c;\n  }\n.navbar-default .navbar-nav > .dropdown > a:hover .caret,\n.navbar-default .navbar-nav > .dropdown > a:focus .caret {\n  border-top-color: #1abc9c;\n  border-bottom-color: #1abc9c;\n  }\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n  color: #1abc9c;\n  background-color: transparent;\n  }\n.navbar-default .navbar-nav > .open > a .caret,\n.navbar-default .navbar-nav > .open > a:hover .caret,\n.navbar-default .navbar-nav > .open > a:focus .caret {\n  border-top-color: #1abc9c;\n  border-bottom-color: #1abc9c;\n  }\n@media (max-width: 767px) {\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n    color: #34495e;\n    }\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #1abc9c;\n    background-color: transparent;\n    }\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #1abc9c;\n    background-color: transparent;\n    }\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #ccc;\n    background-color: transparent;\n    }\n  }\n.navbar-default .navbar-form .form-control,\n.navbar-default .navbar-form .select2-search input[type=\"text\"] {\n  border-color: transparent;\n  }\n.navbar-default .navbar-form .form-control::-moz-placeholder,\n.navbar-default .navbar-form .select2-search input[type=\"text\"]::-moz-placeholder {\n  color: #aeb6bf;\n  opacity: 1;\n  }\n.navbar-default .navbar-form .form-control:-ms-input-placeholder,\n.navbar-default .navbar-form .select2-search input[type=\"text\"]:-ms-input-placeholder {\n  color: #aeb6bf;\n  }\n.navbar-default .navbar-form .form-control::-webkit-input-placeholder,\n.navbar-default .navbar-form .select2-search input[type=\"text\"]::-webkit-input-placeholder {\n  color: #aeb6bf;\n  }\n.navbar-default .navbar-form .form-control:focus,\n.navbar-default .navbar-form .select2-search input[type=\"text\"]:focus {\n  color: #1abc9c;\n  border-color: #1abc9c;\n  }\n.navbar-default .navbar-form .input-group-btn .btn {\n  color: #919ba4;\n  border-color: transparent;\n  }\n.navbar-default .navbar-form .input-group.focus .form-control,\n.navbar-default .navbar-form .input-group.focus .input-group-btn .btn,\n.navbar-default .navbar-form .input-group.focus .select2-search input[type=\"text\"] {\n  color: #1abc9c;\n  border-color: #1abc9c;\n  }\n.navbar-default .navbar-text {\n  color: #34495e;\n  }\n.navbar-default .navbar-link {\n  color: #34495e;\n  }\n.navbar-default .navbar-link:hover {\n  color: #1abc9c;\n  }\n.navbar-default .btn-link {\n  color: #34495e;\n  }\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n  color: #1abc9c;\n  }\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n  color: #ccc;\n  }\n.navbar-inverse {\n  background-color: #34495e;\n  }\n.navbar-inverse .navbar-brand {\n  color: #fff;\n  }\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n  color: #1abc9c;\n  background-color: transparent;\n  }\n.navbar-inverse .navbar-toggle:before {\n  color: #fff;\n  }\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n  background-color: transparent;\n  }\n.navbar-inverse .navbar-toggle:hover:before,\n.navbar-inverse .navbar-toggle:focus:before {\n  color: #1abc9c;\n  }\n.navbar-inverse .navbar-collapse {\n  border-color: #2f4154;\n  border-width: 2px;\n  }\n.navbar-inverse .navbar-nav > li > a {\n  color: #fff;\n  }\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n  color: #1abc9c;\n  background-color: transparent;\n  }\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n  color: #fff;\n  background-color: #1abc9c;\n  }\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n  color: #444;\n  background-color: transparent;\n  }\n.navbar-inverse .navbar-nav > .dropdown > a:hover .caret,\n.navbar-inverse .navbar-nav > .dropdown > a:focus .caret {\n  border-top-color: #1abc9c;\n  border-bottom-color: #1abc9c;\n  }\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n  color: #fff;\n  background-color: #1abc9c;\n  border-left-color: transparent;\n  }\n.navbar-inverse .navbar-nav > .open > a .caret,\n.navbar-inverse .navbar-nav > .open > a:hover .caret,\n.navbar-inverse .navbar-nav > .open > a:focus .caret {\n  border-top-color: #fff;\n  border-bottom-color: #fff;\n  }\n.navbar-inverse .navbar-nav > .dropdown > a .caret {\n  border-top-color: #4b6075;\n  border-bottom-color: #4b6075;\n  }\n.navbar-inverse .navbar-nav > .open > .dropdown-menu {\n  padding: 3px 4px;\n  background-color: #34495e;\n  }\n.navbar-inverse .navbar-nav > .open > .dropdown-menu > li > a {\n  padding: 6px 9px;\n  color: #e1e4e7;\n  border-radius: 4px;\n  }\n.navbar-inverse .navbar-nav > .open > .dropdown-menu > li > a:hover,\n.navbar-inverse .navbar-nav > .open > .dropdown-menu > li > a:focus {\n  color: #fff;\n  background-color: #1abc9c;\n  }\n.navbar-inverse .navbar-nav > .open > .dropdown-menu > .divider {\n  height: 2px;\n  margin-right: -4px;\n  margin-left: -4px;\n  background-color: #2f4154;\n  }\n@media (max-width: 767px) {\n  .navbar-inverse .navbar-nav > li > a {\n    border-left-width: 0;\n    }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n    color: #fff;\n    }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #1abc9c;\n    background-color: transparent;\n    }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #fff;\n    background-color: #1abc9c;\n    }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #444;\n    background-color: transparent;\n    }\n  .navbar-inverse .navbar-nav .dropdown-menu .divider {\n    background-color: #2f4154;\n    }\n  }\n.navbar-inverse .navbar-form .form-control,\n.navbar-inverse .navbar-form .select2-search input[type=\"text\"] {\n  color: #536a81;\n  background-color: #293a4a;\n  border-color: transparent;\n  }\n.navbar-inverse .navbar-form .form-control::-moz-placeholder,\n.navbar-inverse .navbar-form .select2-search input[type=\"text\"]::-moz-placeholder {\n  color: #536a81;\n  opacity: 1;\n  }\n.navbar-inverse .navbar-form .form-control:-ms-input-placeholder,\n.navbar-inverse .navbar-form .select2-search input[type=\"text\"]:-ms-input-placeholder {\n  color: #536a81;\n  }\n.navbar-inverse .navbar-form .form-control::-webkit-input-placeholder,\n.navbar-inverse .navbar-form .select2-search input[type=\"text\"]::-webkit-input-placeholder {\n  color: #536a81;\n  }\n.navbar-inverse .navbar-form .form-control:focus,\n.navbar-inverse .navbar-form .select2-search input[type=\"text\"]:focus {\n  color: #1abc9c;\n  border-color: #1abc9c;\n  }\n.navbar-inverse .navbar-form .btn {\n  color: #fff;\n  background-color: #1abc9c;\n  }\n.navbar-inverse .navbar-form .btn:hover,\n.navbar-inverse .navbar-form .btn.hover,\n.navbar-inverse .navbar-form .btn:focus,\n.navbar-inverse .navbar-form .btn:active,\n.navbar-inverse .navbar-form .btn.active,\n.open > .dropdown-toggle.navbar-inverse .navbar-form .btn {\n  color: #fff;\n  background-color: #48c9b0;\n  border-color: #48c9b0;\n  }\n.navbar-inverse .navbar-form .btn:active,\n.navbar-inverse .navbar-form .btn.active,\n.open > .dropdown-toggle.navbar-inverse .navbar-form .btn {\n  background: #16a085;\n  border-color: #16a085;\n  }\n.navbar-inverse .navbar-form .btn.disabled,\n.navbar-inverse .navbar-form .btn[disabled],\nfieldset[disabled] .navbar-inverse .navbar-form .btn,\n.navbar-inverse .navbar-form .btn.disabled:hover,\n.navbar-inverse .navbar-form .btn[disabled]:hover,\nfieldset[disabled] .navbar-inverse .navbar-form .btn:hover,\n.navbar-inverse .navbar-form .btn.disabled.hover,\n.navbar-inverse .navbar-form .btn[disabled].hover,\nfieldset[disabled] .navbar-inverse .navbar-form .btn.hover,\n.navbar-inverse .navbar-form .btn.disabled:focus,\n.navbar-inverse .navbar-form .btn[disabled]:focus,\nfieldset[disabled] .navbar-inverse .navbar-form .btn:focus,\n.navbar-inverse .navbar-form .btn.disabled:active,\n.navbar-inverse .navbar-form .btn[disabled]:active,\nfieldset[disabled] .navbar-inverse .navbar-form .btn:active,\n.navbar-inverse .navbar-form .btn.disabled.active,\n.navbar-inverse .navbar-form .btn[disabled].active,\nfieldset[disabled] .navbar-inverse .navbar-form .btn.active {\n  background-color: #bdc3c7;\n  border-color: #1abc9c;\n  }\n.navbar-inverse .navbar-form .btn .badge {\n  color: #1abc9c;\n  background-color: #fff;\n  }\n.navbar-inverse .navbar-form .input-group-btn .btn {\n  color: #526a82;\n  background-color: #293a4a;\n  border-color: transparent;\n  }\n.navbar-inverse .navbar-form .input-group.focus .form-control,\n.navbar-inverse .navbar-form .input-group.focus .input-group-btn .btn,\n.navbar-inverse .navbar-form .input-group.focus .select2-search input[type=\"text\"] {\n  color: #1abc9c;\n  border-color: #1abc9c;\n  }\n@media (max-width: 767px) {\n  .navbar-inverse .navbar-form {\n    border-color: #2f4154;\n    border-width: 2px 0;\n    }\n  }\n.navbar-inverse .navbar-text {\n  color: #fff;\n  }\n.navbar-inverse .navbar-text a {\n  color: #fff;\n  }\n.navbar-inverse .navbar-text a:hover,\n.navbar-inverse .navbar-text a:focus {\n  color: #1abc9c;\n  }\n.navbar-inverse .navbar-btn {\n  color: #fff;\n  background-color: #1abc9c;\n  }\n.navbar-inverse .navbar-btn:hover,\n.navbar-inverse .navbar-btn.hover,\n.navbar-inverse .navbar-btn:focus,\n.navbar-inverse .navbar-btn:active,\n.navbar-inverse .navbar-btn.active,\n.open > .dropdown-toggle.navbar-inverse .navbar-btn {\n  color: #fff;\n  background-color: #48c9b0;\n  border-color: #48c9b0;\n  }\n.navbar-inverse .navbar-btn:active,\n.navbar-inverse .navbar-btn.active,\n.open > .dropdown-toggle.navbar-inverse .navbar-btn {\n  background: #16a085;\n  border-color: #16a085;\n  }\n.navbar-inverse .navbar-btn.disabled,\n.navbar-inverse .navbar-btn[disabled],\nfieldset[disabled] .navbar-inverse .navbar-btn,\n.navbar-inverse .navbar-btn.disabled:hover,\n.navbar-inverse .navbar-btn[disabled]:hover,\nfieldset[disabled] .navbar-inverse .navbar-btn:hover,\n.navbar-inverse .navbar-btn.disabled.hover,\n.navbar-inverse .navbar-btn[disabled].hover,\nfieldset[disabled] .navbar-inverse .navbar-btn.hover,\n.navbar-inverse .navbar-btn.disabled:focus,\n.navbar-inverse .navbar-btn[disabled]:focus,\nfieldset[disabled] .navbar-inverse .navbar-btn:focus,\n.navbar-inverse .navbar-btn.disabled:active,\n.navbar-inverse .navbar-btn[disabled]:active,\nfieldset[disabled] .navbar-inverse .navbar-btn:active,\n.navbar-inverse .navbar-btn.disabled.active,\n.navbar-inverse .navbar-btn[disabled].active,\nfieldset[disabled] .navbar-inverse .navbar-btn.active {\n  background-color: #bdc3c7;\n  border-color: #1abc9c;\n  }\n.navbar-inverse .navbar-btn .badge {\n  color: #1abc9c;\n  background-color: #fff;\n  }\n@media (min-width: 768px) {\n  .navbar-embossed > .navbar-collapse {\n    border-radius: 6px;\n    box-shadow: inset 0 -2px 0 rgba(0, 0, 0, .15);\n    }\n  .navbar-embossed.navbar-inverse .navbar-nav .active > a,\n  .navbar-embossed.navbar-inverse .navbar-nav .open > a {\n    box-shadow: inset 0 -2px 0 rgba(0, 0, 0, .15);\n    }\n  }\n.navbar-lg {\n  min-height: 76px;\n  }\n.navbar-lg .navbar-brand {\n  height: 76px;\n  padding-top: 26px;\n  padding-bottom: 26px;\n  line-height: 1;\n  }\n.navbar-lg .navbar-brand > [class*=\"fui-\"] {\n  font-size: 24px;\n  line-height: 1;\n  }\n.navbar-lg .navbar-nav > li > a {\n  font-size: 15px;\n  line-height: 1.6;\n  }\n@media (min-width: 768px) {\n  .navbar-lg .navbar-nav > li > a {\n    padding-top: 26px;\n    padding-bottom: 26px;\n    }\n  }\n.navbar-lg .navbar-toggle {\n  height: 76px;\n  line-height: 76px;\n  }\n.navbar-lg .navbar-form {\n  padding-top: 20.5px;\n  padding-bottom: 20.5px;\n  }\n.navbar-lg .navbar-text {\n  padding-top: 26.5px;\n  padding-bottom: 26.5px;\n  }\n.navbar-lg .navbar-btn {\n  margin-top: 17.5px;\n  margin-bottom: 17.5px;\n  }\n.navbar-lg .navbar-btn.btn-sm {\n  margin-top: 20.5px;\n  margin-bottom: 20.5px;\n  }\n.navbar-lg .navbar-btn.btn-xs {\n  margin-top: 25.5px;\n  margin-bottom: 25.5px;\n  }\n.bootstrap-switch {\n  position: relative;\n  display: inline-block;\n  width: 80px;\n  height: 29px;\n  overflow: hidden;\n  font-size: 15px;\n  line-height: 29px;\n  text-align: left;\n  vertical-align: middle;\n  cursor: pointer;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n          user-select: none;\n  border-radius: 30px;\n\n  -webkit-mask-box-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNy4xLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgODAgMjkiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDgwIDI5IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGQ9Ik04MCwxNC41YzAsOC02LjUsMTQuNS0xNC41LDE0LjVoLTUxQzYuNSwyOSwwLDIyLjUsMCwxNC41bDAsMEMwLDYuNSw2LjUsMCwxNC41LDBoNTFDNzMuNSwwLDgwLDYuNSw4MCwxNC41TDgwLDE0LjV6Ii8+DQo8L3N2Zz4NCg==) 0 0 stretch;\n  }\n.bootstrap-switch > div {\n  display: inline-block;\n  width: 132px;\n  border-radius: 30px;\n  -webkit-transform: translate3d(0, 0, 0);\n          transform: translate3d(0, 0, 0);\n  }\n.bootstrap-switch > div > span {\n  z-index: 1;\n  display: inline-block;\n  width: 66px;\n  height: 100%;\n  padding-top: 5px;\n  padding-bottom: 5px;\n  font-weight: 700;\n  line-height: 19px;\n  text-align: center;\n  cursor: pointer;\n  -webkit-transition: box-shadow .25s ease-out;\n          transition: box-shadow .25s ease-out;\n  }\n.bootstrap-switch > div > span > [class^=\"fui-\"] {\n  text-indent: 0;\n  }\n.bootstrap-switch > div > label {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 200;\n  display: block;\n  width: 100%;\n  height: 100%;\n  margin: 0;\n  font-size: 0;\n  text-indent: -9999px;\n  cursor: pointer;\n  filter: alpha(opacity=0);\n  opacity: 0;\n  }\n.bootstrap-switch input[type=\"radio\"],\n.bootstrap-switch input[type=\"checkbox\"] {\n  position: absolute !important;\n  top: 0;\n  left: 0;\n  z-index: -1;\n  margin: 0;\n  filter: alpha(opacity=0);\n  opacity: 0;\n  }\n.bootstrap-switch-handle-on {\n  border-top-left-radius: 30px;\n  border-bottom-left-radius: 30px;\n  }\n.bootstrap-switch-off .bootstrap-switch-handle-on ~ .bootstrap-switch-handle-off.bootstrap-switch-default {\n  box-shadow: inset 0 0 transparent, -16px 0 0 #bdc3c7;\n  }\n.bootstrap-switch-off .bootstrap-switch-handle-on ~ .bootstrap-switch-handle-off.bootstrap-switch-default:before {\n  background-color: #7f8c9a;\n  border-color: #bdc3c7;\n  }\n.bootstrap-switch-off .bootstrap-switch-handle-on ~ .bootstrap-switch-handle-off.bootstrap-switch-primary {\n  box-shadow: inset 0 0 transparent, -16px 0 0 #34495e;\n  }\n.bootstrap-switch-off .bootstrap-switch-handle-on ~ .bootstrap-switch-handle-off.bootstrap-switch-primary:before {\n  background-color: #1abc9c;\n  border-color: #34495e;\n  }\n.bootstrap-switch-off .bootstrap-switch-handle-on ~ .bootstrap-switch-handle-off.bootstrap-switch-success {\n  box-shadow: inset 0 0 transparent, -16px 0 0 #2ecc71;\n  }\n.bootstrap-switch-off .bootstrap-switch-handle-on ~ .bootstrap-switch-handle-off.bootstrap-switch-success:before {\n  background-color: #fff;\n  border-color: #2ecc71;\n  }\n.bootstrap-switch-off .bootstrap-switch-handle-on ~ .bootstrap-switch-handle-off.bootstrap-switch-warning {\n  box-shadow: inset 0 0 transparent, -16px 0 0 #f1c40f;\n  }\n.bootstrap-switch-off .bootstrap-switch-handle-on ~ .bootstrap-switch-handle-off.bootstrap-switch-warning:before {\n  background-color: #fff;\n  border-color: #f1c40f;\n  }\n.bootstrap-switch-off .bootstrap-switch-handle-on ~ .bootstrap-switch-handle-off.bootstrap-switch-info {\n  box-shadow: inset 0 0 transparent, -16px 0 0 #3498db;\n  }\n.bootstrap-switch-off .bootstrap-switch-handle-on ~ .bootstrap-switch-handle-off.bootstrap-switch-info:before {\n  background-color: #fff;\n  border-color: #3498db;\n  }\n.bootstrap-switch-off .bootstrap-switch-handle-on ~ .bootstrap-switch-handle-off.bootstrap-switch-danger {\n  box-shadow: inset 0 0 transparent, -16px 0 0 #e74c3c;\n  }\n.bootstrap-switch-off .bootstrap-switch-handle-on ~ .bootstrap-switch-handle-off.bootstrap-switch-danger:before {\n  background-color: #fff;\n  border-color: #e74c3c;\n  }\n.bootstrap-switch-handle-off {\n  border-top-right-radius: 30px;\n  border-bottom-right-radius: 30px;\n  }\n.bootstrap-switch-handle-off:before {\n  position: absolute;\n  top: 0;\n  left: 51px;\n  z-index: 100;\n  display: inline-block;\n  width: 29px;\n  height: 29px;\n  padding: 0;\n  text-align: center;\n  vertical-align: top;\n  content: \" \";\n  background-clip: padding-box;\n  border: 4px solid transparent;\n  border-radius: 50%;\n  -webkit-transition: border-color .25s ease-out, background-color .25s ease-out;\n          transition: border-color .25s ease-out, background-color .25s ease-out;\n  }\n.bootstrap-switch-animate > div {\n  -webkit-transition: margin-left .25s ease-out;\n          transition: margin-left .25s ease-out;\n  }\n.bootstrap-switch-on > div {\n  margin-left: 0;\n  }\n.bootstrap-switch-off > div {\n  margin-left: -51px;\n  }\n.bootstrap-switch-disabled,\n.bootstrap-switch-readonly {\n  cursor: default;\n  filter: alpha(opacity=50);\n  opacity: .5;\n  }\n.bootstrap-switch-disabled > div > span,\n.bootstrap-switch-readonly > div > span,\n.bootstrap-switch-disabled > div > label,\n.bootstrap-switch-readonly > div > label {\n  cursor: default !important;\n  }\n.bootstrap-switch-focused {\n  outline: 0;\n  }\n.bootstrap-switch-default {\n  color: #fff;\n  background-color: #bdc3c7;\n  }\n.bootstrap-switch-default ~ .bootstrap-switch-handle-off:before {\n  background-color: #7f8c9a;\n  border-color: #bdc3c7;\n  }\n.bootstrap-switch-on .bootstrap-switch-default ~ .bootstrap-switch-handle-off {\n  box-shadow: inset 16px 0 0 #bdc3c7;\n  }\n.bootstrap-switch-primary {\n  color: #1abc9c;\n  background-color: #34495e;\n  }\n.bootstrap-switch-primary ~ .bootstrap-switch-handle-off:before {\n  background-color: #1abc9c;\n  border-color: #34495e;\n  }\n.bootstrap-switch-on .bootstrap-switch-primary ~ .bootstrap-switch-handle-off {\n  box-shadow: inset 16px 0 0 #34495e;\n  }\n.bootstrap-switch-info {\n  color: #fff;\n  background-color: #3498db;\n  }\n.bootstrap-switch-info ~ .bootstrap-switch-handle-off:before {\n  background-color: #fff;\n  border-color: #3498db;\n  }\n.bootstrap-switch-on .bootstrap-switch-info ~ .bootstrap-switch-handle-off {\n  box-shadow: inset 16px 0 0 #3498db;\n  }\n.bootstrap-switch-success {\n  color: #fff;\n  background-color: #2ecc71;\n  }\n.bootstrap-switch-success ~ .bootstrap-switch-handle-off:before {\n  background-color: #fff;\n  border-color: #2ecc71;\n  }\n.bootstrap-switch-on .bootstrap-switch-success ~ .bootstrap-switch-handle-off {\n  box-shadow: inset 16px 0 0 #2ecc71;\n  }\n.bootstrap-switch-warning {\n  color: #fff;\n  background-color: #f1c40f;\n  }\n.bootstrap-switch-warning ~ .bootstrap-switch-handle-off:before {\n  background-color: #fff;\n  border-color: #f1c40f;\n  }\n.bootstrap-switch-on .bootstrap-switch-warning ~ .bootstrap-switch-handle-off {\n  box-shadow: inset 16px 0 0 #f1c40f;\n  }\n.bootstrap-switch-danger {\n  color: #fff;\n  background-color: #e74c3c;\n  }\n.bootstrap-switch-danger ~ .bootstrap-switch-handle-off:before {\n  background-color: #fff;\n  border-color: #e74c3c;\n  }\n.bootstrap-switch-on .bootstrap-switch-danger ~ .bootstrap-switch-handle-off {\n  box-shadow: inset 16px 0 0 #e74c3c;\n  }\n.bootstrap-switch-square .bootstrap-switch {\n  border-radius: 4px;\n\n  -webkit-mask-box-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNy4xLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgODAgMjkiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDgwIDI5IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGQ9Ik04MCwyNWMwLDIuMi0xLjgsNC00LDRINGMtMi4yLDAtNC0xLjgtNC00VjRjMC0yLjIsMS44LTQsNC00aDcyYzIuMiwwLDQsMS44LDQsNFYyNXoiLz4NCjwvc3ZnPg0K) 0 0 stretch;\n  }\n.bootstrap-switch-square .bootstrap-switch > div {\n  border-radius: 4px;\n  }\n.bootstrap-switch-square .bootstrap-switch .bootstrap-switch-handle-on {\n  text-indent: -15px;\n  border-top-left-radius: 4px;\n  border-bottom-left-radius: 4px;\n  }\n.bootstrap-switch-square .bootstrap-switch .bootstrap-switch-handle-off {\n  text-indent: 15px;\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 4px;\n  }\n.bootstrap-switch-square .bootstrap-switch .bootstrap-switch-handle-off:before {\n  border: none;\n  border-top-left-radius: 0;\n  border-top-right-radius: 2px;\n  border-bottom-right-radius: 2px;\n  border-bottom-left-radius: 0;\n  }\n.bootstrap-switch-square .bootstrap-switch-off .bootstrap-switch-handle-off:before {\n  border-top-left-radius: 2px;\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 2px;\n  }\n.share {\n  position: relative;\n  background-color: #eff0f2;\n  border-radius: 6px;\n  }\n.share ul {\n  padding: 15px;\n  margin: 0;\n  list-style-type: none;\n  }\n.share li {\n  padding-top: 11px;\n  font-size: 15px;\n  line-height: 1.4;\n  }\n.share li:before,\n.share li:after {\n  display: table;\n  content: \" \";\n  }\n.share li:after {\n  clear: both;\n  }\n.share li:first-child {\n  padding-top: 0;\n  }\n.share .toggle {\n  float: right;\n  margin: 0;\n  }\n.share .btn {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n  }\n.share-label {\n  float: left;\n  width: 50%;\n  padding-top: 5px;\n  font-size: 15px;\n  line-height: 1.4;\n  }\n.video-js {\n  position: relative;\n  width: 100% !important;\n  height: auto !important;\n  padding-bottom: 47px;\n  overflow: hidden;\n  font-size: 0;\n  vertical-align: middle;\n  background-color: transparent;\n\n  -webkit-backface-visibility: hidden;\n          backface-visibility: hidden;\n  border-top-radius: 6px;\n  }\n.video-js .vjs-tech {\n  display: block;\n  width: 100%;\n  height: 100%;\n  }\n.video-js::-moz-full-screen {\n  position: absolute;\n  }\n.video-js::-webkit-full-screen {\n  width: 100% !important;\n  height: 100% !important;\n  }\n.vjs-fullscreen {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 10000;\n  width: 100% !important;\n  height: 100% !important;\n  overflow: hidden;\n\n  border-top-radius: 0;\n  }\n.vjs-fullscreen .vjs-control-bar {\n  margin-top: 0;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n  }\n.vjs-fullscreen .vjs-tech {\n  background-color: #000;\n  }\n.vjs-poster {\n  position: relative;\n  width: 100%;\n  max-height: 100%;\n  padding: 0;\n  margin: 0 auto;\n  cursor: pointer;\n\n  border-top-radius: 6px;\n  }\n.vjs-control-bar {\n  position: relative;\n  height: 47px;\n  margin-top: -1px;\n  color: #fff;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n          user-select: none;\n  background: #2c3e50;\n  border-bottom-right-radius: 6px;\n  border-bottom-left-radius: 6px;\n  }\n.vjs-control-bar.vjs-fade-out {\n  visibility: visible !important;\n  opacity: 1 !important;\n  }\n.vjs-text-track-display {\n  position: absolute;\n  right: 1em;\n  bottom: 4em;\n  left: 1em;\n  font-family: \"Lato\", Helvetica, Arial, sans-serif;\n  text-align: center;\n  }\n.vjs-text-track {\n  display: none;\n  margin-bottom: .1em;\n  font-size: 1.4em;\n  color: #fff;\n  text-align: center;\n  background-color: rgba(0, 0, 0, .5);\n  }\n.vjs-subtitles {\n  color: #fff;\n  }\n.vjs-captions {\n  color: #fc6;\n  }\n.vjs-tt-cue {\n  display: block;\n  }\n.vjs-fade-in {\n  visibility: visible !important;\n  opacity: 1 !important;\n  -webkit-transition: visibility 0s linear 0s, opacity .3s linear;\n          transition: visibility 0s linear 0s, opacity .3s linear;\n  }\n.vjs-fade-out {\n  visibility: hidden !important;\n  opacity: 0 !important;\n  -webkit-transition: visibility 0s linear 1.5s, opacity 1.5s linear;\n          transition: visibility 0s linear 1.5s, opacity 1.5s linear;\n  }\n.vjs-control {\n  position: relative;\n  display: inline-block;\n  width: 18px;\n  height: 18px;\n  text-align: center;\n  vertical-align: middle;\n  background-repeat: no-repeat;\n  background-position: center;\n  }\n.vjs-control:focus {\n  outline: 0;\n  }\n.vjs-control > div {\n  background-repeat: no-repeat;\n  background-position: center;\n  }\n.vjs-control-text {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0 0 0 0);\n  border: 0;\n  }\n.vjs-play-control {\n  width: 58px;\n  height: 47px;\n  cursor: pointer;\n  }\n.vjs-play-control > div {\n  position: relative;\n  height: 47px;\n  }\n.vjs-play-control > div:before,\n.vjs-play-control > div:after {\n  position: absolute;\n  top: 38%;\n  left: 50%;\n  margin: -.5em 0 0 -.5em;\n  font-family: \"Flat-UI-Icons\";\n  font-size: 16px;\n  color: #1abc9c;\n  -webkit-transition: color .25s, opacity .25s;\n          transition: color .25s, opacity .25s;\n\n  -webkit-font-smoothing: antialiased;\n  }\n.vjs-play-control > div:after {\n  content: \"\\e615\";\n  }\n.vjs-play-control > div:before {\n  content: \"\\e616\";\n  }\n.vjs-paused .vjs-play-control:hover > div:before {\n  color: #16a085;\n  }\n.vjs-paused .vjs-play-control > div:after {\n  filter: alpha(opacity=0);\n  opacity: 0;\n  }\n.vjs-paused .vjs-play-control > div:before {\n          filter: none;\n  opacity: 1;\n\n  -webkit-filter: none;\n  }\n.vjs-playing .vjs-play-control:hover > div:after {\n  color: #16a085;\n  }\n.vjs-playing .vjs-play-control > div:after {\n          filter: none;\n  opacity: 1;\n\n  -webkit-filter: none;\n  }\n.vjs-playing .vjs-play-control > div:before {\n  filter: alpha(opacity=0);\n  opacity: 0;\n  }\n.vjs-rewind-control {\n  width: 5em;\n  cursor: pointer !important;\n  }\n.vjs-rewind-control > div {\n  width: 19px;\n  height: 16px;\n  margin: .5em auto 0;\n  background: none transparent;\n  }\n.vjs-mute-control {\n  float: right;\n  margin: 14px 0;\n  cursor: pointer !important;\n  }\n.vjs-mute-control:hover > div,\n.vjs-mute-control:focus > div {\n  color: #57718b;\n  }\n.vjs-mute-control > div {\n  height: 18px;\n  color: #475d72;\n  }\n.vjs-mute-control > div:after,\n.vjs-mute-control > div:before {\n  position: absolute;\n  left: 50%;\n  margin: 0 0 0 -.5em;\n  font-family: \"Flat-UI-Icons\";\n  font-size: 16px;\n  line-height: 18px;\n  -webkit-transition: color .25s, opacity .25s;\n          transition: color .25s, opacity .25s;\n\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  }\n.vjs-mute-control > div:after {\n  content: \"\\e617\";\n  }\n.vjs-mute-control > div:before {\n  content: \"\\e618\";\n  filter: alpha(opacity=0);\n  opacity: 0;\n  }\n.vjs-mute-control.vjs-vol-0 > div:after {\n  filter: alpha(opacity=0);\n  opacity: 0;\n  }\n.vjs-mute-control.vjs-vol-0 > div:before {\n          filter: none;\n  opacity: 1;\n\n  -webkit-filter: none;\n  }\n.vjs-volume-control,\n.vjs-volume-level,\n.vjs-volume-handle,\n.vjs-volume-bar {\n  display: none;\n  }\n.vjs-progress-control {\n  position: absolute;\n  top: 18px;\n  right: 160px;\n  left: 60px;\n  width: auto;\n  height: 12px;\n  background: #425669;\n  border-radius: 32px;\n  }\n.vjs-progress-holder {\n  position: relative;\n  height: 12px;\n  padding: 0;\n  margin: 0;\n  cursor: pointer !important;\n  }\n.vjs-play-progress,\n.vjs-load-progress {\n  display: block;\n  height: 12px;\n  padding: 0;\n  margin: 0;\n  border-radius: 32px;\n  }\n.vjs-play-progress {\n  position: absolute;\n  top: 0;\n  left: -1px;\n  background: #1abc9c;\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n  }\n.vjs-load-progress {\n  background: #d6dbdf;\n  }\n.vjs-load-progress[style*=\"100%\"],\n.vjs-load-progress[style*=\"99%\"] {\n  border-radius: 32px;\n  }\n.vjs-seek-handle {\n  position: absolute;\n  top: 0;\n  width: 18px;\n  height: 18px;\n  margin: -3px 0 0 -3px;\n  background-color: #16a085;\n  border-radius: 50%;\n  -webkit-transition: background-color .25s;\n          transition: background-color .25s;\n  }\n.vjs-seek-handle[style*=\"95.\"] {\n  margin-left: 3px;\n  }\n.vjs-seek-handle[style=\"left: 0%;\"] {\n  margin-left: -2px;\n  }\n.vjs-seek-handle:hover,\n.vjs-seek-handle:focus {\n  background-color: #148d75;\n  }\n.vjs-seek-handle:active {\n  background-color: #117a65;\n  }\n.vjs-time-controls {\n  position: absolute;\n  width: auto;\n  height: auto;\n  font-family: \"Lato\", Helvetica, Arial, sans-serif;\n  font-size: 13px;\n  font-weight: 300;\n  line-height: normal;\n  }\n.vjs-time-divider {\n  position: absolute;\n  top: 11px;\n  right: 114px;\n  font-size: 14px;\n  color: #5d6d7e;\n  }\n.vjs-remaining-time {\n  display: none;\n  }\n.vjs-current-time {\n  top: 16px;\n  right: 122px;\n  }\n.vjs-duration {\n  top: 16px;\n  right: 85px;\n  color: #5d6d7e;\n  }\n.vjs-fullscreen-control {\n  float: right;\n  margin: 14px 15px;\n  cursor: pointer;\n  }\n.vjs-fullscreen-control:hover > div,\n.vjs-fullscreen-control:focus > div {\n  color: #57718b;\n  }\n.vjs-fullscreen-control > div {\n  height: 18px;\n  color: #475d72;\n  }\n.vjs-fullscreen-control > div:before {\n  position: absolute;\n  left: 50%;\n  margin: 0 0 0 -.5em;\n  font-family: \"Flat-UI-Icons\";\n  font-size: 16px;\n  line-height: 18px;\n  content: \"\\e619\";\n  -webkit-transition: color .25s, opacity .25s;\n          transition: color .25s, opacity .25s;\n\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  }\n.vjs-menu-button {\n  display: none !important;\n  }\n.vjs-loading-spinner {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  display: none;\n  width: 16px;\n  height: 16px;\n  margin: -8px 0 0 -8px;\n  background: #ebedee;\n  border-radius: 10px;\n  -webkit-animation: sharp 2s ease infinite;\n          animation: sharp 2s ease infinite;\n  }\n@-webkit-keyframes sharp {\n  0% {\n    background-color: #e74c3c;\n    border-radius: 10px;\n    -webkit-transform: rotate(0deg);\n            transform: rotate(0deg);\n    }\n  50% {\n    background-color: #ebedee;\n    border-radius: 0;\n    -webkit-transform: rotate(180deg);\n            transform: rotate(180deg);\n    }\n  100% {\n    background-color: #e74c3c;\n    border-radius: 10px;\n    -webkit-transform: rotate(360deg);\n            transform: rotate(360deg);\n    }\n  }\n@keyframes sharp {\n  0% {\n    background-color: #e74c3c;\n    border-radius: 10px;\n    -webkit-transform: rotate(0deg);\n            transform: rotate(0deg);\n    }\n  50% {\n    background-color: #ebedee;\n    border-radius: 0;\n    -webkit-transform: rotate(180deg);\n            transform: rotate(180deg);\n    }\n  100% {\n    background-color: #e74c3c;\n    border-radius: 10px;\n    -webkit-transform: rotate(360deg);\n            transform: rotate(360deg);\n    }\n  }\n.todo {\n  margin-bottom: 20px;\n  color: #798795;\n  border-radius: 6px;\n  }\n.todo ul {\n  padding: 0;\n  margin: 0;\n  list-style-type: none;\n  background-color: #2c3e50;\n  border-radius: 0 0 6px 6px;\n  }\n.todo li {\n  position: relative;\n  padding: 18px 42px 21px 25px;\n  margin-top: 2px;\n  font-size: 14px;\n  line-height: 1.214;\n  cursor: pointer;\n  background: #34495e;\n  background-size: 20px 20px;\n  -webkit-transition: .25s;\n          transition: .25s;\n  }\n.todo li:first-child {\n  margin-top: 0;\n  }\n.todo li:last-child {\n  padding-bottom: 21px;\n  border-radius: 0 0 6px 6px;\n  }\n.todo li.todo-done {\n  color: #1abc9c;\n  background: transparent;\n  }\n.todo li.todo-done .todo-name {\n  color: #1abc9c;\n  }\n.todo li:after {\n  position: absolute;\n  top: 50%;\n  right: 22px;\n  display: block;\n  width: 20px;\n  height: 20px;\n  margin-top: -10px;\n  content: \" \";\n  background: #fff;\n  border-radius: 50%;\n  }\n.todo li.todo-done:after {\n  font-family: 'Flat-UI-Icons';\n  font-size: 12px;\n  font-style: normal;\n  font-weight: normal;\n  font-variant: normal;\n  line-height: 21px;\n  color: #2c3e50;\n  text-align: center;\n  text-transform: none;\n  content: \"\\e60a\";\n  background: #1abc9c;\n\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  }\n.todo-search {\n  position: relative;\n  padding: 19px 25px 20px;\n  color: #34495e;\n  background: #1abc9c;\n  background-size: 16px 16px;\n  border-radius: 6px 6px 0 0;\n  }\n.todo-search:before {\n  position: absolute;\n  top: 50%;\n  left: 92%;\n  display: inline-block;\n  margin: -.5em 0 0 -1em;\n  font-family: 'Flat-UI-Icons';\n  font-size: 16px;\n  line-height: 17px;\n  content: \"\\e630\";\n  }\n.todo-search-field {\n  padding: 5px 0;\n  margin: 0;\n  font-size: 19px;\n  font-weight: 700;\n  line-height: 23px;\n  color: #34495e;\n  text-indent: 0;\n  background: none;\n  border: none;\n  outline: none;\n  box-shadow: none;\n  }\n.todo-search-field::-moz-placeholder {\n  color: #34495e;\n  opacity: 1;\n  }\n.todo-search-field:-ms-input-placeholder {\n  color: #34495e;\n  }\n.todo-search-field::-webkit-input-placeholder {\n  color: #34495e;\n  }\n.todo-icon {\n  float: left;\n  padding: 11px 22px 0 0;\n  font-size: 24px;\n  }\n.todo-content {\n  padding-top: 1px;\n  overflow: hidden;\n  }\n.todo-name {\n  margin: 1px 0 3px;\n  font-size: 17px;\n  color: #fff;\n  }\n.pallete-item {\n  float: left;\n  width: 140px;\n  margin: 0 0 20px 20px;\n  }\n.palette {\n  padding: 15px;\n  margin: 0;\n  font-size: 14px;\n  line-height: 1.214;\n  color: #fff;\n  text-transform: uppercase;\n  }\n.palette dt,\n.palette dd {\n  line-height: 1.429;\n  }\n.palette dt {\n  display: block;\n  font-weight: bold;\n  opacity: .8;\n  }\n.palette dd {\n  margin-left: 0;\n  font-weight: 300;\n  opacity: .8;\n\n  -webkit-font-smoothing: subpixel-antialiased;\n  }\n.palette-turquoise {\n  background-color: #1abc9c;\n  }\n.palette-green-sea {\n  background-color: #16a085;\n  }\n.palette-emerald {\n  background-color: #2ecc71;\n  }\n.palette-nephritis {\n  background-color: #27ae60;\n  }\n.palette-peter-river {\n  background-color: #3498db;\n  }\n.palette-belize-hole {\n  background-color: #2980b9;\n  }\n.palette-amethyst {\n  background-color: #9b59b6;\n  }\n.palette-wisteria {\n  background-color: #8e44ad;\n  }\n.palette-wet-asphalt {\n  background-color: #34495e;\n  }\n.palette-midnight-blue {\n  background-color: #2c3e50;\n  }\n.palette-sun-flower {\n  background-color: #f1c40f;\n  }\n.palette-orange {\n  background-color: #f39c12;\n  }\n.palette-carrot {\n  background-color: #e67e22;\n  }\n.palette-pumpkin {\n  background-color: #d35400;\n  }\n.palette-alizarin {\n  background-color: #e74c3c;\n  }\n.palette-pomegranate {\n  background-color: #c0392b;\n  }\n.palette-clouds {\n  background-color: #ecf0f1;\n  }\n.palette-silver {\n  background-color: #bdc3c7;\n  }\n.palette-concrete {\n  background-color: #95a5a6;\n  }\n.palette-asbestos {\n  background-color: #7f8c8d;\n  }\n.palette-clouds {\n  color: #bdc3c7;\n  }\n.palette-paragraph {\n  font-size: 12px;\n  line-height: 17px;\n  color: #7f8c8d;\n  }\n.palette-paragraph span {\n  color: #bdc3c7;\n  }\n.palette-headline {\n  margin-top: -3px;\n  font-size: 13px;\n  font-weight: 700;\n  color: #7f8c8d;\n  }\n.login {\n  position: relative;\n  padding: 38px 38px 267px;\n  margin-bottom: 77px;\n  color: #fff;\n  background: url(../img/login/imac.png) 0 0 no-repeat;\n  background-size: 940px 778px;\n  }\n.login-screen {\n  min-height: 473px;\n  padding: 123px 199px 33px 306px;\n  background-color: #1abc9c;\n  }\n.login-icon {\n  position: absolute;\n  top: 160px;\n  left: 200px;\n  width: 96px;\n  }\n.login-icon > img {\n  display: block;\n  width: 100%;\n  margin-bottom: 6px;\n  }\n.login-icon > h4 {\n  font-size: 17px;\n  font-weight: 300;\n  line-height: 34px;\n  opacity: .95;\n  }\n.login-icon > h4 small {\n  display: block;\n  font-size: inherit;\n  font-weight: 700;\n  color: inherit;\n  }\n.login-form {\n  position: relative;\n  padding: 24px 23px 20px;\n  background-color: #edeff1;\n  border-radius: 6px;\n  }\n.login-form .control-group {\n  position: relative;\n  margin-bottom: 6px;\n  }\n.login-form .login-field {\n  font-size: 17px;\n  text-indent: 3px;\n  border-color: transparent;\n  }\n.login-form .login-field:focus {\n  border-color: #1abc9c;\n  }\n.login-form .login-field:focus + .login-field-icon {\n  color: #1abc9c;\n  }\n.login-form .login-field-icon {\n  position: absolute;\n  top: 3px;\n  right: 15px;\n  font-size: 16px;\n  color: #bfc9ca;\n  -webkit-transition: all .25s;\n          transition: all .25s;\n  }\n.login-link {\n  display: block;\n  margin-top: 15px;\n  font-size: 13px;\n  color: #bfc9ca;\n  text-align: center;\n  }\n@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (-webkit-min-device-pixel-ratio: 1.5), only screen and (-moz-min-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 3/2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (-moz-min-device-pixel-ratio: 1.5), only screen and (min-device-pixel-ratio: 1.5), only screen and (min-device-pixel-ratio: 2) {\n  .login {\n    background-image: url(../img/login/imac-2x.png);\n    }\n  }\nfooter {\n  padding: 0;\n  font-size: 15px;\n  color: #bac1c8;\n  background-color: #edeff1;\n  }\nfooter a {\n  font-weight: 700;\n  color: #9aa4af;\n  }\nfooter p {\n  margin-bottom: 10px;\n  font-size: 15px;\n  line-height: 20px;\n  }\n.footer-title {\n  padding-top: 21px;\n  margin: 0 0 22px;\n  font-size: 24px;\n  line-height: 40px;\n  }\n.footer-brand {\n  display: block;\n  width: 220px;\n  margin-bottom: 26px;\n  }\n.footer-brand img {\n  width: 216px;\n  }\n.footer-banner {\n  min-height: 316px;\n  padding: 0 30px 30px;\n  margin-left: 42px;\n  color: #d1f2eb;\n  background-color: #1abc9c;\n  }\n.footer-banner .footer-title {\n  color: #fff;\n  }\n.footer-banner a {\n  color: #b7f5e9;\n  text-decoration: underline;\n  }\n.footer-banner a:hover {\n  text-decoration: none;\n  }\n.footer-banner ul {\n  padding: 0;\n  margin: 0 0 26px;\n  list-style-type: none;\n  }\n.footer-banner ul li {\n  padding: 6px 0;\n  line-height: 19px;\n  border-top: 1px solid #1bc5a3;\n  }\n.footer-banner ul li:first-child {\n  padding-top: 1px;\n  border-top: none;\n  }\n.last-col {\n  overflow: hidden;\n  }\n.ptn,\n.pvn,\n.pan {\n  padding-top: 0;\n  }\n.ptx,\n.pvx,\n.pax {\n  padding-top: 3px;\n  }\n.pts,\n.pvs,\n.pas {\n  padding-top: 5px;\n  }\n.ptm,\n.pvm,\n.pam {\n  padding-top: 10px;\n  }\n.ptl,\n.pvl,\n.pal {\n  padding-top: 20px;\n  }\n.prn,\n.phn,\n.pan {\n  padding-right: 0;\n  }\n.prx,\n.phx,\n.pax {\n  padding-right: 3px;\n  }\n.prs,\n.phs,\n.pas {\n  padding-right: 5px;\n  }\n.prm,\n.phm,\n.pam {\n  padding-right: 10px;\n  }\n.prl,\n.phl,\n.pal {\n  padding-right: 20px;\n  }\n.pbn,\n.pvn,\n.pan {\n  padding-bottom: 0;\n  }\n.pbx,\n.pvx,\n.pax {\n  padding-bottom: 3px;\n  }\n.pbs,\n.pvs,\n.pas {\n  padding-bottom: 5px;\n  }\n.pbm,\n.pvm,\n.pam {\n  padding-bottom: 10px;\n  }\n.pbl,\n.pvl,\n.pal {\n  padding-bottom: 20px;\n  }\n.pln,\n.phn,\n.pan {\n  padding-left: 0;\n  }\n.plx,\n.phx,\n.pax {\n  padding-left: 3px;\n  }\n.pls,\n.phs,\n.pas {\n  padding-left: 5px;\n  }\n.plm,\n.phm,\n.pam {\n  padding-left: 10px;\n  }\n.pll,\n.phl,\n.pal {\n  padding-left: 20px;\n  }\n.mtn,\n.mvn,\n.man {\n  margin-top: 0;\n  }\n.mtx,\n.mvx,\n.max {\n  margin-top: 3px;\n  }\n.mts,\n.mvs,\n.mas {\n  margin-top: 5px;\n  }\n.mtm,\n.mvm,\n.mam {\n  margin-top: 10px;\n  }\n.mtl,\n.mvl,\n.mal {\n  margin-top: 20px;\n  }\n.mrn,\n.mhn,\n.man {\n  margin-right: 0;\n  }\n.mrx,\n.mhx,\n.max {\n  margin-right: 3px;\n  }\n.mrs,\n.mhs,\n.mas {\n  margin-right: 5px;\n  }\n.mrm,\n.mhm,\n.mam {\n  margin-right: 10px;\n  }\n.mrl,\n.mhl,\n.mal {\n  margin-right: 20px;\n  }\n.mbn,\n.mvn,\n.man {\n  margin-bottom: 0;\n  }\n.mbx,\n.mvx,\n.max {\n  margin-bottom: 3px;\n  }\n.mbs,\n.mvs,\n.mas {\n  margin-bottom: 5px;\n  }\n.mbm,\n.mvm,\n.mam {\n  margin-bottom: 10px;\n  }\n.mbl,\n.mvl,\n.mal {\n  margin-bottom: 20px;\n  }\n.mln,\n.mhn,\n.man {\n  margin-left: 0;\n  }\n.mlx,\n.mhx,\n.max {\n  margin-left: 3px;\n  }\n.mls,\n.mhs,\n.mas {\n  margin-left: 5px;\n  }\n.mlm,\n.mhm,\n.mam {\n  margin-left: 10px;\n  }\n.mll,\n.mhl,\n.mal {\n  margin-left: 20px;\n  }\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n  .btn {\n    border-style: solid;\n    border-width: 2px;\n    }\n  .dropdown-menu,\n  .select2-drop {\n    background: #fff !important;\n    border: 2px solid #ddd;\n    }\n  .input-group-rounded .input-group-btn + .form-control,\n  .input-group-rounded .input-group-btn + .select2-search input[type=\"text\"],\n  .input-group-rounded .input-group-btn + .select2-search input[type=\"text\"] {\n    padding-left: 10px;\n    }\n  .form-control,\n  .select2-search input[type=\"text\"] {\n    border: 2px solid #ddd !important;\n    }\n  .bootstrap-switch {\n    width: 84px;\n    height: 33px;\n    border: 2px solid #bdc3c7;\n    }\n  .tooltip {\n    border: 2px solid #bdc3c7;\n    }\n  .progress,\n  .ui-slider {\n    background: #ddd !important;\n    }\n  .progress-bar,\n  .ui-slider-range,\n  .ui-slider-handle {\n    background: #bdc3c7 !important;\n    }\n  }\n/*# sourceMappingURL=flat-ui.css.map */\n"
  },
  {
    "path": "app/lib/flat-ui/fonts/glyphicons/selection.json",
    "content": "{\n\t\"IcoMoonType\": \"selection\",\n\t\"icons\": [\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M128 256l384 512 384-512h-768z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"triangle-down\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 1,\n\t\t\t\t\"id\": 64,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58881,\n\t\t\t\t\"name\": \"triangle-down\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 1\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M896 704h-768l384-384 384 384z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"triangle-up-small\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 2,\n\t\t\t\t\"id\": 69,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58882,\n\t\t\t\t\"name\": \"triangle-up-small\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 2\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M512 704l-384-384h768l-384 384z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"triangle-down-small\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 3,\n\t\t\t\t\"id\": 65,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58883,\n\t\t\t\t\"name\": \"triangle-down-small\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 3\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M896 960l-768-448 768-448v896z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"triangle-left-large\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 4,\n\t\t\t\t\"id\": 66,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58884,\n\t\t\t\t\"name\": \"triangle-left-large\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 4\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M128 64l768 448-768 448v-896z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"triangle-right-large\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 5,\n\t\t\t\t\"id\": 67,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58885,\n\t\t\t\t\"name\": \"triangle-right-large\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 5\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M224.96 511.232l447.168-447.232 128 131.008-321.152 318.016 321.152 320.896-128.256 128.256-446.912-450.944z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"arrow-left\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 6,\n\t\t\t\t\"id\": 1,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58886,\n\t\t\t\t\"name\": \"arrow-left\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 6\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M353.152 962.112l-128.192-128.256 321.088-320.896-321.152-317.952 128-131.008 447.168 447.232-446.912 450.88z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"arrow-right\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 7,\n\t\t\t\t\"id\": 2,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58887,\n\t\t\t\t\"name\": \"arrow-right\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 7\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M928 608.064h-320v319.936c0 35.392-28.608 64-64 64h-64c-35.328 0-64-28.608-64-64v-319.936h-320c-35.328 0-64-28.736-64-64.064v-64.064c0-35.328 28.672-63.872 64-63.872h320v-320.064c0-35.328 28.672-64 64-64h64c35.392 0 64 28.672 64 64v320.064h320c35.392 0 64 28.544 64 63.872v64.064c0 35.328-28.608 64.064-64 64.064z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"plus\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 8,\n\t\t\t\t\"id\": 36,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58888,\n\t\t\t\t\"name\": \"plus\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 8\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M919.808 195.968c12.48 12.416 12.48 32.832 0 45.248l-248.896 249.024c-12.352 12.416-12.352 32.832 0 45.312l248.768 249.088c12.48 12.416 12.48 32.832 0 45.248l-90.624 90.432c-12.352 12.416-32.768 12.416-45.248 0l-248.64-249.088c-12.416-12.416-32.832-12.416-45.248 0l-248.896 248.896c-12.416 12.48-32.832 12.48-45.248 0l-90.496-90.624c-12.416-12.352-12.416-32.768 0-45.248l248.96-248.896c12.416-12.416 12.416-32.832 0-45.312l-248.768-249.024c-12.416-12.48-12.416-32.832 0-45.248l90.56-90.496c12.416-12.416 32.832-12.416 45.248 0l248.64 249.024c12.416 12.48 32.832 12.48 45.248 0.064l248.832-248.96c12.48-12.352 32.896-12.352 45.248 0l90.56 90.56z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"cross\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 9,\n\t\t\t\t\"id\": 13,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58889,\n\t\t\t\t\"name\": \"cross\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 9\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M923.136 137.408c-12.352-12.544-32.768-12.544-45.12 0l-476.16 474.496c-12.48 12.544-32.832 12.544-45.248 0l-208.64-212.736c-6.144-6.208-14.272-9.408-22.336-9.472-8.256 0-16.576 3.008-22.848 9.472l-92.16 83.008c-6.144 6.272-9.472 14.144-9.472 22.336 0 8.32 3.328 17.024 9.472 23.232l210.368 220.992c12.416 12.48 32.832 33.024 45.248 45.632l90.432 91.264c12.416 12.48 32.768 12.48 45.248 0l611.712-611.328c12.48-12.48 12.48-33.088 0-45.632l-90.496-91.264z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"check\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 10,\n\t\t\t\t\"id\": 8,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58890,\n\t\t\t\t\"name\": \"check\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 10\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M512 0c-281.6 0-512 230.4-512 512s230.4 512 512 512 512-230.4 512-512c0-281.6-230.4-512-512-512zM512 819.2c-168.96 0-307.2-138.24-307.2-307.2 0-168.96 138.24-307.2 307.2-307.2 168.96 0 307.2 138.24 307.2 307.2 0 168.96-138.24 307.2-307.2 307.2z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"radio-unchecked\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 11,\n\t\t\t\t\"id\": 63,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58891,\n\t\t\t\t\"name\": \"radio-unchecked\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 11\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M512 0c-281.6 0-512 230.4-512 512s230.4 512 512 512 512-230.4 512-512c0-281.6-230.4-512-512-512zM512 819.2c-168.96 0-307.2-138.24-307.2-307.2 0-168.96 138.24-307.2 307.2-307.2 168.96 0 307.2 138.24 307.2 307.2 0 168.96-138.24 307.2-307.2 307.2zM512 358.4c-87.040 0-153.6 66.56-153.6 153.6s66.56 153.6 153.6 153.6 153.6-66.56 153.6-153.6c0-87.040-66.56-153.6-153.6-153.6z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"radio-checked\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 12,\n\t\t\t\t\"id\": 61,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58892,\n\t\t\t\t\"name\": \"radio-checked\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 12\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M256 0h512c143.36 0 256 112.64 256 256v512c0 143.36-112.64 256-256 256h-512c-143.36 0-256-112.64-256-256v-512c0-143.36 112.64-256 256-256z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"checkbox-unchecked\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 13,\n\t\t\t\t\"id\": 54,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58893,\n\t\t\t\t\"name\": \"checkbox-unchecked\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 13\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M768 0h-512c-143.36 0-256 112.64-256 256v512c0 143.36 112.64 256 256 256h512c143.36 0 256-112.64 256-256v-512c0-143.36-112.64-256-256-256zM844.8 409.6l-368.64 368.64c-5.12 5.12-20.48 5.12-25.6 0l-56.32-56.32c-5.12-5.12-20.48-20.48-25.6-25.6l-128-133.12c-5.12-5.12-5.12-10.24-5.12-15.36s0-10.24 5.12-15.36l56.32-51.2c5.12 0 10.24-5.12 10.24-5.12 5.12 0 10.24 0 15.36 5.12l122.88 128c5.12 5.12 20.48 5.12 25.6 0l286.72-286.72c5.12-5.12 20.48-5.12 25.6 0l56.32 56.32c10.24 10.24 10.24 20.48 5.12 30.72z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"checkbox-checked\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 14,\n\t\t\t\t\"id\": 52,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58894,\n\t\t\t\t\"name\": \"checkbox-checked\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 14\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M512 0c-282.752 0-512 229.248-512 512s229.248 512 512 512c282.752 0 512-229.248 512-512 0-282.752-229.248-512-512-512zM512 831.936c-35.776 0-64.768-28.544-64.768-63.808 0-35.2 28.992-63.808 64.768-63.808 35.776 0 64.768 28.608 64.768 63.808 0 35.264-28.992 63.808-64.768 63.808zM576.768 572.224c0 37.056-28.992 67.072-64.768 67.072-35.776 0-64.768-30.080-64.768-67.072v-313.088c0-37.056 28.992-67.072 64.768-67.072 35.776 0 64.768 30.080 64.768 67.072v313.088z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"alert-circle\"\n\t\t\t\t],\n\t\t\t\t\"width\": 1024\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 15,\n\t\t\t\t\"id\": 0,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58896,\n\t\t\t\t\"name\": \"alert-circle\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 16\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M512 1024c-282.752 0-512-229.248-512-512 0-282.688 229.248-512 512-512 282.752 0 512 229.248 512 512 0 282.752-229.248 512-512 512zM512 831.936c35.776 0 64.768-28.544 64.768-63.808 0-35.2-28.992-63.808-64.768-63.808-35.776 0-64.768 28.608-64.768 63.808 0 35.264 28.992 63.808 64.768 63.808zM650.752 235.712c-33.92-27.904-82.24-43.456-140.032-43.456-42.56 0-78.912 7.68-110.144 20.16-16.576 6.72-69.632 39.68-80.64 48.896l32.384 48.32c5.312 9.344 13.952 14.080 25.92 14.080 4.992 0 10.624-1.984 16.96-5.888 4.608-2.88 41.088-21.696 56.512-26.368 32.32-9.6 67.84-5.696 84.16-0.64 22.272 6.848 38.4 19.904 47.36 37.76 5.888 11.776 13.376 44.16-4.224 74.432-14.656 25.088-37.568 44.16-62.848 61.056-13.504 9.216-26.048 18.624-37.376 28.416-0.512 0-1.792 0.96-4.672 3.52 1.408-1.216 3.264-2.304 4.672-3.52 3.2-0.128-30.784 43.328-30.784 83.52 0 42.88 0 64 0 64h128v-64c0-33.28 16.128-51.968 16.448-56.704 11.008-7.872 61.056-46.144 72.96-59.904 22.208-25.6 38.592-59.392 38.592-107.008 0-48.832-19.392-88.832-53.248-116.672z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"question-circle\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 16,\n\t\t\t\t\"id\": 39,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58897,\n\t\t\t\t\"name\": \"question-circle\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 17\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M512 0c-282.752 0-512 229.184-512 511.936 0 282.816 229.248 512.064 512 512.064 282.752 0 512-229.248 512-512.064 0-282.752-229.248-511.936-512-511.936zM842.88 407.872l-367.296 367.232c-7.488 7.488-19.712 7.488-27.136 0l-54.272-54.784c-7.424-7.552-19.712-19.904-27.136-27.392l-126.336-132.8c-3.712-3.712-5.696-8.96-5.696-13.888 0-4.992 1.984-9.728 5.696-13.504l55.36-49.92c3.776-3.84 8.768-5.632 13.696-5.632 4.864 0.064 9.728 1.984 13.44 5.632l125.248 127.872c7.488 7.616 19.648 7.616 27.136 0l285.888-285.12c7.424-7.488 19.712-7.488 27.136 0l54.336 54.912c7.424 7.488 7.424 19.84-0.064 27.392z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"check-circle\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 17,\n\t\t\t\t\"id\": 9,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58898,\n\t\t\t\t\"name\": \"check-circle\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 18\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M874.048 149.952c-199.936-200-524.096-199.936-724.096 0-199.936 199.872-199.936 524.096 0.064 724.032 199.936 199.936 524.096 199.936 724.032 0.064 200-199.936 200-524.16 0-724.096zM747.2 650.944c27.52 27.52 28.224 71.296 1.728 97.856-26.56 26.56-70.4 25.728-97.792-1.728l-139.072-139.008-139.584 139.584c-27.52 27.456-71.296 28.224-97.792 1.728-26.56-26.56-25.728-70.4 1.664-97.856l139.648-139.584-139.648-139.648c-27.456-27.392-28.224-71.168-1.664-97.728 26.496-26.56 70.336-25.792 97.792 1.664l139.584 139.584 139.072-139.072c27.456-27.456 71.232-28.224 97.792-1.664 26.496 26.56 25.728 70.336-1.728 97.792l-139.008 139.072 139.008 139.008z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"cross-circle\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 18,\n\t\t\t\t\"id\": 14,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58899,\n\t\t\t\t\"name\": \"cross-circle\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 19\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M512-0.064c-282.752 0-512 229.312-512 512.064 0 282.816 229.248 512.064 512 512.064s512-229.248 512-512.064c0-282.752-229.248-512.064-512-512.064zM764.224 576.704h-187.392v187.52c0 36.992-28.992 67.072-64.768 67.072s-64.768-30.080-64.768-67.072v-187.52h-188.16c-36.992 0-67.072-28.928-67.072-64.704s30.080-64.768 67.072-64.768h188.16v-188.16c0-37.056 28.992-67.072 64.768-67.072s64.768 30.016 64.768 67.072v188.16h187.456c37.056 0 67.072 29.056 67.072 64.768s-30.016 64.704-67.136 64.704z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"plus-circle\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 19,\n\t\t\t\t\"id\": 37,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58900,\n\t\t\t\t\"name\": \"plus-circle\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 20\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M288 0h-192c-35.328 0-64 28.608-64 64v896c0 35.392 28.672 64 64 64h192c35.328 0 64-28.608 64-64v-896c0-35.392-28.672-64-64-64zM928 0h-192c-35.392 0-64 28.608-64 64v896c0 35.392 28.608 64 64 64h192c35.392 0 64-28.608 64-64v-896c0-35.392-28.608-64-64-64z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"pause\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 20,\n\t\t\t\t\"id\": 33,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58901,\n\t\t\t\t\"name\": \"pause\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 21\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M880 484.224l-832-480c-9.856-5.696-22.144-5.696-32 0-9.856 5.76-16 16.32-16 27.776v960c0 11.456 6.144 22.016 16 27.712 4.928 2.88 10.496 4.288 16 4.288s11.072-1.408 16-4.288l832-480c9.856-5.696 16-16.256 16-27.712s-6.144-22.016-16-27.776z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"play\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 21,\n\t\t\t\t\"id\": 35,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58902,\n\t\t\t\t\"name\": \"play\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 22\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M493.184 64c-48.384 0-63.040 27.84-63.040 27.84s-183.104 216.192-266.56 216.192c-82.176 0-81.344 0-81.344 0-45.44 0-82.24 36.416-82.24 81.28v244.096c0 44.928 36.8 81.28 82.176 81.28 0 0 1.344 0 82.176 0 81.024 0 269.568 218.88 269.568 218.88 14.912 15.488 35.904 25.152 59.264 25.152 45.376 0 82.176-36.352 82.176-81.28v-732.096c0-44.928-36.8-81.344-82.176-81.344zM843.968 142.272l-47.424 70.976c86.656 70.4 142.208 177.728 142.208 298.176s-55.488 227.84-142.208 298.112l47.424 70.976c109.44-85.888 180.032-219.136 180.032-369.088 0-150.016-70.592-283.2-180.032-369.152zM748.8 284.672l-47.872 71.68c41.344 38.912 67.392 93.76 67.392 155.072s-26.048 116.096-67.392 155.072l47.872 71.616c63.872-54.72 104.576-136 104.576-226.688 0-90.816-40.704-171.968-104.576-226.752z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"volume\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 22,\n\t\t\t\t\"id\": 49,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58903,\n\t\t\t\t\"name\": \"volume\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 23\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M492.8 64c-51.2 0-64 25.6-64 25.6s-179.2 217.6-262.4 217.6c-83.2 0-83.2 0-83.2 0-44.8 0-83.2 38.4-83.2 83.2v243.2c0 44.8 38.4 83.2 83.2 83.2 0 0 0 0 83.2 0 83.2 0 268.8 217.6 268.8 217.6 12.8 12.8 32 25.6 57.6 25.6 44.8 0 83.2-38.4 83.2-83.2v-729.6c0-44.8-38.4-83.2-83.2-83.2z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"mute\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 23,\n\t\t\t\t\"id\": 96,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58904,\n\t\t\t\t\"name\": \"mute\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 24\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M832 320l-213.056 208.448-125.696-125.696 210.752-210.688-160-160.064h448v448l-160-160zM526.976 617.472l-206.976 202.496 167.488 172.032h-455.488v-452.288l160 164.288 210.752-210.752 124.224 124.224z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"resize\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 24,\n\t\t\t\t\"id\": 97,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58905,\n\t\t\t\t\"name\": \"resize\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 25\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M991.936 96.64h-959.872c-17.6 0-32 15.36-32 34.176v124.672c0 18.048 14.4 32.832 32 32.832h959.872c17.6 0 32-14.72 32-32.832v-124.672c0-18.816-14.4-34.176-32-34.176zM991.936 416.64h-959.872c-17.6 0-32 15.36-32 34.24v124.608c0 18.112 14.4 32.832 32 32.832h959.872c17.6 0 32-14.72 32-32.832v-124.672c0-18.816-14.4-34.176-32-34.176zM991.936 736.64h-959.872c-17.6 0-32 15.36-32 34.24v124.608c0 17.984 14.4 32.768 32 32.768h959.872c17.6 0 32-14.72 32-32.768v-124.608c0-18.88-14.4-34.24-32-34.24z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"list\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 25,\n\t\t\t\t\"id\": 26,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58906,\n\t\t\t\t\"name\": \"list\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 26\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M352 64h-320c-19.2 0-32 12.8-32 32v320c0 19.2 12.8 32 32 32h320c19.2 0 32-12.8 32-32v-320c0-19.2-12.8-32-32-32z\",\n\t\t\t\t\t\"M352 576h-320c-19.2 0-32 12.8-32 32v320c0 19.2 12.8 32 32 32h320c19.2 0 32-12.8 32-32v-320c0-19.2-12.8-32-32-32z\",\n\t\t\t\t\t\"M992 64h-448c-19.2 0-32 12.8-32 32v64c0 19.2 12.8 32 32 32h448c19.2 0 32-12.8 32-32v-64c0-19.2-12.8-32-32-32z\",\n\t\t\t\t\t\"M992 320h-448c-19.2 0-32 12.8-32 32v64c0 19.2 12.8 32 32 32h448c19.2 0 32-12.8 32-32v-64c0-19.2-12.8-32-32-32z\",\n\t\t\t\t\t\"M992 576h-448c-19.2 0-32 12.8-32 32v64c0 19.2 12.8 32 32 32h448c19.2 0 32-12.8 32-32v-64c0-19.2-12.8-32-32-32z\",\n\t\t\t\t\t\"M992 832h-448c-19.2 0-32 12.8-32 32v64c0 19.2 12.8 32 32 32h448c19.2 0 32-12.8 32-32v-64c0-19.2-12.8-32-32-32z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"list-thumbnailed\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 26,\n\t\t\t\t\"id\": 60,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58907,\n\t\t\t\t\"name\": \"list-thumbnailed\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 27\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M288 64h-192c-19.2 0-32 12.8-32 32v192c0 19.2 12.8 32 32 32h192c19.2 0 32-12.8 32-32v-192c0-19.2-12.8-32-32-32zM288 384h-192c-19.2 0-32 12.8-32 32v192c0 19.2 12.8 32 32 32h192c19.2 0 32-12.8 32-32v-192c0-19.2-12.8-32-32-32zM608 64h-192c-19.2 0-32 12.8-32 32v192c0 19.2 12.8 32 32 32h192c19.2 0 32-12.8 32-32v-192c0-19.2-12.8-32-32-32zM608 384h-192c-19.2 0-32 12.8-32 32v192c0 19.2 12.8 32 32 32h192c19.2 0 32-12.8 32-32v-192c0-19.2-12.8-32-32-32zM928 64h-192c-19.2 0-32 12.8-32 32v192c0 19.2 12.8 32 32 32h192c19.2 0 32-12.8 32-32v-192c0-19.2-12.8-32-32-32zM928 384h-192c-19.2 0-32 12.8-32 32v192c0 19.2 12.8 32 32 32h192c19.2 0 32-12.8 32-32v-192c0-19.2-12.8-32-32-32zM288 704h-192c-19.2 0-32 12.8-32 32v192c0 19.2 12.8 32 32 32h192c19.2 0 32-12.8 32-32v-192c0-19.2-12.8-32-32-32zM608 704h-192c-19.2 0-32 12.8-32 32v192c0 19.2 12.8 32 32 32h192c19.2 0 32-12.8 32-32v-192c0-19.2-12.8-32-32-32zM928 704h-192c-19.2 0-32 12.8-32 32v192c0 19.2 12.8 32 32 32h192c19.2 0 32-12.8 32-32v-192c0-19.2-12.8-32-32-32z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"list-small-thumbnails\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 27,\n\t\t\t\t\"id\": 59,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58908,\n\t\t\t\t\"name\": \"list-small-thumbnails\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 28\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M416 0h-384c-19.2 0-32 12.8-32 32v384c0 19.2 12.8 32 32 32h384c19.2 0 32-12.8 32-32v-384c0-19.2-12.8-32-32-32zM992 0h-384c-19.2 0-32 12.8-32 32v384c0 19.2 12.8 32 32 32h384c19.2 0 32-12.8 32-32v-384c0-19.2-12.8-32-32-32zM416 576h-384c-19.2 0-32 12.8-32 32v384c0 19.2 12.8 32 32 32h384c19.2 0 32-12.8 32-32v-384c0-19.2-12.8-32-32-32zM992 576h-384c-19.2 0-32 12.8-32 32v384c0 19.2 12.8 32 32 32h384c19.2 0 32-12.8 32-32v-384c0-19.2-12.8-32-32-32z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"list-large-thumbnails\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 28,\n\t\t\t\t\"id\": 57,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58909,\n\t\t\t\t\"name\": \"list-large-thumbnails\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 29\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M992 64h-960c-19.2 0-32 12.8-32 32v64c0 19.2 12.8 32 32 32h960c19.2 0 32-12.8 32-32v-64c0-19.2-12.8-32-32-32z\",\n\t\t\t\t\t\"M992 320h-960c-19.2 0-32 12.8-32 32v64c0 19.2 12.8 32 32 32h960c19.2 0 32-12.8 32-32v-64c0-19.2-12.8-32-32-32z\",\n\t\t\t\t\t\"M992 576h-960c-19.2 0-32 12.8-32 32v64c0 19.2 12.8 32 32 32h960c19.2 0 32-12.8 32-32v-64c0-19.2-12.8-32-32-32z\",\n\t\t\t\t\t\"M992 832h-960c-19.2 0-32 12.8-32 32v64c0 19.2 12.8 32 32 32h960c19.2 0 32-12.8 32-32v-64c0-19.2-12.8-32-32-32z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"list-columned\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 29,\n\t\t\t\t\"id\": 56,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58911,\n\t\t\t\t\"name\": \"list-columned\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 31\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M992 128h-640c-19.2 0-32 12.8-32 32v64c0 19.2 12.8 32 32 32h640c19.2 0 32-12.8 32-32v-64c0-19.2-12.8-32-32-32z\",\n\t\t\t\t\t\"M992 448h-640c-19.2 0-32 12.8-32 32v64c0 19.2 12.8 32 32 32h640c19.2 0 32-12.8 32-32v-64c0-19.2-12.8-32-32-32z\",\n\t\t\t\t\t\"M992 768h-640c-19.2 0-32 12.8-32 32v64c0 19.2 12.8 32 32 32h640c19.2 0 32-12.8 32-32v-64c0-19.2-12.8-32-32-32z\",\n\t\t\t\t\t\"M256 192c0 70.692-57.308 128-128 128-70.692 0-128-57.308-128-128 0-70.692 57.308-128 128-128 70.692 0 128 57.308 128 128z\",\n\t\t\t\t\t\"M256 512c0 70.692-57.308 128-128 128-70.692 0-128-57.308-128-128 0-70.692 57.308-128 128-128 70.692 0 128 57.308 128 128z\",\n\t\t\t\t\t\"M256 832c0 70.692-57.308 128-128 128-70.692 0-128-57.308-128-128 0-70.692 57.308-128 128-128 70.692 0 128 57.308 128 128z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"list-bulleted\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 30,\n\t\t\t\t\"id\": 55,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58912,\n\t\t\t\t\"name\": \"list-bulleted\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 32\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M896 0h-768c-70.656 0-128 57.344-128 128v768c0 70.656 57.344 128 128 128h768c70.656 0 128-57.344 128-128v-768c0-70.656-57.344-128-128-128zM384 64.064c35.328 0 64 28.608 64 63.936 0 35.392-28.672 64-64 64s-64-28.608-64-64c0-35.328 28.672-63.936 64-63.936zM192 64.064c35.328 0 64 28.608 64 63.936 0 35.392-28.672 64-64 64s-64-28.608-64-64c0-35.328 28.672-63.936 64-63.936zM896.064 896h-768.064v-640h768.064v640z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"window\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 31,\n\t\t\t\t\"id\": 50,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58913,\n\t\t\t\t\"name\": \"window\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 33\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M938.752 192.256h-106.688v-106.624c0-47.104-38.208-85.312-85.312-85.312h-661.44c-47.104 0-85.312 38.208-85.312 85.312v660.672c0 47.168 37.248 85.376 83.136 85.376h108.864v106.688c0 47.104 37.248 85.312 83.136 85.312h665.792c45.952 0 83.2-38.208 83.2-85.312v-660.736c-0.064-47.104-38.272-85.376-85.376-85.376zM384 64.384c35.328 0 64 28.608 64 63.936 0 35.392-28.672 64-64 64s-64-28.608-64-64c0-35.328 28.672-63.936 64-63.936zM192 64.384c35.328 0 64 28.608 64 63.936 0 35.392-28.672 64-64 64s-64-28.608-64-64c0-35.328 28.672-63.936 64-63.936zM128 704.32l-0.064-448h576.064v448h-576zM896 896.32h-576v-64.64h428.864c45.952 0 83.2-38.208 83.2-85.376v-297.984h63.936v448z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"windows\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 32,\n\t\t\t\t\"id\": 51,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58914,\n\t\t\t\t\"name\": \"windows\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 34\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M768 768.064c-121.6 0-197.888-68.736-256-144.448-58.112 75.712-134.4 144.448-256 144.448-102.848 0-256-68.224-256-256.064 0-187.776 153.152-256 256-256 121.6 0 197.888 68.672 256 144.448 58.112-75.776 134.4-144.448 256-144.448 102.912 0 256 68.224 256 256 0 187.84-153.088 256.064-256 256.064zM256 384c-29.632 0.512-128 11.136-128 128 0 121.856 106.624 128 128 128 78.272 0 123.264-47.808 178.752-128-55.488-80.128-100.48-128-178.752-128zM589.248 512c55.424 80.128 100.352 127.872 178.432 128 30.336-0.448 128.32-11.264 128.32-128 0-121.856-106.624-128-128-128-78.272 0-123.264 47.872-178.752 128z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"loop\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 33,\n\t\t\t\t\"id\": 29,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58915,\n\t\t\t\t\"name\": \"loop\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 35\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M800 448c-22.976 0-59.328 0-96 0v128c22.656 0 44.8 0 64 0 12.096 0 23.296 0 32 0 123.712 0 224 100.288 224 224s-100.288 224-224 224-224-100.224-224-224c0-22.976 0-59.264 0-96h-128c0 22.656 0 44.864 0 64 0 12.096 0 23.232 0 32 0 123.776-100.288 224-224 224s-224-100.224-224-224 100.288-224 224-224c22.976 0 59.328 0 96 0v-128c-22.592 0-44.864 0-64 0-12.096 0-23.232 0-32 0-123.712 0-224-100.224-224-224 0-123.712 100.288-224 224-224s224 100.288 224 224c0 22.976 0 59.328 0 96h128c0-22.592 0-44.864 0-64 0-12.096 0-23.232 0-32 0-123.712 100.288-224 224-224s224 100.288 224 224c0 123.776-100.288 224-224 224zM320 224c0-52.992-43.008-96-96-96s-96 43.008-96 96c0 53.056 43.008 96 96 96 7.744 0 19.52 0 32 0 29.568 0 64 0 64 0s0-69.056 0-96zM320 768c0-29.504 0-64 0-64s-69.056 0-96 0c-52.992 0-96 43.008-96 96s43.008 96 96 96 96-43.008 96-96c0-7.744 0-19.52 0-32zM704 800c0 52.992 43.008 96 96 96s96-43.008 96-96-43.008-96-96-96c-7.744 0-19.52 0-32 0-29.568 0-64 0-64 0s0 69.12 0 96zM576 448h-128v128h128v-128zM800 128c-52.992 0-96 43.008-96 96 0 7.744 0 19.456 0 32 0 29.632 0 64 0 64s69.056 0 96 0c52.992 0 96-42.944 96-96 0-52.992-43.008-96-96-96z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"cmd\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 34,\n\t\t\t\t\"id\": 11,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58916,\n\t\t\t\t\"name\": \"cmd\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 36\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M801.984 553.6c-28.672-17.664-65.408-7.232-81.92 23.36-0.576 1.024-0.576 2.24-1.152 3.264l-1.472-0.96c-41.984 74.432-117.696 124.736-205.184 124.736s-163.136-50.304-205.184-124.736l-1.408 0.832c-0.704-1.6-0.704-3.456-1.6-5.12-16.576-30.528-53.312-41.024-82.048-23.36s-38.528 56.832-21.952 87.36c1.28 2.24 3.264 3.648 4.672 5.696l-1.088 0.704c53.12 94.208 143.104 161.6 248.576 180.608v70.016h-120.064c-33.152 0-60.032 28.672-60.032 64 0 35.392 26.88 64 60.032 64h360.128c33.216 0 60.032-28.608 60.032-64 0-35.328-26.816-64-60.032-64h-120v-69.952c105.472-19.008 195.456-86.528 248.576-180.672l-0.384-0.256c1.088-1.472 2.624-2.432 3.456-4.096 16.64-30.656 6.784-69.76-21.952-87.424zM512.256 640c99.456 0 180.032-85.952 180.032-192v-256c0-106.048-80.64-192-180.032-192-99.456 0-180.096 85.952-180.096 192v256c0 106.048 80.64 192 180.096 192z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"mic\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 35,\n\t\t\t\t\"id\": 31,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58917,\n\t\t\t\t\"name\": \"mic\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 37\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M948.544 513.152c100.48-102.784 100.352-269.312 0-372.032-51.392-52.48-118.976-78.144-186.24-76.992-94.144 1.536-249.344 128.96-249.344 128.96s-159.616-129.216-256-129.088c-65.728 0.128-131.392 25.856-181.504 77.056-100.416 102.784-100.48 269.248 0 372.032l436.544 446.336 436.544-446.272z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"heart\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 36,\n\t\t\t\t\"id\": 21,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58918,\n\t\t\t\t\"name\": \"heart\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 38\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M512.128 527.936c-87.872 0-159.104-73.728-159.104-164.8 0-91.136 71.232-164.864 159.104-164.864s159.104 73.728 159.104 164.864c0 91.008-71.232 164.8-159.104 164.8zM512.128-0.384c-194.496 0-352.128 163.328-352.128 364.8 0 190.272 159.488 435.776 265.984 555.264 39.808 44.544 86.144 104.704 86.144 104.704s49.792-60.352 92.48-106.304c106.368-114.496 259.648-344.448 259.648-553.6 0-201.536-157.632-364.864-352.128-364.864z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"location\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 37,\n\t\t\t\t\"id\": 27,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58919,\n\t\t\t\t\"name\": \"location\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 39\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M960.512 249.728c-21.76-35.968-48.576-71.168-81.344-103.808-33.216-32.896-68.992-59.968-105.6-81.6l64.32-64.32c0 0 93.056 0 139.648 46.528 46.464 46.592 46.464 139.648 46.464 139.648l-63.488 63.552zM387.2 831.232h-194.432v-194.432l23.36-23.36c39.552 18.56 78.784 44.928 114.176 80.32 35.392 35.328 61.696 74.688 80.32 114.176l-23.424 23.296zM906.752 303.488l-440 448.32c-22.72-37.632-50.688-74.304-84.992-108.352-34.688-34.432-72.064-62.72-110.336-85.312l449.152-440.896c37.824 17.856 75.456 42.944 109.312 76.864s59.008 71.424 76.864 109.376zM128 128v767.936h768v-319.936l128-127.936v482.88c0 51.392-41.6 93.056-93.056 93.056h-837.888c-51.392 0-93.056-41.664-93.056-93.056v-837.824c0-51.456 41.664-93.12 93.056-93.12h482.944l-128 128h-320z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"new\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 38,\n\t\t\t\t\"id\": 32,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58920,\n\t\t\t\t\"name\": \"new\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 40\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M960.256 863.936v0.768l-256.256-256.256v127.488c0 70.72-57.344 128.064-128 128.064h-448c-70.656 0-128-57.344-128-128.064v-447.872c0-70.72 57.344-128.064 128-128.064h448c70.656 0 128 57.344 128 128.064v128.576l256-256v-0.64c35.392 0 64 28.608 64 64v576c0 35.264-28.544 63.808-63.744 63.936z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"video\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 39,\n\t\t\t\t\"id\": 48,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58921,\n\t\t\t\t\"name\": \"video\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 41\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M897.024 192h-147.84l-42.88-90.624c-9.792-21.312-45.056-37.376-79.36-37.376h-244.8c-34.304 0-69.568 16.064-79.424 37.376l-41.856 90.624h-132.864c-128 0-128 64-128 64v640c0 0 0 64 128 64h768c128 0 128-64 128-64v-640c0 0 0-64-126.976-64zM512 831.936c-141.376 0-256-114.496-256-255.872 0-141.44 114.624-256.064 256-256.064s256 114.624 256 256.064c0 141.376-114.624 255.872-256 255.872zM512 416c-88.384 0-160 71.616-160 160 0 88.32 71.616 160 160 160s160-71.68 160-160c0-88.384-71.616-160-160-160z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"photo\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 40,\n\t\t\t\t\"id\": 34,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58922,\n\t\t\t\t\"name\": \"photo\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 42\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M512.064 0c-282.688 0-511.872 229.184-511.872 511.936 0 282.816 229.184 511.936 511.872 511.936 282.752 0 511.936-229.12 511.936-511.936 0-282.752-229.184-511.936-511.936-511.936zM678.976 691.52l-14.848 14.976c-12.416 12.352-33.344 12.992-46.464 1.28l-171.52-147.52c-13.12-11.712-23.040-35.712-22.208-53.248l17.856-283.072c0.896-17.6 16-31.936 33.664-31.936h21.056c17.6 0 32.704 14.336 33.536 31.936l14.656 231.808c0.896 17.536 11.2 42.688 22.848 55.808l112.768 133.568c11.648 12.992 11.136 33.984-1.344 46.4z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"time\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 41,\n\t\t\t\t\"id\": 43,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58923,\n\t\t\t\t\"name\": \"time\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 43\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M512.064 160c-338.944 0-512.96 352.896-512.96 352.896s131.328 352.96 512.96 352.96c345.472 0 512.832-351.616 512.832-351.616s-168.64-354.24-512.832-354.24zM512.832 733.504c-123.968 0-213.504-96.576-213.504-220.608 0-124.096 89.536-220.544 213.504-220.544 123.904 0 213.44 96.448 213.44 220.544 0 124.032-89.6 220.608-213.44 220.608zM512.832 380.544c-70.784 0.128-128.128 61.44-128.128 132.352 0 70.848 57.344 132.352 128.128 132.352s128.064-61.504 128.064-132.352c0-70.912-57.28-132.544-128.064-132.352z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"eye\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 42,\n\t\t\t\t\"id\": 18,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58924,\n\t\t\t\t\"name\": \"eye\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 44\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M1024 933.248c0 50.176-41.6 90.752-93.12 90.752h-291.264v-351.68c0-53.056-38.016-96.128-85.056-96.128h-85.12c-46.976 0-85.12 43.072-85.12 96.128v351.68h-291.264c-51.392 0-93.056-40.576-93.056-90.752v-478.976c0-23.36 9.344-44.48 24.192-60.544l-0.96-1.856 425.92-372.992c34.304-25.152 89.984-25.152 124.288 0l427.264 372.992-0.448 2.368c14.592 16.064 23.744 36.928 23.744 60.032v478.976z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"home\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 43,\n\t\t\t\t\"id\": 22,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58926,\n\t\t\t\t\"name\": \"home\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 46\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M896 1024h-192v-128h192.064v-640h-768.064v640h192v128h-192c-70.656 0-128-57.344-128-128v-768c0-70.656 57.344-128 128-128h768c70.656 0 128 57.344 128 128v768c0 70.656-57.344 128-128 128zM192 64.064c-35.392 0-64 28.608-64 63.936 0 35.392 28.608 64 64 64s64-28.608 64-64c0-35.328-28.608-63.936-64-63.936zM384 64.064c-35.392 0-64 28.608-64 63.936 0 35.392 28.608 64 64 64s64-28.608 64-64c0-35.328-28.608-63.936-64-63.936zM271.936 759.296c-22.208-23.232-22.208-60.864 0-84.16l196.928-209.408c6.144-6.464 13.44-10.496 21.12-13.44 0.064-0.064 0.192-0.064 0.32-0.128 5.888-2.24 11.84-3.456 17.984-3.712 2.24-0.192 4.416-0.384 6.656-0.256 2.752 0.192 5.376 1.024 8 1.6 11.328 2.24 22.272 6.72 30.976 15.872l196.864 209.408c22.272 23.296 22.272 60.928 0 84.16-22.272 23.104-58.304 23.104-80.576 0l-94.208-119.232v319.936c0 34.176-32.064 64.064-64.64 64.064-32.512 0-63.36-29.888-63.36-64.064v-319.936l-95.488 119.296c-22.272 23.168-58.304 23.168-80.576 0z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"upload\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 44,\n\t\t\t\t\"id\": 46,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58927,\n\t\t\t\t\"name\": \"upload\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 47\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M723.392 606.4c-11.328-11.456-15.104-32.704-8.384-47.296 0 0 47.232-102.464 47.232-177.728 0-210.624-170.432-381.376-380.736-381.376s-380.8 170.752-380.8 381.312c0 210.624 170.496 381.376 380.8 381.376 75.2 0 177.408-47.36 177.408-47.36 14.656-6.784 35.968-2.944 47.232 8.448l291.456 291.776c11.456 11.392 30.080 11.392 41.344 0l75.776-75.904c11.456-11.456 11.456-30.144 0-41.472l-291.328-291.776zM381.504 586.624c-113.088 0-205.056-92.032-205.056-205.312 0-113.216 92.032-205.312 205.056-205.312s204.992 92.096 204.992 205.312c0 113.28-91.904 205.312-204.992 205.312z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"search\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 45,\n\t\t\t\t\"id\": 40,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58928,\n\t\t\t\t\"name\": \"search\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 48\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M449.024 363.712c106.56 0 193.024-81.344 193.024-181.888-0.064-100.416-86.464-181.824-193.024-181.824s-193.024 81.408-193.024 181.824c0 100.48 86.464 181.888 193.024 181.888zM600.32 376.32c-42.56 29.44-94.592 47.424-151.296 47.424-56.96 0-109.12-18.112-151.744-47.744-173.248 37.312-297.28 136.832-297.28 254.016v258.88c0 17.152 14.4 31.104 32 31.104h64c17.6 0 32-12.608 32-28.096 0-8.96 0-201.856 0-201.856 0-16.64 9.536-9.984 21.376-9.984 11.776 0 21.312 9.024 21.312 19.968l0.32 179.968c0.896 10.368 9.6 84.416 20.544 86.592 0 0 66.56 57.344 256.448 57.344 191.232 0 256.448-57.344 256.448-57.344 10.944-2.112 19.712-76.16 20.544-86.592l0.32-179.968c0-11.008 9.536-19.968 21.376-19.968 11.776 0 21.312 9.024 21.312 19.968 0 0 0 182.912 0 191.872 0 15.488 14.4 28.096 32 28.096h64c17.6 0 32-14.016 32-31.104v-258.88c0-116.864-123.392-216.128-295.68-253.696z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"user\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 46,\n\t\t\t\t\"id\": 47,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58929,\n\t\t\t\t\"name\": \"user\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 49\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M896 96c-50.496 0-768 0-768 0-50.496 0-128 41.152-128 90.944v18.112c0 0 432.768 361.856 512 361.856s512-360.704 512-360.704v-19.2c0-49.856-77.504-91.008-128-91.008zM0 351.040v512.896c0 0 0 64.064 128 64.064h768c128.192 0 128-64.064 128-64.064v-514.496c0 0-364.16 324.992-512 324.992-146.304 0-512-323.392-512-323.392z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"mail\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 47,\n\t\t\t\t\"id\": 30,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58930,\n\t\t\t\t\"name\": \"mail\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 50\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M896 1024h-768c-35.328 0-64-28.608-64-64.064v-447.936c0-35.328 28.672-64 64-64h64v-128c0-176.704 143.232-320 320-320s320 143.296 320 320v128h64c35.392 0 64 28.672 64 64v447.936c0 35.456-28.608 64.064-64 64.064zM704 320c0-105.984-85.952-192-192-192s-192 86.016-192 192v128h384v-128z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"lock\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 48,\n\t\t\t\t\"id\": 28,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58931,\n\t\t\t\t\"name\": \"lock\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 51\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M767.872 172.992l-0.128 0.064c-0.896-0.64-1.6-1.536-2.624-2.24-29.184-20.032-68.992-12.608-89.024 16.704-19.968 29.312-12.48 69.312 16.64 89.344 0.768 0.64 1.536 0.896 2.24 1.28l-0.256 0.448c82.88 58.048 137.28 154.496 137.28 263.744 0 177.536-143.296 321.472-320 321.472s-320-143.936-320-321.472c0-109.248 54.4-205.696 137.28-263.744l-0.256-0.448c0.704-0.384 1.472-0.64 2.24-1.216 29.184-20.032 36.608-60.032 16.64-89.344-20.032-29.312-59.84-36.8-89.024-16.704-0.96 0.704-1.728 1.536-2.688 2.24l-0.064-0.128c-116.032 81.408-192.128 216.32-192.128 369.344 0 248.576 200.576 450.176 448 450.176s448-201.6 448-450.176c0-153.024-76.096-287.936-192.128-369.344zM512 608c35.392 0 64-28.608 64-64v-447.936c0-35.392-28.608-64.064-64-64.064-35.328 0-64 28.672-64 64.064v447.936c0 35.392 28.672 64 64 64z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"power\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 49,\n\t\t\t\t\"id\": 38,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58932,\n\t\t\t\t\"name\": \"power\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 52\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M320 384c-35.328 0-64 28.608-64 64s28.672 64 64 64 64-28.608 64-64-28.672-64-64-64zM512 576c-35.328 0-64 28.608-64 64s28.672 64 64 64 64-28.608 64-64-28.672-64-64-64zM320 576c-35.328 0-64 28.608-64 64s28.672 64 64 64 64-28.608 64-64-28.672-64-64-64zM896 64.064h-128c0-35.392-28.608-64.064-64-64.064s-64 28.672-64 64.064h-256c0-35.392-28.672-64.064-64-64.064s-64 28.672-64 64.064h-128c-70.656 0-128 57.28-128 127.936v640c0 70.72 57.344 128 128 128h768c70.656 0 128-57.28 128-128v-640c0-70.656-57.344-127.936-128-127.936zM896 832h-768v-640h128c0 35.392 28.672 64 64 64s64-28.608 64-64h256c0 35.392 28.608 64 64 64s64-28.608 64-64h128v640zM704 384c-35.392 0-64 28.608-64 64s28.608 64 64 64 64-28.608 64-64-28.608-64-64-64zM512 384c-35.328 0-64 28.608-64 64s28.672 64 64 64 64-28.608 64-64-28.672-64-64-64zM704 576c-35.392 0-64 28.608-64 64s28.608 64 64 64 64-28.608 64-64-28.608-64-64-64z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"calendar\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 50,\n\t\t\t\t\"id\": 5,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58933,\n\t\t\t\t\"name\": \"calendar\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 53\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M918.272 432.96c-17.344-2.56-35.968-18.304-41.344-35.008l-26.112-63.232c-8.128-15.552-6.272-39.872 4.352-53.952l42.112-56.192c10.624-14.080 9.728-36.352-1.984-49.536l-46.272-46.4c-13.12-11.712-35.52-12.544-49.6-1.984l-56.128 42.24c-14.144 10.496-38.4 12.48-54.016 4.288l-63.168-26.048c-16.832-5.312-32.64-24-35.008-41.472l-9.984-69.504c-2.496-17.408-18.816-33.152-36.352-34.944 0 0-10.816-1.216-32.768-1.216s-32.768 1.216-32.768 1.216c-17.536 1.792-33.92 17.536-36.352 34.944l-9.984 69.504c-2.432 17.472-18.176 36.16-35.008 41.472l-63.168 26.048c-15.552 8.192-39.808 6.208-53.888-4.288l-56.256-42.24c-14.016-10.624-36.416-9.728-49.6 1.984l-46.208 46.272c-11.648 13.184-12.544 35.52-1.984 49.6l42.176 56.192c10.56 14.080 12.48 38.4 4.288 53.952l-26.048 63.296c-5.376 16.704-24 32.448-41.408 35.008l-69.504 9.792c-17.472 2.56-33.216 18.88-35.008 36.416 0 0-1.152 10.88-1.152 32.832 0 21.952 1.152 32.896 1.152 32.896 1.856 17.472 17.6 33.792 35.008 36.288l69.504 9.856c17.408 2.496 36.032 18.304 41.408 35.008l26.112 63.232c8.192 15.616 6.272 39.808-4.288 53.888l-42.176 56.256c-10.56 14.144-13.12 33.28-5.632 42.496 7.424 9.216 28.864 32.064 28.928 32.064 0 0.128 7.232 6.72 16 14.656 8.768 8.064 44.48 19.2 58.56 8.64l56.256-42.112c14.080-10.624 38.336-12.544 53.888-4.352l63.040 25.984c16.832 5.44 32.576 24 35.008 41.472l9.984 69.504c2.432 17.344 18.816 33.28 36.288 35.072 0 0 10.88 1.152 32.832 1.152s32.768-1.152 32.768-1.152c17.472-1.792 33.856-17.664 36.352-35.072l9.984-69.504c2.368-17.472 18.112-36.032 35.008-41.472l63.104-25.984c15.616-8.192 39.872-6.272 54.016 4.224l56.256 42.24c14.144 10.56 36.352 9.664 49.6-1.92l46.272-46.336c11.648-13.184 12.48-35.52 1.856-49.6l-42.112-56.256c-10.624-14.080-12.48-38.272-4.352-53.888l26.112-63.232c5.376-16.768 24-32.512 41.344-35.008l69.504-9.856c17.344-2.496 33.152-18.816 35.008-36.288 0 0 1.152-10.88 1.152-32.896 0-21.952-1.152-32.832-1.152-32.832-1.856-17.536-17.6-33.856-35.008-36.416l-69.44-9.792zM512 640c-70.656 0-128-57.344-128-128 0-70.72 57.344-128 128-128 70.592 0 128 57.344 128 128 0 70.656-57.344 128-128 128z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"gear\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 51,\n\t\t\t\t\"id\": 20,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58934,\n\t\t\t\t\"name\": \"gear\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 54\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M768 262.976v0h128c35.392 0 64 28.672 64 64v640c0 35.392-28.608 64-64 64h-672c-88.384 0-160-71.616-160-160v-703.936c0-88.384 71.616-160.064 160-160.064h672c35.392 0 64 28.672 64 64 0 35.392-28.608 64.064-64 64.064h-640c-35.328 0-64 28.608-64 64s28.672 64 64 64h128v256l64-64 64 64v-256h256z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"bookmark\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 52,\n\t\t\t\t\"id\": 3,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58935,\n\t\t\t\t\"name\": \"bookmark\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 55\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M0 896v-192h128v192.128h640v-768.128h-640v192h-128v-192c0-70.656 57.344-128 128-128h640c70.72 0 128 57.344 128 128v768c0 70.72-57.28 128-128 128h-640c-70.656 0-128-57.28-128-128zM264.768 272c23.232-22.272 60.864-22.272 84.096 0l209.408 196.8c6.528 6.208 10.496 13.568 13.504 21.184 0.064 0.128 0.064 0.192 0.128 0.32 2.24 5.824 3.456 11.84 3.648 17.984 0.256 2.24 0.448 4.416 0.256 6.72-0.128 2.688-1.024 5.248-1.664 7.936-2.176 11.264-6.656 22.208-15.872 30.976l-209.408 196.8c-23.232 22.272-60.864 22.272-84.096 0-23.168-22.272-23.168-58.24 0-80.512l119.232-94.208h-320c-34.112 0-64-32.064-64-64.64 0-32.512 29.888-63.36 64-63.36h320l-119.232-95.552c-23.232-22.144-23.232-58.304 0-80.448z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"exit\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 53,\n\t\t\t\t\"id\": 16,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58936,\n\t\t\t\t\"name\": \"exit\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 56\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M928 256h-64v640c0 0-1.984 128-128 128 0 0-318.016 0-448 0s-128-128-128-128v-640h-64c-35.328 0-64-28.672-64-64s28.672-64 64-64h320v-32c0-53.056 42.944-96 96-96 52.992 0 96 42.944 96 96v32h320c35.392 0 64 28.608 64 64s-28.608 64-64 64zM736 256h-448v640h448v-640zM416 320c35.328 0 64 28.672 64 64v384c0 35.392-28.672 64-64 64s-64-28.608-64-64v-384c0-35.328 28.672-64 64-64zM608 320c35.392 0 64 28.672 64 64v384c0 35.392-28.608 64-64 64s-64-28.608-64-64v-384c0-35.328 28.608-64 64-64z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"trash\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 54,\n\t\t\t\t\"id\": 44,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58937,\n\t\t\t\t\"name\": \"trash\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 57\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M896 192c0 0-278.016-0.064-320-0.064s-89.984-127.936-128-127.936-320 0-320 0c-70.656 0-128 57.28-128 128v640.064c0 126.656 128 128 128 128h768c70.656 0 128-57.344 128-128v-512c0-70.72-57.344-128.064-128-128.064zM896.064 832.064h-768.064v-640.064c0 0 214.016 0 254.016 0s89.984 128 128 128c40 0 386.048 0 386.048 0v512.064z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"folder\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 55,\n\t\t\t\t\"id\": 19,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58938,\n\t\t\t\t\"name\": \"folder\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 58\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M895.424-0.064h-767.872c-127.296 0-127.552 128.064-127.552 128.064v511.936c0 0 0.704 128.064 128 128.064h256c0 0 53.568 1.472 73.344 23.936l289.344 226.496c4.736 3.776 7.616 5.632 10.432 5.632 8 0 10.368-5.504 10.368-14.592v-214.336c0-15.104 9.984-27.2 23.424-27.2h105.088c125.312 0 128-128.064 128-128.064v-511.872c0 0-1.28-128.064-128.576-128.064zM896 639.936h-256v128l-164.608-128h-347.392v-511.936h768v511.936z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"bubble\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 56,\n\t\t\t\t\"id\": 4,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58939,\n\t\t\t\t\"name\": \"bubble\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 59\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M0 383.552v-107.712c0-45.952 38.208-83.136 85.312-83.136h107.392v-90.432c0-21.056 21.568-102.208 48.192-102.208h96.384c26.624 0 48.192 81.152 48.192 102.208v90.432h319.232v-90.432c0-21.056 21.632-102.208 48.192-102.208h96.384c26.624 0 48.192 81.152 48.192 102.208v90.432h41.28c47.168 0 85.376 37.184 85.376 83.136v107.776h-1024.128zM1024.064 448.64v492.224c0 45.952-38.208 83.2-85.376 83.2h-853.376c-47.104 0-85.312-37.248-85.312-83.2v-492.224h1024.064z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"calendar-solid\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 57,\n\t\t\t\t\"id\": 6,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58941,\n\t\t\t\t\"name\": \"calendar-solid\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 61\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M32 512.064c288-32.064 448-192.064 480-480.064 32.064 288 192.064 448 480.128 480.064-288.064 32-448.064 192-480.128 480-32-288-192-448-480-480z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"star\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 58,\n\t\t\t\t\"id\": 45,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58942,\n\t\t\t\t\"name\": \"star\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 62\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M1024 512l-380.8 128-10.304 384-245.696-304.96-387.2 109.376 228.992-316.416-228.992-316.416 387.2 109.312 245.696-304.896 10.304 384 380.8 128z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"star-2\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 59,\n\t\t\t\t\"id\": 41,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58943,\n\t\t\t\t\"name\": \"star-2\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 63\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M768 736.448c35.392 0 64-28.672 64-64.064s-28.608-64.064-64-64.064-64 28.672-64 64.064 28.608 64.064 64 64.064zM938.752 96h-853.376c-47.168 0-85.376 38.208-85.376 85.376v661.184c0 47.168 38.208 85.44 85.376 85.44h853.376c47.104 0 85.312-38.272 85.312-85.44v-661.184c0-47.168-38.208-85.376-85.312-85.376zM896.064 799.808h-768.064v-255.552h768.064v255.552zM896.064 352.128h-768.064v-128.064h768.064v128.064z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"credit-card\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 60,\n\t\t\t\t\"id\": 12,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58944,\n\t\t\t\t\"name\": \"credit-card\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 64\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M939.712 84.288c-112.448-112.448-294.784-112.448-407.296 0.064l-448 448c-112.512 112.512-112.512 294.848-0.064 407.296s294.784 112.512 407.296 0l94.848-92.16c-51.008-1.152-97.536-17.728-136.96-44.672l-48.448 46.4c-62.528 62.528-163.84 62.528-226.304 0-62.464-62.464-62.464-163.84 0.064-226.304l448-448c62.528-62.528 163.84-62.528 226.24 0 62.528 62.528 62.592 163.776 0.064 226.24l-223.232 224.768c-18.752 18.752-49.152 18.752-67.904 0s-18.752-49.152 0-67.904l168.576-170.176c12.48-12.48 12.544-32.768 0-45.248l-45.248-45.248c-12.48-12.48-32.768-12.48-45.248 0l-168.576 170.176c-68.736 68.736-68.736 180.16 0 248.896 68.736 68.736 180.16 68.736 248.896 0l223.232-224.832c112.448-112.448 112.448-294.848 0.064-407.296z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"clip\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 61,\n\t\t\t\t\"id\": 10,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58945,\n\t\t\t\t\"name\": \"clip\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 65\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M939.648 84.352c-54.464-54.4-126.784-84.352-203.648-84.352-76.928 0-149.248 29.952-203.648 84.352 0 0-181.696 181.632-192.128 191.936-54.208 54.336-84.096 126.72-84.224 204.096 0.128 76.8 30.080 148.992 84.352 203.264l23.36 23.424c6.272 6.272 14.528 9.344 22.656 9.344 8.192 0 16.384-3.136 22.656-9.344l45.248-45.248c12.48-12.48 12.48-32.768 0-45.248l-23.424-23.424c-61.376-61.376-62.208-162.048-1.792-224.512 1.856-1.856 193.856-193.792 193.856-193.792 30.208-30.208 70.336-46.848 113.088-46.848s82.88 16.64 113.152 46.784v0.064c62.528 62.592 62.528 163.776 0 226.24l-9.856 9.856c15.424 41.6 24.64 86.208 24.704 133.056 0 8.512-1.216 16.704-1.664 25.024l77.312-77.376c112.448-112.512 112.384-294.912 0-407.296zM660.16 316.864c-6.208-6.272-14.464-9.344-22.592-9.344-8.256 0-16.448 3.136-22.656 9.344l-45.248 45.248c-12.544 12.48-12.544 32.768 0 45.248l23.36 23.424c61.376 61.376 62.272 162.048 1.856 224.512-1.856 1.856-193.856 193.792-193.856 193.792-30.144 30.272-70.272 46.912-113.088 46.912-42.688 0-82.816-16.64-113.088-46.784v-0.064c-62.528-62.592-62.528-163.776-0.064-226.24l9.92-9.856c-15.488-41.6-24.704-86.208-24.704-133.056 0-8.512 1.152-16.704 1.664-25.024l-77.312 77.376c-112.512 112.512-112.448 294.848 0 407.232 54.464 54.464 126.784 84.416 203.648 84.416s149.184-29.952 203.648-84.352c0 0 181.696-181.632 192.128-191.936 54.208-54.336 84.096-126.72 84.224-204.096-0.128-76.8-30.144-148.992-84.352-203.264l-23.488-23.488z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"link\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 62,\n\t\t\t\t\"id\": 25,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58946,\n\t\t\t\t\"name\": \"link\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 66\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M1012.736 475.84l-241.216-352c-11.968-17.408-31.68-27.84-52.8-27.84h-654.72c-35.392 0-64 28.672-64 64v704c0 35.328 28.608 64 64 64h654.72c21.12 0 40.896-10.368 52.8-27.84l241.216-352c15.040-21.76 15.040-50.56 0-72.32zM736 608c-52.992 0-96-43.008-96-96s43.008-96 96-96 96 43.008 96 96-43.008 96-96 96z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"tag\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 63,\n\t\t\t\t\"id\": 42,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58947,\n\t\t\t\t\"name\": \"tag\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 67\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M842.752 0h-660.544c-47.552 0-86.208 38.144-86.208 64v853.376c0 68.416 38.656 106.624 86.208 106.624h660.544c47.040 0 85.248-38.208 85.248-85.312v-853.376c0-47.168-38.208-85.312-85.248-85.312zM544 832h-256c-35.392 0-64-28.608-64-64s28.608-64 64-64h256c35.392 0 64 28.608 64 64s-28.608 64-64 64zM736 576h-448c-35.392 0-64-28.608-64-64s28.608-64 64-64h448c35.392 0 64 28.608 64 64s-28.608 64-64 64zM736 320h-448c-35.392 0-64-28.608-64-64s28.608-64 64-64h448c35.392 0 64 28.608 64 64s-28.608 64-64 64z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"document\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 64,\n\t\t\t\t\"id\": 15,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58948,\n\t\t\t\t\"name\": \"document\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 68\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M938.752 928h-853.376c-47.168 0-85.376-37.248-85.376-83.264v-665.472c0-46.016 38.208-83.264 85.376-83.264h853.376c47.104 0 85.312 37.248 85.312 83.264v665.472c0 46.016-38.208 83.264-85.312 83.264zM896.064 224h-768.064v511.808c0 0 64-64.064 128-128.064 64-64.064 128 0 128 0l64 64c0 0 118.72-120.768 192-192.128 66.88-66.944 128 0 128 0l128 128.128 0.064-383.744zM320 480c-35.328 0-64-28.672-64-63.936 0-35.392 28.672-64.064 64-64.064s64 28.672 64 64.064c0 35.264-28.672 63.936-64 63.936z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"image\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 65,\n\t\t\t\t\"id\": 23,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58949,\n\t\t\t\t\"name\": \"image\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 69\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M928 1024h-832c-51.2 0-96-44.8-96-96v-832c0-51.2 44.8-96 96-96h825.6c57.6 0 102.4 44.8 102.4 96v825.6c0 57.6-44.8 102.4-96 102.4zM748.8 192c-121.6 0-172.8 83.2-172.8 166.4v89.6h-64v128h64v384h128v-384h128v-128h-128v-70.4c0-38.4 6.4-57.6 51.2-57.6h76.8v-121.6s-38.4-6.4-83.2-6.4z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"facebook\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 66,\n\t\t\t\t\"id\": 75,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58950,\n\t\t\t\t\"name\": \"facebook\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 70\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M1017.6 313.6c0-83.2-64-147.2-147.2-147.2-115.2-6.4-236.8-6.4-358.4-6.4-121.6 0-243.2 0-358.4 6.4-83.2 0-147.2 64-147.2 147.2-6.4 70.4-6.4 134.4-6.4 198.4s0 128 6.4 198.4c0 83.2 64 147.2 147.2 147.2 115.2 6.4 236.8 6.4 358.4 6.4 121.6 0 243.2 0 358.4-6.4 83.2 0 147.2-64 147.2-147.2 6.4-64 6.4-128 6.4-198.4 0-64 0-128-6.4-198.4zM384 736v-448l320 224-320 224z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"youtube\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 67,\n\t\t\t\t\"id\": 95,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58951,\n\t\t\t\t\"name\": \"youtube\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 71\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M876.8 64c-147.2-6.4-243.2 76.8-294.4 243.2 25.6-12.8 51.2-19.2 76.8-19.2 51.2 0 76.8 32 70.4 89.6 0 38.4-25.6 89.6-70.4 153.6-38.4 70.4-70.4 102.4-96 102.4-25.6 0-51.2-51.2-76.8-160-6.4-25.6-19.2-108.8-38.4-236.8-19.2-115.2-70.4-172.8-147.2-160-32 0-83.2 32-153.6 96-44.8 38.4-96 83.2-147.2 128l51.2 64c44.8-32 70.4-51.2 76.8-51.2 38.4 0 70.4 57.6 96 166.4 32 108.8 57.6 211.2 83.2 313.6 38.4 108.8 89.6 166.4 153.6 166.4 96 0 211.2-89.6 352-275.2 134.4-179.2 204.8-313.6 211.2-416 6.4-134.4-44.8-204.8-147.2-204.8z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"vimeo\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 68,\n\t\t\t\t\"id\": 90,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58952,\n\t\t\t\t\"name\": \"vimeo\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 72\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M1024 192c-38.4 19.2-76.8 25.6-121.6 32 44.8-25.6 76.8-64 89.6-115.2-38.4 25.6-83.2 38.4-134.4 51.2-38.4-38.4-96-64-153.6-64-108.8 0-204.8 96-204.8 211.2 0 19.2 0 32 6.4 44.8-172.8-6.4-332.8-89.6-435.2-217.6-19.2 32-25.6 64-25.6 102.4 0 70.4 38.4 134.4 96 172.8-32 0-64-12.8-96-25.6 0 102.4 70.4 185.6 166.4 204.8-19.2 12.8-38.4 12.8-57.6 12.8-12.8 0-25.6 0-38.4-6.4 25.6 83.2 102.4 147.2 198.4 147.2-70.4 57.6-160 89.6-262.4 89.6h-51.2c96 64 204.8 96 320 96 384 0 595.2-320 595.2-595.2v-25.6c44.8-32 83.2-70.4 108.8-115.2z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"twitter\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 69,\n\t\t\t\t\"id\": 89,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58953,\n\t\t\t\t\"name\": \"twitter\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 73\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M179.2 902.4c76.8-115.2 211.2-185.6 358.4-185.6 134.4 0 256 64 339.2 160 89.6-96 147.2-224 147.2-364.8 0-281.6-230.4-512-512-512s-512 230.4-512 512c0 153.6 70.4 294.4 179.2 390.4zM787.2 665.6c-6.4 19.2-19.2 19.2-38.4 12.8-70.4-32-147.2-51.2-224-51.2-83.2 0-160 19.2-230.4 51.2-6.4 6.4-25.6 6.4-32-19.2-6.4-12.8 6.4-25.6 12.8-32 76.8-38.4 160-57.6 249.6-57.6s172.8 19.2 243.2 51.2c12.8 12.8 25.6 25.6 19.2 44.8zM832 537.6c-6.4 6.4-12.8 12.8-25.6 12.8h-6.4c-83.2-38.4-179.2-64-275.2-64s-185.6 19.2-268.8 57.6h-6.4c-12.8 0-19.2-6.4-25.6-12.8l-6.4-12.8c0-6.4 6.4-19.2 12.8-19.2 89.6-38.4 192-64 300.8-64 108.8 0 211.2 25.6 300.8 64v38.4zM185.6 326.4c102.4-44.8 217.6-64 339.2-64 115.2 0 230.4 25.6 332.8 64 12.8 6.4 25.6 19.2 25.6 38.4 0 25.6-19.2 44.8-44.8 44.8h-6.4c-96-38.4-198.4-57.6-307.2-57.6s-211.2 19.2-307.2 51.2h-6.4c-25.6 0-44.8-19.2-44.8-44.8 0-6.4 6.4-25.6 19.2-32zM537.6 883.2c-89.6 0-166.4 44.8-211.2 108.8 57.6 19.2 121.6 32 185.6 32 83.2 0 160-19.2 224-51.2-44.8-57.6-115.2-89.6-198.4-89.6z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"spotify\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 70,\n\t\t\t\t\"id\": 87,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58954,\n\t\t\t\t\"name\": \"spotify\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 74\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M512 0c-281.6 0-512 230.4-512 512 0 211.2 128 390.4 307.2 467.2 0-38.4 0-76.8 6.4-115.2 12.8-38.4 64-281.6 64-281.6s-12.8-32-12.8-76.8c0-76.8 44.8-134.4 96-134.4s70.4 32 70.4 76.8-32 115.2-44.8 179.2c-12.8 57.6 25.6 96 83.2 96 96 0 160-121.6 160-275.2 0-115.2-76.8-198.4-211.2-198.4-153.6 0-249.6 115.2-249.6 243.2 0 44.8 12.8 76.8 32 102.4 6.4 12.8 12.8 12.8 6.4 25.6 0 6.4-6.4 32-12.8 38.4-6.4 12.8-12.8 19.2-25.6 12.8-70.4-32-102.4-108.8-102.4-198.4 0-147.2 121.6-320 364.8-320 198.4 0 326.4 140.8 326.4 294.4 0 198.4-108.8 352-275.2 352-57.6 0-108.8-32-128-64 0 0-32 115.2-38.4 140.8-12.8 38.4-32 76.8-51.2 108.8 51.2 32 96 38.4 147.2 38.4 281.6 0 512-230.4 512-512s-230.4-512-512-512z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"pinterest\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 71,\n\t\t\t\t\"id\": 85,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58956,\n\t\t\t\t\"name\": \"pinterest\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 76\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M256 44.8c-134.4 51.2-224 147.2-249.6 288-12.8 83.2-6.4 172.8 32 249.6 6.4 19.2 19.2 32 32 51.2l19.2 19.2c12.8-6.4 25.6-6.4 32-12.8 44.8-25.6 76.8-64 115.2-96-128-153.6 6.4-332.8 172.8-377.6 160-38.4 371.2 25.6 416 192 19.2 64 6.4 140.8-44.8 192-25.6 25.6-64 44.8-102.4 51.2-25.6 6.4-44.8 6.4-70.4 0-12.8-6.4-25.6-6.4-38.4-6.4-19.2-6.4-38.4-6.4-38.4-25.6v-268.8c0-19.2 0-12.8-12.8-19.2-12.8 0-25.6 0-38.4-6.4-38.4 0-83.2 0-121.6 6.4-12.8 0-19.2 0-19.2 19.2v140.8l6.4 294.4c0 32 0 102.4-32 115.2-38.4 19.2-70.4-19.2-108.8-25.6 6.4 51.2-25.6 147.2 32 172.8 51.2 25.6 115.2 32 172.8 12.8 115.2-38.4 153.6-172.8 140.8-275.2 179.2 51.2 377.6-38.4 454.4-198.4 57.6-115.2 32-262.4-51.2-358.4-166.4-185.6-480-224-697.6-134.4z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"path\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 72,\n\t\t\t\t\"id\": 83,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58957,\n\t\t\t\t\"name\": \"path\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 77\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M928 1024h-832c-51.2 0-96-44.8-96-96v-832c0-51.2 44.8-96 96-96h825.6c57.6 0 102.4 44.8 102.4 96v825.6c0 57.6-44.8 102.4-96 102.4zM262.4 192c-44.8 0-76.8 32-76.8 76.8 0 38.4 25.6 76.8 70.4 76.8 44.8 0 70.4-32 70.4-76.8 6.4-44.8-19.2-76.8-64-76.8zM339.2 390.4h-147.2v441.6h147.2v-441.6zM876.8 582.4c0-134.4-64-204.8-160-204.8-76.8 0-108.8 44.8-128 70.4v-64h-153.6v441.6h147.2v-236.8c0-12.8 0-25.6 6.4-32 12.8-25.6 32-51.2 76.8-51.2 51.2 0 70.4 38.4 70.4 96v230.4h147.2v-249.6z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"linkedin\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 73,\n\t\t\t\t\"id\": 82,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58958,\n\t\t\t\t\"name\": \"linkedin\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 78\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M0 870.4v0zM236.8 563.2c89.6 0 153.6-96 140.8-211.2-19.2-121.6-108.8-217.6-198.4-217.6-89.6-6.4-153.6 89.6-140.8 211.2 19.2 115.2 108.8 217.6 198.4 217.6zM1024 256v-83.2c0-96-76.8-172.8-166.4-172.8h-684.8c-96 0-172.8 76.8-172.8 166.4 57.6-51.2 140.8-96 224-96h358.4l-83.2 70.4h-108.8c70.4 25.6 115.2 115.2 115.2 204.8 0 76.8-44.8 140.8-102.4 185.6-57.6 44.8-70.4 64-70.4 102.4 0 32 64 89.6 96 108.8 96 64 128 128 128 230.4 0 19.2 0 32-6.4 51.2h307.2c96 0 172.8-76.8 172.8-172.8v-531.2h-192v192h-64v-192h-198.4v-64h192v-192h64v192h192zM185.6 768h64c-25.6-25.6-51.2-57.6-51.2-96 0-25.6 6.4-44.8 19.2-64h-32c-76.8-6.4-140.8-32-185.6-70.4v275.2c51.2-32 115.2-44.8 185.6-44.8zM6.4 889.6v-19.2c-6.4 6.4-6.4 12.8 0 19.2zM454.4 953.6c-12.8-57.6-70.4-89.6-140.8-140.8-25.6-6.4-57.6-12.8-89.6-12.8-89.6 0-172.8 32-217.6 89.6 12.8 76.8 83.2 134.4 166.4 134.4h288v-32c0-12.8 0-25.6-6.4-38.4z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"google-plus\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 74,\n\t\t\t\t\"id\": 78,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58959,\n\t\t\t\t\"name\": \"google-plus\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 79\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M512 0c-281.6 0-512 230.4-512 512s230.4 512 512 512 512-230.4 512-512-230.4-512-512-512zM825.6 262.4c51.2 64 83.2 140.8 83.2 230.4-57.6-12.8-115.2-19.2-166.4-19.2-38.4 0-76.8 6.4-115.2 12.8l-25.6-64c83.2-32 160-83.2 224-160zM512 115.2c96 0 179.2 32 249.6 89.6-51.2 64-121.6 108.8-198.4 140.8-51.2-108.8-102.4-179.2-134.4-224 25.6-6.4 51.2-6.4 83.2-6.4zM332.8 153.6c32 32 83.2 102.4 147.2 217.6-121.6 38.4-243.2 44.8-320 44.8h-38.4c32-115.2 108.8-211.2 211.2-262.4zM115.2 512c12.8-6.4 25.6-6.4 44.8-6.4 83.2 0 217.6-6.4 364.8-51.2 6.4 19.2 12.8 32 25.6 51.2-102.4 32-179.2 83.2-230.4 134.4-51.2 51.2-89.6 96-108.8 128-64-70.4-96-160-96-256zM512 908.8c-89.6 0-172.8-32-236.8-76.8 12.8-25.6 44.8-70.4 89.6-115.2 51.2-44.8 115.2-96 204.8-128 32 83.2 57.6 185.6 76.8 294.4-38.4 19.2-83.2 25.6-134.4 25.6zM736 838.4c-19.2-102.4-44.8-185.6-76.8-268.8 25.6-6.4 51.2-6.4 83.2-6.4 44.8 0 102.4 6.4 153.6 19.2-12.8 108.8-70.4 198.4-160 256z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"dribbble\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 75,\n\t\t\t\t\"id\": 73,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58960,\n\t\t\t\t\"name\": \"dribbble\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 80\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M921.6 281.6h-256v-64h256v64zM499.2 544c12.8 25.6 25.6 57.6 25.6 96s-6.4 70.4-25.6 102.4l-51.2 51.2c-19.2 12.8-44.8 25.6-70.4 32s-57.6 6.4-89.6 6.4h-288v-640h307.2c76.8 0 134.4 25.6 166.4 70.4 19.2 25.6 25.6 57.6 25.6 96s-12.8 70.4-32 96c-6.4 12.8-19.2 25.6-44.8 32 32 12.8 57.6 32 76.8 57.6zM147.2 441.6h134.4c25.6 0 51.2-6.4 70.4-12.8 19.2-12.8 25.6-32 25.6-57.6 0-32-12.8-51.2-32-57.6-25.6-6.4-51.2-12.8-83.2-12.8h-115.2v140.8zM390.4 627.2c0-32-12.8-57.6-38.4-70.4-12.8-6.4-38.4-12.8-64-12.8h-140.8v172.8h134.4c25.6 0 51.2-6.4 64-12.8 25.6-6.4 44.8-32 44.8-76.8zM1017.6 524.8c6.4 19.2 6.4 51.2 6.4 89.6h-332.8c0 44.8 19.2 76.8 44.8 96 19.2 12.8 38.4 19.2 64 19.2s51.2-6.4 64-19.2c19.2-6.4 25.6-19.2 32-32h121.6c0 25.6-19.2 57.6-44.8 83.2-38.4 44.8-96 64-172.8 64-57.6 0-115.2-19.2-160-57.6-44.8-32-70.4-96-70.4-179.2 0-76.8 19.2-140.8 64-185.6 44.8-44.8 96-64 166.4-64 38.4 0 76.8 6.4 108.8 19.2 32 12.8 57.6 38.4 76.8 70.4 19.2 32 25.6 64 32 96zM902.4 537.6c0-32-12.8-57.6-32-70.4-19.2-19.2-44.8-25.6-70.4-25.6-32 0-51.2 6.4-70.4 25.6-19.2 19.2-25.6 38.4-32 70.4h204.8z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"behance\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 76,\n\t\t\t\t\"id\": 72,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58961,\n\t\t\t\t\"name\": \"behance\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 81\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M565.888 412.672l69.824 33.728 105.408-33.728v-61.184c0-126.080-102.784-228.608-229.12-228.608s-229.056 102.592-229.056 228.608v321.024c0 29.632-24.192 53.696-53.824 53.696s-53.824-24.064-53.824-53.696v-134.4h-175.296v134.4c0 126.080 102.72 228.608 229.12 228.608 126.336 0 229.12-102.592 229.12-228.608v-321.024c0-29.568 24.192-53.696 53.824-53.696 29.696 0 53.888 24.128 53.888 53.696l-0.064 61.184zM848.704 538.112v134.4c0 29.632-24.128 53.696-53.824 53.696-29.696 0-53.888-24.064-53.888-53.696v-137.088l-105.344 33.728-69.824-33.728v137.088c0 126.080 102.784 228.608 229.12 228.608s229.056-102.592 229.056-228.608v-134.4h-175.296z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"stumbleupon\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 77,\n\t\t\t\t\"id\": 98,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58962,\n\t\t\t\t\"name\": \"stumbleupon\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 82\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M608 652.8c-19.2 19.2 0 51.2 0 51.2l128 217.6s19.2 25.6 38.4 25.6 38.4-12.8 38.4-12.8l102.4-147.2s12.8-19.2 12.8-32c0-25.6-32-32-32-32l-243.2-76.8c-6.4 0-25.6-6.4-44.8 6.4zM595.2 544c12.8 19.2 44.8 12.8 44.8 12.8l243.2-70.4s32-12.8 38.4-32c6.4-19.2-6.4-38.4-6.4-38.4l-108.8-134.4s-12.8-19.2-32-19.2c-25.6 0-38.4 25.6-38.4 25.6l-140.8 217.6s-6.4 19.2 0 38.4zM480 460.8c32-6.4 38.4-51.2 38.4-51.2v-345.6c-6.4 0-6.4-38.4-25.6-51.2-32-19.2-44.8-6.4-51.2-6.4l-198.4 70.4s-19.2 6.4-32 25.6c-12.8 25.6 12.8 57.6 12.8 57.6l211.2 288s19.2 19.2 44.8 12.8zM435.2 601.6c0-25.6-32-44.8-32-44.8l-217.6-108.8s-32-12.8-44.8-6.4c-19.2 12.8-25.6 25.6-32 32l-12.8 172.8s0 32 6.4 44.8c12.8 19.2 44.8 6.4 44.8 6.4l256-57.6c12.8 0 25.6-6.4 32-38.4zM492.8 697.6c-19.2-12.8-44.8 6.4-44.8 6.4l-172.8 185.6s-19.2 25.6-12.8 44.8c6.4 19.2 12.8 25.6 25.6 32l172.8 51.2s19.2 6.4 38.4 0c19.2 0 12.8-32 12.8-32l6.4-256s0-25.6-25.6-32z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"yelp\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 78,\n\t\t\t\t\"id\": 94,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58963,\n\t\t\t\t\"name\": \"yelp\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 83\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M518.4 544l115.2 313.6v6.4c-38.4 12.8-83.2 19.2-128 19.2-38.4 0-76.8-6.4-108.8-12.8l121.6-326.4zM896 512c0 140.8-76.8 256-192 326.4l115.2-332.8c19.2-51.2 32-96 32-134.4v-38.4c32 51.2 44.8 115.2 44.8 179.2zM128 512c0-51.2 12.8-108.8 32-153.6l185.6 486.4c-128-57.6-217.6-185.6-217.6-332.8zM192 307.2c70.4-102.4 185.6-166.4 320-166.4 102.4 0 192 38.4 262.4 96h-6.4c-38.4 0-64 32-64 64s19.2 57.6 38.4 89.6c12.8 25.6 32 57.6 32 102.4 0 32-12.8 70.4-32 121.6l-38.4 128-140.8-403.2c25.6 0 44.8-6.4 44.8-6.4 19.2 0 19.2-32 0-32 0 0-64 6.4-102.4 6.4-38.4 0-102.4-6.4-102.4-6.4-19.2 0-25.6 32 0 32 0 0 19.2 0 38.4 6.4l57.6 160-83.2 243.2-140.8-403.2c25.6-6.4 44.8-6.4 44.8-6.4 19.2 0 19.2-32 0-32 0 0-64 6.4-102.4 6.4h-25.6zM851.2 0h-678.4c-96 0-172.8 76.8-172.8 172.8v678.4c0 96 76.8 172.8 172.8 172.8h678.4c96 0 172.8-76.8 172.8-172.8v-678.4c0-96-76.8-172.8-172.8-172.8zM960 512c0 249.6-198.4 448-448 448s-448-198.4-448-448 198.4-448 448-448 448 198.4 448 448z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"wordpress\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 79,\n\t\t\t\t\"id\": 93,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58964,\n\t\t\t\t\"name\": \"wordpress\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 84\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M409.6 897.506v-343.341h493.929v439.718l-493.929-96.376zM409.6 120.471l493.929-90.353v439.718h-493.929v-349.365zM331.294 469.835h-331.294v-271.059l331.294-60.235v331.294zM331.294 879.435l-331.294-66.259v-259.012h331.294v325.271z\"\n\t\t\t\t],\n\t\t\t\t\"width\": 904,\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"windows-8\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 80,\n\t\t\t\t\"id\": 92,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58965,\n\t\t\t\t\"name\": \"windows-8\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 85\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M64 192c19.2 128 128 659.2 377.6 812.8 38.4 25.6 83.2 19.2 115.2-6.4 121.6-102.4 243.2-275.2 275.2-358.4 64 6.4 108.8-12.8 108.8-12.8v-128h-115.2c-140.8 0-236.8-166.4-179.2-313.6 38.4-102.4 108.8-25.6 121.6 0 12.8 32 6.4 115.2-6.4 172.8 19.2 51.2 140.8 76.8 166.4 38.4 32-96 44.8-262.4-38.4-352-57.6-38.4-198.4-70.4-300.8-6.4s-102.4 204.8-96 275.2c6.4 70.4 32 217.6 172.8 300.8 12.8 12.8-153.6 230.4-160 217.6-185.6-179.2-249.6-544-262.4-640h-179.2z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"vine\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 81,\n\t\t\t\t\"id\": 91,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58966,\n\t\t\t\t\"name\": \"vine\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 86\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M576 448v236.8c0 57.6 0 96 6.4 108.8 6.4 19.2 19.2 32 38.4 44.8 25.6 12.8 51.2 19.2 76.8 19.2 51.2 0 83.2-6.4 134.4-38.4v153.6c-44.8 19.2-83.2 32-115.2 38.4-38.4 12.8-76.8 12.8-115.2 12.8-44.8 0-76.8-6.4-108.8-19.2-38.4-12.8-64-32-89.6-51.2-25.6-19.2-44.8-44.8-51.2-70.4-12.8-25.6-12.8-57.6-12.8-108.8v-352h-147.2v-147.2c38.4-12.8 83.2-32 115.2-57.6 25.6-25.6 51.2-51.2 70.4-89.6 19.2-32 32-76.8 38.4-128h160v256h256v192h-256z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"tumblr\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 82,\n\t\t\t\t\"id\": 88,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58967,\n\t\t\t\t\"name\": \"tumblr\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 87\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M646.4 723.2h-192l-64 300.8h-262.4l25.6-108.8h-153.6l198.4-915.2h448c134.4 0 288 96 236.8 313.6-38.4 192-192 300.8-371.2 300.8h-185.6l-64 300.8h-44.8l-12.8 44.8h134.4l64-300.8h243.2c76.8 0 147.2-25.6 198.4-64l32-25.6c51.2-51.2 83.2-115.2 102.4-192 12.8-76.8 6.4-140.8-32-185.6-19.2-19.2-38.4-38.4-64-51.2 96 38.4 166.4 134.4 134.4 288-38.4 179.2-192 294.4-371.2 294.4zM492.8 435.2c70.4 0 134.4-57.6 153.6-128 19.2-70.4-25.6-128-89.6-128h-128l-64 256h128z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"paypal\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 83,\n\t\t\t\t\"id\": 84,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58968,\n\t\t\t\t\"name\": \"paypal\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 88\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M780.8 800c-204.8 0-275.2-89.6-313.6-204.8l-38.4-121.6c-25.6-89.6-64-153.6-166.4-153.6-70.4 0-147.2 51.2-147.2 198.4 0 115.2 57.6 185.6 140.8 185.6 89.6 0 153.6-70.4 153.6-70.4l44.8 102.4s-64 64-198.4 64c-166.4 0-256-96-256-275.2 0-192 89.6-300.8 262.4-300.8 153.6 0 236.8 57.6 281.6 211.2l38.4 121.6c25.6 89.6 76.8 147.2 198.4 147.2 76.8 0 121.6-19.2 121.6-64 0-32-19.2-57.6-76.8-76.8l-76.8-19.2c-96-25.6-134.4-76.8-134.4-153.6 0-128 102.4-172.8 211.2-172.8 121.6 0 192 44.8 204.8 153.6l-115.2 12.8c-6.4-51.2-38.4-70.4-89.6-70.4s-83.2 25.6-83.2 64 12.8 57.6 64 70.4l76.8 19.2c89.6 25.6 140.8 70.4 140.8 166.4 0 121.6-96 166.4-243.2 166.4z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"lastfm\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 84,\n\t\t\t\t\"id\": 81,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58969,\n\t\t\t\t\"name\": \"lastfm\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 89\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M928 0h-832c-51.2 0-96 44.8-96 96v825.6c0 57.6 44.8 102.4 96 102.4h825.6c57.6 0 96-44.8 96-96v-832c6.4-51.2-38.4-96-89.6-96zM512 313.6c108.8 0 198.4 89.6 198.4 198.4s-89.6 198.4-198.4 198.4-198.4-89.6-198.4-198.4 89.6-198.4 198.4-198.4zM896 857.6c0 19.2-19.2 38.4-38.4 38.4h-691.2c-19.2 0-38.4-19.2-38.4-38.4v-409.6h89.6c-6.4 25.6-6.4 51.2-6.4 76.8 0 166.4 128 307.2 300.8 307.2s300.8-140.8 300.8-307.2c0-25.6-6.4-51.2-12.8-76.8h96v409.6zM896 281.6c0 19.2-19.2 38.4-38.4 38.4h-115.2c-19.2 0-38.4-19.2-38.4-38.4v-115.2c0-19.2 19.2-38.4 38.4-38.4h115.2c19.2 0 38.4 19.2 38.4 38.4v115.2z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"instagram\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 85,\n\t\t\t\t\"id\": 80,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58970,\n\t\t\t\t\"name\": \"instagram\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 90\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M896 768l-384-512-384 512h768z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"triangle-up\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 86,\n\t\t\t\t\"id\": 68,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58880,\n\t\t\t\t\"name\": \"triangle-up\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 0\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M512 0c-282.752 0-512 229.248-512 512 0 282.688 229.248 512 512 512 282.816 0 512-229.248 512-512 0-282.752-229.184-512-512-512zM576.768 764.864c0 37.056-28.992 67.072-64.768 67.072s-64.768-30.016-64.768-67.072v-313.088c0-37.056 28.992-67.072 64.768-67.072s64.768 30.016 64.768 67.072v313.088zM512 319.68c-35.776 0-64.768-28.608-64.768-63.872s28.992-63.744 64.768-63.744 64.768 28.544 64.768 63.808-28.992 63.808-64.768 63.808z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"info-circle\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 87,\n\t\t\t\t\"id\": 24,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58895,\n\t\t\t\t\"name\": \"info-circle\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 15\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M992 64h-768c-19.2 0-32 12.8-32 32v64c0 19.2 12.8 32 32 32h768c19.2 0 32-12.8 32-32v-64c0-19.2-12.8-32-32-32z\",\n\t\t\t\t\t\"M992 320h-768c-19.2 0-32 12.8-32 32v64c0 19.2 12.8 32 32 32h768c19.2 0 32-12.8 32-32v-64c0-19.2-12.8-32-32-32z\",\n\t\t\t\t\t\"M992 576h-768c-19.2 0-32 12.8-32 32v64c0 19.2 12.8 32 32 32h768c19.2 0 32-12.8 32-32v-64c0-19.2-12.8-32-32-32z\",\n\t\t\t\t\t\"M992 832h-768c-19.2 0-32 12.8-32 32v64c0 19.2 12.8 32 32 32h768c19.2 0 32-12.8 32-32v-64c0-19.2-12.8-32-32-32z\",\n\t\t\t\t\t\"M96 64h-64c-19.2 0-32 12.8-32 32v64c0 19.2 12.8 32 32 32h64c19.2 0 32-12.8 32-32v-64c0-19.2-12.8-32-32-32z\",\n\t\t\t\t\t\"M96 320h-64c-19.2 0-32 12.8-32 32v64c0 19.2 12.8 32 32 32h64c19.2 0 32-12.8 32-32v-64c0-19.2-12.8-32-32-32z\",\n\t\t\t\t\t\"M96 576h-64c-19.2 0-32 12.8-32 32v64c0 19.2 12.8 32 32 32h64c19.2 0 32-12.8 32-32v-64c0-19.2-12.8-32-32-32z\",\n\t\t\t\t\t\"M96 832h-64c-19.2 0-32 12.8-32 32v64c0 19.2 12.8 32 32 32h64c19.2 0 32-12.8 32-32v-64c0-19.2-12.8-32-32-32z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"list-numbered\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 88,\n\t\t\t\t\"id\": 58,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58910,\n\t\t\t\t\"name\": \"list-numbered\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 30\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M457.856 791.936l289.28 226.496c4.736 3.776 7.616 5.632 10.368 5.632 8 0 10.496-5.504 10.496-14.528v-214.4c0-15.104 9.984-27.136 23.36-27.136h105.152c127.488 0 127.36-61.44 127.36-61.44v-640.064c0 0 0-66.56-127.872-66.56h-767.936c-128 0-128 66.56-128 66.56v640.064c0 0-0.064 61.44 128.448 61.44h256c0 0 53.568 1.472 73.344 23.936z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"chat\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 89,\n\t\t\t\t\"id\": 7,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58925,\n\t\t\t\t\"name\": \"chat\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 45\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M896 896.128h-768v-768h320v-128l-358.976-0.064c-49.152 0-89.024 39.936-89.024 89.088v845.952c0 49.152 39.872 89.024 89.024 89.024h845.952c49.152 0 89.024-39.872 89.024-89.024v-358.976h-128v320zM1024 64c0-14.656-6.080-27.52-14.72-38.272-1.344-1.728-2.048-3.712-3.584-5.312-0.192-0.128-0.256-0.384-0.384-0.576-0.384-0.32-0.448-0.832-0.832-1.216-4.096-4.096-9.152-6.528-13.952-9.28-2.112-1.216-3.84-3.008-6.080-3.968-8.704-3.776-17.92-5.376-27.264-5.12-0.128 0-0.256-0.064-0.384-0.064h-313.024c-36.992-0.064-67.008 28.544-67.008 63.808 0 35.2 30.080 63.808 67.136 63.808h161.216l-402.56 403.328c-24.832 24.768-24.832 64.768 0 89.472 24.832 24.768 65.024 24.768 89.792 0l403.968-403.52v163.2c0 37.056 28.608 67.072 63.872 67.072 35.264 0 63.808-30.016 63.808-67.072v-313.024c0-0.64-0.32-1.152-0.32-1.728 0-0.512 0.32-1.024 0.32-1.536z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"export\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 90,\n\t\t\t\t\"id\": 17,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58940,\n\t\t\t\t\"name\": \"export\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 60\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M979.2 588.8c6.4-25.6 6.4-51.2 6.4-76.8 0-262.4-211.2-473.6-473.6-473.6-25.6 0-51.2 0-76.8 6.4-38.4-32-89.6-44.8-147.2-44.8-160 0-288 128-288 288 0 57.6 12.8 108.8 44.8 153.6-6.4 19.2-6.4 44.8-6.4 70.4 0 262.4 211.2 473.6 473.6 473.6 25.6 0 51.2 0 76.8-6.4 44.8 25.6 96 44.8 153.6 44.8 160 0 288-128 288-288-6.4-57.6-19.2-108.8-51.2-147.2zM736 729.6c-19.2 32-51.2 51.2-89.6 70.4-38.4 19.2-83.2 25.6-134.4 25.6-64 0-115.2-12.8-160-32-32-12.8-51.2-38.4-70.4-64-19.2-32-25.6-57.6-25.6-83.2 0-12.8 6.4-25.6 19.2-38.4 12.8-12.8 25.6-19.2 44.8-19.2 12.8 0 25.6 6.4 38.4 12.8 6.4 6.4 12.8 19.2 19.2 38.4 6.4 19.2 19.2 32 25.6 44.8 6.4 12.8 19.2 25.6 38.4 32 19.2 6.4 38.4 12.8 64 12.8 38.4 0 70.4-6.4 89.6-25.6 25.6-19.2 32-38.4 32-57.6 0-19.2-6.4-32-19.2-44.8-6.4-19.2-19.2-25.6-38.4-32-19.2-6.4-51.2-12.8-83.2-19.2-44.8-12.8-83.2-25.6-115.2-38.4-32-12.8-57.6-32-76.8-51.2-19.2-25.6-25.6-57.6-25.6-89.6 0-32 12.8-64 32-89.6 19.2-25.6 44.8-44.8 83.2-57.6 38.4-12.8 76.8-19.2 128-19.2 38.4 0 70.4 6.4 102.4 12.8 25.6 6.4 51.2 19.2 70.4 38.4 19.2 12.8 32 32 44.8 44.8s12.8 32 12.8 51.2c0 12.8-6.4 25.6-19.2 38.4-12.8 12.8-25.6 19.2-44.8 19.2-12.8 0-25.6-6.4-32-12.8-6.4-6.4-19.2-19.2-25.6-32-12.8-25.6-25.6-38.4-44.8-51.2-12.8-12.8-38.4-19.2-76.8-19.2-32 0-57.6 6.4-76.8 19.2-19.2 12.8-32 25.6-32 44.8 0 12.8 6.4 19.2 12.8 32l25.6 19.2c12.8 6.4 25.6 12.8 38.4 12.8 12.8 6.4 32 6.4 64 12.8 32 12.8 64 25.6 96 32 32 6.4 51.2 19.2 76.8 32 19.2 12.8 38.4 32 51.2 51.2 6.4 25.6 12.8 51.2 12.8 76.8 0 38.4-12.8 70.4-32 102.4z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"skype\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 91,\n\t\t\t\t\"id\": 86,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58955,\n\t\t\t\t\"name\": \"skype\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 75\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M64 0l64 896 384 128 384-128 64-896h-896zM780.8 300.8h-428.8l12.8 115.2h409.6l-32 352-230.4 64-230.4-64-12.8-179.2h115.2v89.6l128 32 128-32 12.8-147.2h-390.4l-32-345.6h563.2l-12.8 115.2z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"html5\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 92,\n\t\t\t\t\"id\": 79,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58971,\n\t\t\t\t\"name\": \"html5\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 91\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M0 524.8c0 44.8 6.4 89.6 12.8 128s19.2 70.4 38.4 96c12.8 25.6 32 51.2 57.6 70.4s51.2 38.4 76.8 51.2c25.6 12.8 57.6 25.6 96 32l108.8 19.2s76.8 6.4 121.6 6.4 83.2 0 121.6-6.4 70.4-6.4 108.8-19.2c38.4-6.4 70.4-19.2 96-32s51.2-32 76.8-51.2c25.6-19.2 44.8-44.8 57.6-70.4 12.8-25.6 25.6-57.6 38.4-96 12.8-38.4 12.8-83.2 12.8-128 0-83.2-25.6-153.6-83.2-217.6l6.4-25.6c0-12.8 6.4-25.6 6.4-44.8v-64l-19.2-76.8h-32c-12.8 0-25.6 6.4-44.8 6.4-19.2 6.4-38.4 12.8-64 25.6l-76.8 51.2c-51.2-12.8-121.6-19.2-204.8-19.2s-153.6 6.4-198.4 19.2c-32-19.2-57.6-32-83.2-44.8-25.6-12.8-44.8-19.2-64-25.6l-38.4-12.8h-38.4l-19.2 76.8c-6.4 25.6-6.4 44.8 0 64 0 19.2 6.4 32 6.4 44.8 0 12.8 6.4 19.2 6.4 25.6-57.6 64-83.2 134.4-83.2 217.6zM128 652.8c0-44.8 19.2-89.6 64-134.4 12.8-12.8 25.6-19.2 44.8-25.6 19.2-6.4 38.4-12.8 57.6-12.8h64c19.2 0 44.8 0 76.8 6.4h153.6c25.6 0 51.2-6.4 70.4-6.4h64c19.2 0 44.8 6.4 57.6 12.8 19.2 6.4 32 12.8 44.8 25.6 44.8 38.4 64 83.2 64 134.4 0 25.6-6.4 51.2-12.8 76.8l-25.6 57.6c-12.8 12.8-25.6 25.6-44.8 38.4-19.2 12.8-38.4 19.2-57.6 25.6-19.2 6.4-44.8 12.8-70.4 12.8-32 0-57.6 6.4-76.8 6.4-25.6-6.4-57.6-6.4-89.6-6.4h-89.6c-25.6 0-51.2 0-76.8-6.4-32 0-51.2-6.4-70.4-12.8-19.2-6.4-38.4-12.8-57.6-25.6-25.6-12.8-44.8-19.2-51.2-38.4-12.8-12.8-19.2-32-25.6-57.6-12.8-19.2-12.8-44.8-12.8-70.4zM640 640c0 51.2 25.6 96 64 96s64-44.8 64-96-25.6-96-64-96c-32 0-64 44.8-64 96zM256 640c0 51.2 32 96 64 96s64-44.8 64-96-25.6-96-64-96-64 44.8-64 96z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"github\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 93,\n\t\t\t\t\"id\": 77,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58972,\n\t\t\t\t\"name\": \"github\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 92\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M985.6 595.2l-390.4 390.4c-44.8 44.8-121.6 44.8-166.4 0l-396.8-390.4c-44.8-44.8-44.8-121.6 0-166.4l390.4-390.4c51.2-51.2 128-51.2 172.8-6.4l179.2 179.2-262.4 268.8-102.4-102.4c-32-32-83.2-32-108.8 0l-83.2 83.2c-32 32-32 76.8 0 108.8l236.8 236.8c25.6 25.6 57.6 25.6 83.2 19.2 12.8-6.4 19.2-6.4 25.6-19.2l396.8-403.2 19.2 19.2c57.6 51.2 57.6 128 6.4 172.8zM550.4 736c-12.8 12.8-44.8 12.8-44.8 12.8s-32 0-38.4-12.8l-179.2-185.6c-12.8-12.8-12.8-38.4 0-57.6l51.2-51.2c12.8-12.8 44.8-12.8 57.6 0l115.2 121.6 352-352c12.8-12.8 44.8-12.8 57.6 0l51.2 51.2c12.8 12.8 12.8 44.8 0 57.6l-422.4 416z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"foursquare\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 94,\n\t\t\t\t\"id\": 76,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58973,\n\t\t\t\t\"name\": \"foursquare\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 93\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M512 211.2l211.2-179.2 300.8 198.4-204.8 166.4-307.2-185.6zM1024 563.2l-300.8 198.4-211.2-172.8 300.8-185.6 211.2 160zM300.8 761.6l-300.8-198.4 204.8-166.4 307.2 192-211.2 172.8zM-0 230.4l300.8-198.4 211.2 179.2-300.8 192-211.2-172.8zM512 627.2l211.2 179.2 89.6-57.6v64l-300.8 179.2-300.8-179.2v-64l89.6 51.2 211.2-172.8z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"dropbox\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 95,\n\t\t\t\t\"id\": 74,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58974,\n\t\t\t\t\"name\": \"dropbox\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 94\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M864 710.4c-38.4 0-64-32-64-64v-256c0-38.4 32-64 64-64 38.4 0 64 32 64 64v256c0 32-25.6 64-64 64zM697.6 857.6h-38.4v108.8c0 38.4-25.6 64-57.6 64s-57.6-25.6-57.6-64v-108.8h-70.4v108.8c0 38.4-25.6 64-57.6 64s-57.6-25.6-57.6-64v-108.8h-32c-19.2 0-38.4-19.2-38.4-44.8v-428.8h448v422.4c0 32-12.8 51.2-38.4 51.2zM736 326.4h-448c0-89.6 32-153.6 76.8-192l-70.4-83.2c-6.4-12.8-6.4-25.6 0-38.4 12.8-12.8 25.6-12.8 38.4 0l83.2 96c32-12.8 64-19.2 96-19.2s70.4 6.4 96 19.2l83.2-96c12.8-12.8 25.6-12.8 38.4 0s12.8 32 0 38.4l-70.4 83.2c44.8 32 76.8 102.4 76.8 192zM441.6 198.4c-12.8 0-25.6 12.8-25.6 32s12.8 32 25.6 32 25.6-12.8 25.6-32-12.8-32-25.6-32zM582.4 198.4c-12.8 0-25.6 12.8-25.6 32s12.8 32 25.6 32 25.6-19.2 25.6-32-12.8-32-25.6-32zM160 710.4c-38.4 0-64-32-64-64v-256c0-38.4 25.6-64 64-64s64 32 64 64v256c0 32-25.6 64-64 64z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"android\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 96,\n\t\t\t\t\"id\": 70,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58975,\n\t\t\t\t\"name\": \"android\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 95\n\t\t},\n\t\t{\n\t\t\t\"icon\": {\n\t\t\t\t\"paths\": [\n\t\t\t\t\t\"M921.6 748.8c-32 153.6-115.2 211.2-147.2 249.6-32 25.6-121.6 25.6-153.6 6.4-38.4-25.6-134.4-25.6-166.4 0-44.8 32-115.2 19.2-128 12.8-256-179.2-352-716.8 12.8-774.4 64-12.8 134.4 32 134.4 32 51.2 25.6 70.4 12.8 115.2-6.4 96-44.8 243.2-44.8 313.6 76.8-147.2 96-153.6 294.4 19.2 403.2zM716.8 0c12.8 70.4-64 224-204.8 230.4-12.8-38.4 32-217.6 204.8-230.4z\"\n\t\t\t\t],\n\t\t\t\t\"grid\": 16,\n\t\t\t\t\"tags\": [\n\t\t\t\t\t\"apple\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"order\": 97,\n\t\t\t\t\"id\": 71,\n\t\t\t\t\"prevSize\": 16,\n\t\t\t\t\"code\": 58976,\n\t\t\t\t\"name\": \"apple\",\n\t\t\t\t\"ligatures\": \"\"\n\t\t\t},\n\t\t\t\"setIdx\": 0,\n\t\t\t\"iconIdx\": 96\n\t\t}\n\t],\n\t\"height\": 1024,\n\t\"metadata\": {\n\t\t\"name\": \"flat-ui-icons\",\n\t\t\"url\": \"http://designmodo.com/flat\",\n\t\t\"designer\": \"Sergey Shmidt\",\n\t\t\"designerURL\": \"http://designmodo.com\",\n\t\t\"license\": \"Attribution-NonCommercial-NoDerivs 3.0 Unported\",\n\t\t\"licenseURL\": \"http://creativecommons.org/licenses/by-nc-nd/3.0/\"\n\t},\n\t\"preferences\": {\n\t\t\"showGlyphs\": true,\n\t\t\"showQuickUse\": false,\n\t\t\"fontPref\": {\n\t\t\t\"prefix\": \"fui-\",\n\t\t\t\"metadata\": {\n\t\t\t\t\"fontFamily\": \"flat-ui-icons\",\n\t\t\t\t\"majorVersion\": 1,\n\t\t\t\t\"minorVersion\": 1,\n\t\t\t\t\"fontURL\": \"http://designmodo.com/flat\",\n\t\t\t\t\"designer\": \"Sergey Shmidt\",\n\t\t\t\t\"designerURL\": \"http://designmodo.com\",\n\t\t\t\t\"license\": \"Attribution-NonCommercial-NoDerivs 3.0 Unported\",\n\t\t\t\t\"licenseURL\": \"http://creativecommons.org/licenses/by-nc-nd/3.0/\"\n\t\t\t},\n\t\t\t\"metrics\": {\n\t\t\t\t\"emSize\": 1024,\n\t\t\t\t\"baseline\": 6.25,\n\t\t\t\t\"whitespace\": 50\n\t\t\t},\n\t\t\t\"showMetrics\": true,\n\t\t\t\"showMetadata\": true,\n\t\t\t\"showVersion\": true,\n\t\t\t\"includeMetadata\": true,\n\t\t\t\"resetPoint\": 58880\n\t\t},\n\t\t\"imagePref\": {},\n\t\t\"historySize\": 100,\n\t\t\"showCodes\": true,\n\t\t\"gridSize\": 16,\n\t\t\"showGrid\": true,\n\t\t\"showLiga\": false\n\t}\n}"
  },
  {
    "path": "app/lib/flat-ui/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Flat UI Free 101 Template</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n    <!-- Loading Bootstrap -->\n    <link href=\"../dist/css/vendor/bootstrap.min.css\" rel=\"stylesheet\">\n\n    <!-- Loading Flat UI -->\n    <link href=\"../dist/css/flat-ui.min.css\" rel=\"stylesheet\">\n\n    <link rel=\"shortcut icon\" href=\"img/favicon.ico\">\n\n    <!-- HTML5 shim, for IE6-8 support of HTML5 elements. All other JS at the end of file. -->\n    <!--[if lt IE 9]>\n      <script src=\"js/vendor/html5shiv.js\"></script>\n      <script src=\"js/vendor/respond.min.js\"></script>\n    <![endif]-->\n  </head>\n  <body>\n    <div class=\"container\">\n        <h1>Hello, world!</h1>\n    </div>\n    <!-- /.container -->\n\n\n    <!-- jQuery (necessary for Flat UI's JavaScript plugins) -->\n    <script src=\"../dist/js/vendor/jquery.min.js\"></script>\n    <!-- Include all compiled plugins (below), or include individual files as needed -->\n    <script src=\"../dist/js/vendor/video.js\"></script>\n    <script src=\"../dist/js/flat-ui.min.js\"></script>\n\n  </body>\n</html>\n"
  },
  {
    "path": "app/lib/flat-ui/js/flat-ui.js",
    "content": "/*!\n * Flat UI Free v2.2.2 (http://designmodo.github.io/Flat-UI/)\n * Copyright 2013-2014 Designmodo, Inc.\n */\n/*!\n * jQuery UI Core 1.10.4\n * http://jqueryui.com\n *\n * Copyright 2014 jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/category/ui-core/\n */\n(function( $, undefined ) {\n\nvar uuid = 0,\n\truniqueId = /^ui-id-\\d+$/;\n\n// $.ui might exist from components with no dependencies, e.g., $.ui.position\n$.ui = $.ui || {};\n\n$.extend( $.ui, {\n\tversion: \"1.10.4\",\n\n\tkeyCode: {\n\t\tBACKSPACE: 8,\n\t\tCOMMA: 188,\n\t\tDELETE: 46,\n\t\tDOWN: 40,\n\t\tEND: 35,\n\t\tENTER: 13,\n\t\tESCAPE: 27,\n\t\tHOME: 36,\n\t\tLEFT: 37,\n\t\tNUMPAD_ADD: 107,\n\t\tNUMPAD_DECIMAL: 110,\n\t\tNUMPAD_DIVIDE: 111,\n\t\tNUMPAD_ENTER: 108,\n\t\tNUMPAD_MULTIPLY: 106,\n\t\tNUMPAD_SUBTRACT: 109,\n\t\tPAGE_DOWN: 34,\n\t\tPAGE_UP: 33,\n\t\tPERIOD: 190,\n\t\tRIGHT: 39,\n\t\tSPACE: 32,\n\t\tTAB: 9,\n\t\tUP: 38\n\t}\n});\n\n// plugins\n$.fn.extend({\n\tfocus: (function( orig ) {\n\t\treturn function( delay, fn ) {\n\t\t\treturn typeof delay === \"number\" ?\n\t\t\t\tthis.each(function() {\n\t\t\t\t\tvar elem = this;\n\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\t$( elem ).focus();\n\t\t\t\t\t\tif ( fn ) {\n\t\t\t\t\t\t\tfn.call( elem );\n\t\t\t\t\t\t}\n\t\t\t\t\t}, delay );\n\t\t\t\t}) :\n\t\t\t\torig.apply( this, arguments );\n\t\t};\n\t})( $.fn.focus ),\n\n\tscrollParent: function() {\n\t\tvar scrollParent;\n\t\tif (($.ui.ie && (/(static|relative)/).test(this.css(\"position\"))) || (/absolute/).test(this.css(\"position\"))) {\n\t\t\tscrollParent = this.parents().filter(function() {\n\t\t\t\treturn (/(relative|absolute|fixed)/).test($.css(this,\"position\")) && (/(auto|scroll)/).test($.css(this,\"overflow\")+$.css(this,\"overflow-y\")+$.css(this,\"overflow-x\"));\n\t\t\t}).eq(0);\n\t\t} else {\n\t\t\tscrollParent = this.parents().filter(function() {\n\t\t\t\treturn (/(auto|scroll)/).test($.css(this,\"overflow\")+$.css(this,\"overflow-y\")+$.css(this,\"overflow-x\"));\n\t\t\t}).eq(0);\n\t\t}\n\n\t\treturn (/fixed/).test(this.css(\"position\")) || !scrollParent.length ? $(document) : scrollParent;\n\t},\n\n\tzIndex: function( zIndex ) {\n\t\tif ( zIndex !== undefined ) {\n\t\t\treturn this.css( \"zIndex\", zIndex );\n\t\t}\n\n\t\tif ( this.length ) {\n\t\t\tvar elem = $( this[ 0 ] ), position, value;\n\t\t\twhile ( elem.length && elem[ 0 ] !== document ) {\n\t\t\t\t// Ignore z-index if position is set to a value where z-index is ignored by the browser\n\t\t\t\t// This makes behavior of this function consistent across browsers\n\t\t\t\t// WebKit always returns auto if the element is positioned\n\t\t\t\tposition = elem.css( \"position\" );\n\t\t\t\tif ( position === \"absolute\" || position === \"relative\" || position === \"fixed\" ) {\n\t\t\t\t\t// IE returns 0 when zIndex is not specified\n\t\t\t\t\t// other browsers return a string\n\t\t\t\t\t// we ignore the case of nested elements with an explicit value of 0\n\t\t\t\t\t// <div style=\"z-index: -10;\"><div style=\"z-index: 0;\"></div></div>\n\t\t\t\t\tvalue = parseInt( elem.css( \"zIndex\" ), 10 );\n\t\t\t\t\tif ( !isNaN( value ) && value !== 0 ) {\n\t\t\t\t\t\treturn value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telem = elem.parent();\n\t\t\t}\n\t\t}\n\n\t\treturn 0;\n\t},\n\n\tuniqueId: function() {\n\t\treturn this.each(function() {\n\t\t\tif ( !this.id ) {\n\t\t\t\tthis.id = \"ui-id-\" + (++uuid);\n\t\t\t}\n\t\t});\n\t},\n\n\tremoveUniqueId: function() {\n\t\treturn this.each(function() {\n\t\t\tif ( runiqueId.test( this.id ) ) {\n\t\t\t\t$( this ).removeAttr( \"id\" );\n\t\t\t}\n\t\t});\n\t}\n});\n\n// selectors\nfunction focusable( element, isTabIndexNotNaN ) {\n\tvar map, mapName, img,\n\t\tnodeName = element.nodeName.toLowerCase();\n\tif ( \"area\" === nodeName ) {\n\t\tmap = element.parentNode;\n\t\tmapName = map.name;\n\t\tif ( !element.href || !mapName || map.nodeName.toLowerCase() !== \"map\" ) {\n\t\t\treturn false;\n\t\t}\n\t\timg = $( \"img[usemap=#\" + mapName + \"]\" )[0];\n\t\treturn !!img && visible( img );\n\t}\n\treturn ( /input|select|textarea|button|object/.test( nodeName ) ?\n\t\t!element.disabled :\n\t\t\"a\" === nodeName ?\n\t\t\telement.href || isTabIndexNotNaN :\n\t\t\tisTabIndexNotNaN) &&\n\t\t// the element and all of its ancestors must be visible\n\t\tvisible( element );\n}\n\nfunction visible( element ) {\n\treturn $.expr.filters.visible( element ) &&\n\t\t!$( element ).parents().addBack().filter(function() {\n\t\t\treturn $.css( this, \"visibility\" ) === \"hidden\";\n\t\t}).length;\n}\n\n$.extend( $.expr[ \":\" ], {\n\tdata: $.expr.createPseudo ?\n\t\t$.expr.createPseudo(function( dataName ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn !!$.data( elem, dataName );\n\t\t\t};\n\t\t}) :\n\t\t// support: jQuery <1.8\n\t\tfunction( elem, i, match ) {\n\t\t\treturn !!$.data( elem, match[ 3 ] );\n\t\t},\n\n\tfocusable: function( element ) {\n\t\treturn focusable( element, !isNaN( $.attr( element, \"tabindex\" ) ) );\n\t},\n\n\ttabbable: function( element ) {\n\t\tvar tabIndex = $.attr( element, \"tabindex\" ),\n\t\t\tisTabIndexNaN = isNaN( tabIndex );\n\t\treturn ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN );\n\t}\n});\n\n// support: jQuery <1.8\nif ( !$( \"<a>\" ).outerWidth( 1 ).jquery ) {\n\t$.each( [ \"Width\", \"Height\" ], function( i, name ) {\n\t\tvar side = name === \"Width\" ? [ \"Left\", \"Right\" ] : [ \"Top\", \"Bottom\" ],\n\t\t\ttype = name.toLowerCase(),\n\t\t\torig = {\n\t\t\t\tinnerWidth: $.fn.innerWidth,\n\t\t\t\tinnerHeight: $.fn.innerHeight,\n\t\t\t\touterWidth: $.fn.outerWidth,\n\t\t\t\touterHeight: $.fn.outerHeight\n\t\t\t};\n\n\t\tfunction reduce( elem, size, border, margin ) {\n\t\t\t$.each( side, function() {\n\t\t\t\tsize -= parseFloat( $.css( elem, \"padding\" + this ) ) || 0;\n\t\t\t\tif ( border ) {\n\t\t\t\t\tsize -= parseFloat( $.css( elem, \"border\" + this + \"Width\" ) ) || 0;\n\t\t\t\t}\n\t\t\t\tif ( margin ) {\n\t\t\t\t\tsize -= parseFloat( $.css( elem, \"margin\" + this ) ) || 0;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn size;\n\t\t}\n\n\t\t$.fn[ \"inner\" + name ] = function( size ) {\n\t\t\tif ( size === undefined ) {\n\t\t\t\treturn orig[ \"inner\" + name ].call( this );\n\t\t\t}\n\n\t\t\treturn this.each(function() {\n\t\t\t\t$( this ).css( type, reduce( this, size ) + \"px\" );\n\t\t\t});\n\t\t};\n\n\t\t$.fn[ \"outer\" + name] = function( size, margin ) {\n\t\t\tif ( typeof size !== \"number\" ) {\n\t\t\t\treturn orig[ \"outer\" + name ].call( this, size );\n\t\t\t}\n\n\t\t\treturn this.each(function() {\n\t\t\t\t$( this).css( type, reduce( this, size, true, margin ) + \"px\" );\n\t\t\t});\n\t\t};\n\t});\n}\n\n// support: jQuery <1.8\nif ( !$.fn.addBack ) {\n\t$.fn.addBack = function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t};\n}\n\n// support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413)\nif ( $( \"<a>\" ).data( \"a-b\", \"a\" ).removeData( \"a-b\" ).data( \"a-b\" ) ) {\n\t$.fn.removeData = (function( removeData ) {\n\t\treturn function( key ) {\n\t\t\tif ( arguments.length ) {\n\t\t\t\treturn removeData.call( this, $.camelCase( key ) );\n\t\t\t} else {\n\t\t\t\treturn removeData.call( this );\n\t\t\t}\n\t\t};\n\t})( $.fn.removeData );\n}\n\n\n\n\n\n// deprecated\n$.ui.ie = !!/msie [\\w.]+/.exec( navigator.userAgent.toLowerCase() );\n\n$.support.selectstart = \"onselectstart\" in document.createElement( \"div\" );\n$.fn.extend({\n\tdisableSelection: function() {\n\t\treturn this.bind( ( $.support.selectstart ? \"selectstart\" : \"mousedown\" ) +\n\t\t\t\".ui-disableSelection\", function( event ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t});\n\t},\n\n\tenableSelection: function() {\n\t\treturn this.unbind( \".ui-disableSelection\" );\n\t}\n});\n\n$.extend( $.ui, {\n\t// $.ui.plugin is deprecated. Use $.widget() extensions instead.\n\tplugin: {\n\t\tadd: function( module, option, set ) {\n\t\t\tvar i,\n\t\t\t\tproto = $.ui[ module ].prototype;\n\t\t\tfor ( i in set ) {\n\t\t\t\tproto.plugins[ i ] = proto.plugins[ i ] || [];\n\t\t\t\tproto.plugins[ i ].push( [ option, set[ i ] ] );\n\t\t\t}\n\t\t},\n\t\tcall: function( instance, name, args ) {\n\t\t\tvar i,\n\t\t\t\tset = instance.plugins[ name ];\n\t\t\tif ( !set || !instance.element[ 0 ].parentNode || instance.element[ 0 ].parentNode.nodeType === 11 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tfor ( i = 0; i < set.length; i++ ) {\n\t\t\t\tif ( instance.options[ set[ i ][ 0 ] ] ) {\n\t\t\t\t\tset[ i ][ 1 ].apply( instance.element, args );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// only used by resizable\n\thasScroll: function( el, a ) {\n\n\t\t//If overflow is hidden, the element might have extra content, but the user wants to hide it\n\t\tif ( $( el ).css( \"overflow\" ) === \"hidden\") {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar scroll = ( a && a === \"left\" ) ? \"scrollLeft\" : \"scrollTop\",\n\t\t\thas = false;\n\n\t\tif ( el[ scroll ] > 0 ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// TODO: determine which cases actually cause this to happen\n\t\t// if the element doesn't have the scroll set, see if it's possible to\n\t\t// set the scroll\n\t\tel[ scroll ] = 1;\n\t\thas = ( el[ scroll ] > 0 );\n\t\tel[ scroll ] = 0;\n\t\treturn has;\n\t}\n});\n\n})( jQuery );\n\n/*!\n * jQuery UI Widget 1.10.4\n * http://jqueryui.com\n *\n * Copyright 2014 jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/jQuery.widget/\n */\n(function( $, undefined ) {\n\nvar uuid = 0,\n\tslice = Array.prototype.slice,\n\t_cleanData = $.cleanData;\n$.cleanData = function( elems ) {\n\tfor ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {\n\t\ttry {\n\t\t\t$( elem ).triggerHandler( \"remove\" );\n\t\t// http://bugs.jquery.com/ticket/8235\n\t\t} catch( e ) {}\n\t}\n\t_cleanData( elems );\n};\n\n$.widget = function( name, base, prototype ) {\n\tvar fullName, existingConstructor, constructor, basePrototype,\n\t\t// proxiedPrototype allows the provided prototype to remain unmodified\n\t\t// so that it can be used as a mixin for multiple widgets (#8876)\n\t\tproxiedPrototype = {},\n\t\tnamespace = name.split( \".\" )[ 0 ];\n\n\tname = name.split( \".\" )[ 1 ];\n\tfullName = namespace + \"-\" + name;\n\n\tif ( !prototype ) {\n\t\tprototype = base;\n\t\tbase = $.Widget;\n\t}\n\n\t// create selector for plugin\n\t$.expr[ \":\" ][ fullName.toLowerCase() ] = function( elem ) {\n\t\treturn !!$.data( elem, fullName );\n\t};\n\n\t$[ namespace ] = $[ namespace ] || {};\n\texistingConstructor = $[ namespace ][ name ];\n\tconstructor = $[ namespace ][ name ] = function( options, element ) {\n\t\t// allow instantiation without \"new\" keyword\n\t\tif ( !this._createWidget ) {\n\t\t\treturn new constructor( options, element );\n\t\t}\n\n\t\t// allow instantiation without initializing for simple inheritance\n\t\t// must use \"new\" keyword (the code above always passes args)\n\t\tif ( arguments.length ) {\n\t\t\tthis._createWidget( options, element );\n\t\t}\n\t};\n\t// extend with the existing constructor to carry over any static properties\n\t$.extend( constructor, existingConstructor, {\n\t\tversion: prototype.version,\n\t\t// copy the object used to create the prototype in case we need to\n\t\t// redefine the widget later\n\t\t_proto: $.extend( {}, prototype ),\n\t\t// track widgets that inherit from this widget in case this widget is\n\t\t// redefined after a widget inherits from it\n\t\t_childConstructors: []\n\t});\n\n\tbasePrototype = new base();\n\t// we need to make the options hash a property directly on the new instance\n\t// otherwise we'll modify the options hash on the prototype that we're\n\t// inheriting from\n\tbasePrototype.options = $.widget.extend( {}, basePrototype.options );\n\t$.each( prototype, function( prop, value ) {\n\t\tif ( !$.isFunction( value ) ) {\n\t\t\tproxiedPrototype[ prop ] = value;\n\t\t\treturn;\n\t\t}\n\t\tproxiedPrototype[ prop ] = (function() {\n\t\t\tvar _super = function() {\n\t\t\t\t\treturn base.prototype[ prop ].apply( this, arguments );\n\t\t\t\t},\n\t\t\t\t_superApply = function( args ) {\n\t\t\t\t\treturn base.prototype[ prop ].apply( this, args );\n\t\t\t\t};\n\t\t\treturn function() {\n\t\t\t\tvar __super = this._super,\n\t\t\t\t\t__superApply = this._superApply,\n\t\t\t\t\treturnValue;\n\n\t\t\t\tthis._super = _super;\n\t\t\t\tthis._superApply = _superApply;\n\n\t\t\t\treturnValue = value.apply( this, arguments );\n\n\t\t\t\tthis._super = __super;\n\t\t\t\tthis._superApply = __superApply;\n\n\t\t\t\treturn returnValue;\n\t\t\t};\n\t\t})();\n\t});\n\tconstructor.prototype = $.widget.extend( basePrototype, {\n\t\t// TODO: remove support for widgetEventPrefix\n\t\t// always use the name + a colon as the prefix, e.g., draggable:start\n\t\t// don't prefix for widgets that aren't DOM-based\n\t\twidgetEventPrefix: existingConstructor ? (basePrototype.widgetEventPrefix || name) : name\n\t}, proxiedPrototype, {\n\t\tconstructor: constructor,\n\t\tnamespace: namespace,\n\t\twidgetName: name,\n\t\twidgetFullName: fullName\n\t});\n\n\t// If this widget is being redefined then we need to find all widgets that\n\t// are inheriting from it and redefine all of them so that they inherit from\n\t// the new version of this widget. We're essentially trying to replace one\n\t// level in the prototype chain.\n\tif ( existingConstructor ) {\n\t\t$.each( existingConstructor._childConstructors, function( i, child ) {\n\t\t\tvar childPrototype = child.prototype;\n\n\t\t\t// redefine the child widget using the same prototype that was\n\t\t\t// originally used, but inherit from the new version of the base\n\t\t\t$.widget( childPrototype.namespace + \".\" + childPrototype.widgetName, constructor, child._proto );\n\t\t});\n\t\t// remove the list of existing child constructors from the old constructor\n\t\t// so the old child constructors can be garbage collected\n\t\tdelete existingConstructor._childConstructors;\n\t} else {\n\t\tbase._childConstructors.push( constructor );\n\t}\n\n\t$.widget.bridge( name, constructor );\n};\n\n$.widget.extend = function( target ) {\n\tvar input = slice.call( arguments, 1 ),\n\t\tinputIndex = 0,\n\t\tinputLength = input.length,\n\t\tkey,\n\t\tvalue;\n\tfor ( ; inputIndex < inputLength; inputIndex++ ) {\n\t\tfor ( key in input[ inputIndex ] ) {\n\t\t\tvalue = input[ inputIndex ][ key ];\n\t\t\tif ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {\n\t\t\t\t// Clone objects\n\t\t\t\tif ( $.isPlainObject( value ) ) {\n\t\t\t\t\ttarget[ key ] = $.isPlainObject( target[ key ] ) ?\n\t\t\t\t\t\t$.widget.extend( {}, target[ key ], value ) :\n\t\t\t\t\t\t// Don't extend strings, arrays, etc. with objects\n\t\t\t\t\t\t$.widget.extend( {}, value );\n\t\t\t\t// Copy everything else by reference\n\t\t\t\t} else {\n\t\t\t\t\ttarget[ key ] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn target;\n};\n\n$.widget.bridge = function( name, object ) {\n\tvar fullName = object.prototype.widgetFullName || name;\n\t$.fn[ name ] = function( options ) {\n\t\tvar isMethodCall = typeof options === \"string\",\n\t\t\targs = slice.call( arguments, 1 ),\n\t\t\treturnValue = this;\n\n\t\t// allow multiple hashes to be passed on init\n\t\toptions = !isMethodCall && args.length ?\n\t\t\t$.widget.extend.apply( null, [ options ].concat(args) ) :\n\t\t\toptions;\n\n\t\tif ( isMethodCall ) {\n\t\t\tthis.each(function() {\n\t\t\t\tvar methodValue,\n\t\t\t\t\tinstance = $.data( this, fullName );\n\t\t\t\tif ( !instance ) {\n\t\t\t\t\treturn $.error( \"cannot call methods on \" + name + \" prior to initialization; \" +\n\t\t\t\t\t\t\"attempted to call method '\" + options + \"'\" );\n\t\t\t\t}\n\t\t\t\tif ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === \"_\" ) {\n\t\t\t\t\treturn $.error( \"no such method '\" + options + \"' for \" + name + \" widget instance\" );\n\t\t\t\t}\n\t\t\t\tmethodValue = instance[ options ].apply( instance, args );\n\t\t\t\tif ( methodValue !== instance && methodValue !== undefined ) {\n\t\t\t\t\treturnValue = methodValue && methodValue.jquery ?\n\t\t\t\t\t\treturnValue.pushStack( methodValue.get() ) :\n\t\t\t\t\t\tmethodValue;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tthis.each(function() {\n\t\t\t\tvar instance = $.data( this, fullName );\n\t\t\t\tif ( instance ) {\n\t\t\t\t\tinstance.option( options || {} )._init();\n\t\t\t\t} else {\n\t\t\t\t\t$.data( this, fullName, new object( options, this ) );\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn returnValue;\n\t};\n};\n\n$.Widget = function( /* options, element */ ) {};\n$.Widget._childConstructors = [];\n\n$.Widget.prototype = {\n\twidgetName: \"widget\",\n\twidgetEventPrefix: \"\",\n\tdefaultElement: \"<div>\",\n\toptions: {\n\t\tdisabled: false,\n\n\t\t// callbacks\n\t\tcreate: null\n\t},\n\t_createWidget: function( options, element ) {\n\t\telement = $( element || this.defaultElement || this )[ 0 ];\n\t\tthis.element = $( element );\n\t\tthis.uuid = uuid++;\n\t\tthis.eventNamespace = \".\" + this.widgetName + this.uuid;\n\t\tthis.options = $.widget.extend( {},\n\t\t\tthis.options,\n\t\t\tthis._getCreateOptions(),\n\t\t\toptions );\n\n\t\tthis.bindings = $();\n\t\tthis.hoverable = $();\n\t\tthis.focusable = $();\n\n\t\tif ( element !== this ) {\n\t\t\t$.data( element, this.widgetFullName, this );\n\t\t\tthis._on( true, this.element, {\n\t\t\t\tremove: function( event ) {\n\t\t\t\t\tif ( event.target === element ) {\n\t\t\t\t\t\tthis.destroy();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\tthis.document = $( element.style ?\n\t\t\t\t// element within the document\n\t\t\t\telement.ownerDocument :\n\t\t\t\t// element is window or document\n\t\t\t\telement.document || element );\n\t\t\tthis.window = $( this.document[0].defaultView || this.document[0].parentWindow );\n\t\t}\n\n\t\tthis._create();\n\t\tthis._trigger( \"create\", null, this._getCreateEventData() );\n\t\tthis._init();\n\t},\n\t_getCreateOptions: $.noop,\n\t_getCreateEventData: $.noop,\n\t_create: $.noop,\n\t_init: $.noop,\n\n\tdestroy: function() {\n\t\tthis._destroy();\n\t\t// we can probably remove the unbind calls in 2.0\n\t\t// all event bindings should go through this._on()\n\t\tthis.element\n\t\t\t.unbind( this.eventNamespace )\n\t\t\t// 1.9 BC for #7810\n\t\t\t// TODO remove dual storage\n\t\t\t.removeData( this.widgetName )\n\t\t\t.removeData( this.widgetFullName )\n\t\t\t// support: jquery <1.6.3\n\t\t\t// http://bugs.jquery.com/ticket/9413\n\t\t\t.removeData( $.camelCase( this.widgetFullName ) );\n\t\tthis.widget()\n\t\t\t.unbind( this.eventNamespace )\n\t\t\t.removeAttr( \"aria-disabled\" )\n\t\t\t.removeClass(\n\t\t\t\tthis.widgetFullName + \"-disabled \" +\n\t\t\t\t\"ui-state-disabled\" );\n\n\t\t// clean up events and states\n\t\tthis.bindings.unbind( this.eventNamespace );\n\t\tthis.hoverable.removeClass( \"ui-state-hover\" );\n\t\tthis.focusable.removeClass( \"ui-state-focus\" );\n\t},\n\t_destroy: $.noop,\n\n\twidget: function() {\n\t\treturn this.element;\n\t},\n\n\toption: function( key, value ) {\n\t\tvar options = key,\n\t\t\tparts,\n\t\t\tcurOption,\n\t\t\ti;\n\n\t\tif ( arguments.length === 0 ) {\n\t\t\t// don't return a reference to the internal hash\n\t\t\treturn $.widget.extend( {}, this.options );\n\t\t}\n\n\t\tif ( typeof key === \"string\" ) {\n\t\t\t// handle nested keys, e.g., \"foo.bar\" => { foo: { bar: ___ } }\n\t\t\toptions = {};\n\t\t\tparts = key.split( \".\" );\n\t\t\tkey = parts.shift();\n\t\t\tif ( parts.length ) {\n\t\t\t\tcurOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );\n\t\t\t\tfor ( i = 0; i < parts.length - 1; i++ ) {\n\t\t\t\t\tcurOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};\n\t\t\t\t\tcurOption = curOption[ parts[ i ] ];\n\t\t\t\t}\n\t\t\t\tkey = parts.pop();\n\t\t\t\tif ( arguments.length === 1 ) {\n\t\t\t\t\treturn curOption[ key ] === undefined ? null : curOption[ key ];\n\t\t\t\t}\n\t\t\t\tcurOption[ key ] = value;\n\t\t\t} else {\n\t\t\t\tif ( arguments.length === 1 ) {\n\t\t\t\t\treturn this.options[ key ] === undefined ? null : this.options[ key ];\n\t\t\t\t}\n\t\t\t\toptions[ key ] = value;\n\t\t\t}\n\t\t}\n\n\t\tthis._setOptions( options );\n\n\t\treturn this;\n\t},\n\t_setOptions: function( options ) {\n\t\tvar key;\n\n\t\tfor ( key in options ) {\n\t\t\tthis._setOption( key, options[ key ] );\n\t\t}\n\n\t\treturn this;\n\t},\n\t_setOption: function( key, value ) {\n\t\tthis.options[ key ] = value;\n\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis.widget()\n\t\t\t\t.toggleClass( this.widgetFullName + \"-disabled ui-state-disabled\", !!value )\n\t\t\t\t.attr( \"aria-disabled\", value );\n\t\t\tthis.hoverable.removeClass( \"ui-state-hover\" );\n\t\t\tthis.focusable.removeClass( \"ui-state-focus\" );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tenable: function() {\n\t\treturn this._setOption( \"disabled\", false );\n\t},\n\tdisable: function() {\n\t\treturn this._setOption( \"disabled\", true );\n\t},\n\n\t_on: function( suppressDisabledCheck, element, handlers ) {\n\t\tvar delegateElement,\n\t\t\tinstance = this;\n\n\t\t// no suppressDisabledCheck flag, shuffle arguments\n\t\tif ( typeof suppressDisabledCheck !== \"boolean\" ) {\n\t\t\thandlers = element;\n\t\t\telement = suppressDisabledCheck;\n\t\t\tsuppressDisabledCheck = false;\n\t\t}\n\n\t\t// no element argument, shuffle and use this.element\n\t\tif ( !handlers ) {\n\t\t\thandlers = element;\n\t\t\telement = this.element;\n\t\t\tdelegateElement = this.widget();\n\t\t} else {\n\t\t\t// accept selectors, DOM elements\n\t\t\telement = delegateElement = $( element );\n\t\t\tthis.bindings = this.bindings.add( element );\n\t\t}\n\n\t\t$.each( handlers, function( event, handler ) {\n\t\t\tfunction handlerProxy() {\n\t\t\t\t// allow widgets to customize the disabled handling\n\t\t\t\t// - disabled as an array instead of boolean\n\t\t\t\t// - disabled class as method for disabling individual parts\n\t\t\t\tif ( !suppressDisabledCheck &&\n\t\t\t\t\t\t( instance.options.disabled === true ||\n\t\t\t\t\t\t\t$( this ).hasClass( \"ui-state-disabled\" ) ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treturn ( typeof handler === \"string\" ? instance[ handler ] : handler )\n\t\t\t\t\t.apply( instance, arguments );\n\t\t\t}\n\n\t\t\t// copy the guid so direct unbinding works\n\t\t\tif ( typeof handler !== \"string\" ) {\n\t\t\t\thandlerProxy.guid = handler.guid =\n\t\t\t\t\thandler.guid || handlerProxy.guid || $.guid++;\n\t\t\t}\n\n\t\t\tvar match = event.match( /^(\\w+)\\s*(.*)$/ ),\n\t\t\t\teventName = match[1] + instance.eventNamespace,\n\t\t\t\tselector = match[2];\n\t\t\tif ( selector ) {\n\t\t\t\tdelegateElement.delegate( selector, eventName, handlerProxy );\n\t\t\t} else {\n\t\t\t\telement.bind( eventName, handlerProxy );\n\t\t\t}\n\t\t});\n\t},\n\n\t_off: function( element, eventName ) {\n\t\teventName = (eventName || \"\").split( \" \" ).join( this.eventNamespace + \" \" ) + this.eventNamespace;\n\t\telement.unbind( eventName ).undelegate( eventName );\n\t},\n\n\t_delay: function( handler, delay ) {\n\t\tfunction handlerProxy() {\n\t\t\treturn ( typeof handler === \"string\" ? instance[ handler ] : handler )\n\t\t\t\t.apply( instance, arguments );\n\t\t}\n\t\tvar instance = this;\n\t\treturn setTimeout( handlerProxy, delay || 0 );\n\t},\n\n\t_hoverable: function( element ) {\n\t\tthis.hoverable = this.hoverable.add( element );\n\t\tthis._on( element, {\n\t\t\tmouseenter: function( event ) {\n\t\t\t\t$( event.currentTarget ).addClass( \"ui-state-hover\" );\n\t\t\t},\n\t\t\tmouseleave: function( event ) {\n\t\t\t\t$( event.currentTarget ).removeClass( \"ui-state-hover\" );\n\t\t\t}\n\t\t});\n\t},\n\n\t_focusable: function( element ) {\n\t\tthis.focusable = this.focusable.add( element );\n\t\tthis._on( element, {\n\t\t\tfocusin: function( event ) {\n\t\t\t\t$( event.currentTarget ).addClass( \"ui-state-focus\" );\n\t\t\t},\n\t\t\tfocusout: function( event ) {\n\t\t\t\t$( event.currentTarget ).removeClass( \"ui-state-focus\" );\n\t\t\t}\n\t\t});\n\t},\n\n\t_trigger: function( type, event, data ) {\n\t\tvar prop, orig,\n\t\t\tcallback = this.options[ type ];\n\n\t\tdata = data || {};\n\t\tevent = $.Event( event );\n\t\tevent.type = ( type === this.widgetEventPrefix ?\n\t\t\ttype :\n\t\t\tthis.widgetEventPrefix + type ).toLowerCase();\n\t\t// the original event may come from any element\n\t\t// so we need to reset the target on the new event\n\t\tevent.target = this.element[ 0 ];\n\n\t\t// copy original event properties over to the new event\n\t\torig = event.originalEvent;\n\t\tif ( orig ) {\n\t\t\tfor ( prop in orig ) {\n\t\t\t\tif ( !( prop in event ) ) {\n\t\t\t\t\tevent[ prop ] = orig[ prop ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.element.trigger( event, data );\n\t\treturn !( $.isFunction( callback ) &&\n\t\t\tcallback.apply( this.element[0], [ event ].concat( data ) ) === false ||\n\t\t\tevent.isDefaultPrevented() );\n\t}\n};\n\n$.each( { show: \"fadeIn\", hide: \"fadeOut\" }, function( method, defaultEffect ) {\n\t$.Widget.prototype[ \"_\" + method ] = function( element, options, callback ) {\n\t\tif ( typeof options === \"string\" ) {\n\t\t\toptions = { effect: options };\n\t\t}\n\t\tvar hasOptions,\n\t\t\teffectName = !options ?\n\t\t\t\tmethod :\n\t\t\t\toptions === true || typeof options === \"number\" ?\n\t\t\t\t\tdefaultEffect :\n\t\t\t\t\toptions.effect || defaultEffect;\n\t\toptions = options || {};\n\t\tif ( typeof options === \"number\" ) {\n\t\t\toptions = { duration: options };\n\t\t}\n\t\thasOptions = !$.isEmptyObject( options );\n\t\toptions.complete = callback;\n\t\tif ( options.delay ) {\n\t\t\telement.delay( options.delay );\n\t\t}\n\t\tif ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {\n\t\t\telement[ method ]( options );\n\t\t} else if ( effectName !== method && element[ effectName ] ) {\n\t\t\telement[ effectName ]( options.duration, options.easing, callback );\n\t\t} else {\n\t\t\telement.queue(function( next ) {\n\t\t\t\t$( this )[ method ]();\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback.call( element[ 0 ] );\n\t\t\t\t}\n\t\t\t\tnext();\n\t\t\t});\n\t\t}\n\t};\n});\n\n})( jQuery );\n\n/*!\n * jQuery UI Mouse 1.10.4\n * http://jqueryui.com\n *\n * Copyright 2014 jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/mouse/\n *\n * Depends:\n *\tjquery.ui.widget.js\n */\n(function( $, undefined ) {\n\nvar mouseHandled = false;\n$( document ).mouseup( function() {\n\tmouseHandled = false;\n});\n\n$.widget(\"ui.mouse\", {\n\tversion: \"1.10.4\",\n\toptions: {\n\t\tcancel: \"input,textarea,button,select,option\",\n\t\tdistance: 1,\n\t\tdelay: 0\n\t},\n\t_mouseInit: function() {\n\t\tvar that = this;\n\n\t\tthis.element\n\t\t\t.bind(\"mousedown.\"+this.widgetName, function(event) {\n\t\t\t\treturn that._mouseDown(event);\n\t\t\t})\n\t\t\t.bind(\"click.\"+this.widgetName, function(event) {\n\t\t\t\tif (true === $.data(event.target, that.widgetName + \".preventClickEvent\")) {\n\t\t\t\t\t$.removeData(event.target, that.widgetName + \".preventClickEvent\");\n\t\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\n\t\tthis.started = false;\n\t},\n\n\t// TODO: make sure destroying one instance of mouse doesn't mess with\n\t// other instances of mouse\n\t_mouseDestroy: function() {\n\t\tthis.element.unbind(\".\"+this.widgetName);\n\t\tif ( this._mouseMoveDelegate ) {\n\t\t\t$(document)\n\t\t\t\t.unbind(\"mousemove.\"+this.widgetName, this._mouseMoveDelegate)\n\t\t\t\t.unbind(\"mouseup.\"+this.widgetName, this._mouseUpDelegate);\n\t\t}\n\t},\n\n\t_mouseDown: function(event) {\n\t\t// don't let more than one widget handle mouseStart\n\t\tif( mouseHandled ) { return; }\n\n\t\t// we may have missed mouseup (out of window)\n\t\t(this._mouseStarted && this._mouseUp(event));\n\n\t\tthis._mouseDownEvent = event;\n\n\t\tvar that = this,\n\t\t\tbtnIsLeft = (event.which === 1),\n\t\t\t// event.target.nodeName works around a bug in IE 8 with\n\t\t\t// disabled inputs (#7620)\n\t\t\telIsCancel = (typeof this.options.cancel === \"string\" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false);\n\t\tif (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {\n\t\t\treturn true;\n\t\t}\n\n\t\tthis.mouseDelayMet = !this.options.delay;\n\t\tif (!this.mouseDelayMet) {\n\t\t\tthis._mouseDelayTimer = setTimeout(function() {\n\t\t\t\tthat.mouseDelayMet = true;\n\t\t\t}, this.options.delay);\n\t\t}\n\n\t\tif (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {\n\t\t\tthis._mouseStarted = (this._mouseStart(event) !== false);\n\t\t\tif (!this._mouseStarted) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\t// Click event may never have fired (Gecko & Opera)\n\t\tif (true === $.data(event.target, this.widgetName + \".preventClickEvent\")) {\n\t\t\t$.removeData(event.target, this.widgetName + \".preventClickEvent\");\n\t\t}\n\n\t\t// these delegates are required to keep context\n\t\tthis._mouseMoveDelegate = function(event) {\n\t\t\treturn that._mouseMove(event);\n\t\t};\n\t\tthis._mouseUpDelegate = function(event) {\n\t\t\treturn that._mouseUp(event);\n\t\t};\n\t\t$(document)\n\t\t\t.bind(\"mousemove.\"+this.widgetName, this._mouseMoveDelegate)\n\t\t\t.bind(\"mouseup.\"+this.widgetName, this._mouseUpDelegate);\n\n\t\tevent.preventDefault();\n\n\t\tmouseHandled = true;\n\t\treturn true;\n\t},\n\n\t_mouseMove: function(event) {\n\t\t// IE mouseup check - mouseup happened when mouse was out of window\n\t\tif ($.ui.ie && ( !document.documentMode || document.documentMode < 9 ) && !event.button) {\n\t\t\treturn this._mouseUp(event);\n\t\t}\n\n\t\tif (this._mouseStarted) {\n\t\t\tthis._mouseDrag(event);\n\t\t\treturn event.preventDefault();\n\t\t}\n\n\t\tif (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {\n\t\t\tthis._mouseStarted =\n\t\t\t\t(this._mouseStart(this._mouseDownEvent, event) !== false);\n\t\t\t(this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));\n\t\t}\n\n\t\treturn !this._mouseStarted;\n\t},\n\n\t_mouseUp: function(event) {\n\t\t$(document)\n\t\t\t.unbind(\"mousemove.\"+this.widgetName, this._mouseMoveDelegate)\n\t\t\t.unbind(\"mouseup.\"+this.widgetName, this._mouseUpDelegate);\n\n\t\tif (this._mouseStarted) {\n\t\t\tthis._mouseStarted = false;\n\n\t\t\tif (event.target === this._mouseDownEvent.target) {\n\t\t\t\t$.data(event.target, this.widgetName + \".preventClickEvent\", true);\n\t\t\t}\n\n\t\t\tthis._mouseStop(event);\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t_mouseDistanceMet: function(event) {\n\t\treturn (Math.max(\n\t\t\t\tMath.abs(this._mouseDownEvent.pageX - event.pageX),\n\t\t\t\tMath.abs(this._mouseDownEvent.pageY - event.pageY)\n\t\t\t) >= this.options.distance\n\t\t);\n\t},\n\n\t_mouseDelayMet: function(/* event */) {\n\t\treturn this.mouseDelayMet;\n\t},\n\n\t// These are placeholder methods, to be overriden by extending plugin\n\t_mouseStart: function(/* event */) {},\n\t_mouseDrag: function(/* event */) {},\n\t_mouseStop: function(/* event */) {},\n\t_mouseCapture: function(/* event */) { return true; }\n});\n\n})(jQuery);\n\n/*!\n * jQuery UI Position 1.10.4\n * http://jqueryui.com\n *\n * Copyright 2014 jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/position/\n */\n(function( $, undefined ) {\n\n$.ui = $.ui || {};\n\nvar cachedScrollbarWidth,\n\tmax = Math.max,\n\tabs = Math.abs,\n\tround = Math.round,\n\trhorizontal = /left|center|right/,\n\trvertical = /top|center|bottom/,\n\troffset = /[\\+\\-]\\d+(\\.[\\d]+)?%?/,\n\trposition = /^\\w+/,\n\trpercent = /%$/,\n\t_position = $.fn.position;\n\nfunction getOffsets( offsets, width, height ) {\n\treturn [\n\t\tparseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ),\n\t\tparseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 )\n\t];\n}\n\nfunction parseCss( element, property ) {\n\treturn parseInt( $.css( element, property ), 10 ) || 0;\n}\n\nfunction getDimensions( elem ) {\n\tvar raw = elem[0];\n\tif ( raw.nodeType === 9 ) {\n\t\treturn {\n\t\t\twidth: elem.width(),\n\t\t\theight: elem.height(),\n\t\t\toffset: { top: 0, left: 0 }\n\t\t};\n\t}\n\tif ( $.isWindow( raw ) ) {\n\t\treturn {\n\t\t\twidth: elem.width(),\n\t\t\theight: elem.height(),\n\t\t\toffset: { top: elem.scrollTop(), left: elem.scrollLeft() }\n\t\t};\n\t}\n\tif ( raw.preventDefault ) {\n\t\treturn {\n\t\t\twidth: 0,\n\t\t\theight: 0,\n\t\t\toffset: { top: raw.pageY, left: raw.pageX }\n\t\t};\n\t}\n\treturn {\n\t\twidth: elem.outerWidth(),\n\t\theight: elem.outerHeight(),\n\t\toffset: elem.offset()\n\t};\n}\n\n$.position = {\n\tscrollbarWidth: function() {\n\t\tif ( cachedScrollbarWidth !== undefined ) {\n\t\t\treturn cachedScrollbarWidth;\n\t\t}\n\t\tvar w1, w2,\n\t\t\tdiv = $( \"<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>\" ),\n\t\t\tinnerDiv = div.children()[0];\n\n\t\t$( \"body\" ).append( div );\n\t\tw1 = innerDiv.offsetWidth;\n\t\tdiv.css( \"overflow\", \"scroll\" );\n\n\t\tw2 = innerDiv.offsetWidth;\n\n\t\tif ( w1 === w2 ) {\n\t\t\tw2 = div[0].clientWidth;\n\t\t}\n\n\t\tdiv.remove();\n\n\t\treturn (cachedScrollbarWidth = w1 - w2);\n\t},\n\tgetScrollInfo: function( within ) {\n\t\tvar overflowX = within.isWindow || within.isDocument ? \"\" :\n\t\t\t\twithin.element.css( \"overflow-x\" ),\n\t\t\toverflowY = within.isWindow || within.isDocument ? \"\" :\n\t\t\t\twithin.element.css( \"overflow-y\" ),\n\t\t\thasOverflowX = overflowX === \"scroll\" ||\n\t\t\t\t( overflowX === \"auto\" && within.width < within.element[0].scrollWidth ),\n\t\t\thasOverflowY = overflowY === \"scroll\" ||\n\t\t\t\t( overflowY === \"auto\" && within.height < within.element[0].scrollHeight );\n\t\treturn {\n\t\t\twidth: hasOverflowY ? $.position.scrollbarWidth() : 0,\n\t\t\theight: hasOverflowX ? $.position.scrollbarWidth() : 0\n\t\t};\n\t},\n\tgetWithinInfo: function( element ) {\n\t\tvar withinElement = $( element || window ),\n\t\t\tisWindow = $.isWindow( withinElement[0] ),\n\t\t\tisDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9;\n\t\treturn {\n\t\t\telement: withinElement,\n\t\t\tisWindow: isWindow,\n\t\t\tisDocument: isDocument,\n\t\t\toffset: withinElement.offset() || { left: 0, top: 0 },\n\t\t\tscrollLeft: withinElement.scrollLeft(),\n\t\t\tscrollTop: withinElement.scrollTop(),\n\t\t\twidth: isWindow ? withinElement.width() : withinElement.outerWidth(),\n\t\t\theight: isWindow ? withinElement.height() : withinElement.outerHeight()\n\t\t};\n\t}\n};\n\n$.fn.position = function( options ) {\n\tif ( !options || !options.of ) {\n\t\treturn _position.apply( this, arguments );\n\t}\n\n\t// make a copy, we don't want to modify arguments\n\toptions = $.extend( {}, options );\n\n\tvar atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions,\n\t\ttarget = $( options.of ),\n\t\twithin = $.position.getWithinInfo( options.within ),\n\t\tscrollInfo = $.position.getScrollInfo( within ),\n\t\tcollision = ( options.collision || \"flip\" ).split( \" \" ),\n\t\toffsets = {};\n\n\tdimensions = getDimensions( target );\n\tif ( target[0].preventDefault ) {\n\t\t// force left top to allow flipping\n\t\toptions.at = \"left top\";\n\t}\n\ttargetWidth = dimensions.width;\n\ttargetHeight = dimensions.height;\n\ttargetOffset = dimensions.offset;\n\t// clone to reuse original targetOffset later\n\tbasePosition = $.extend( {}, targetOffset );\n\n\t// force my and at to have valid horizontal and vertical positions\n\t// if a value is missing or invalid, it will be converted to center\n\t$.each( [ \"my\", \"at\" ], function() {\n\t\tvar pos = ( options[ this ] || \"\" ).split( \" \" ),\n\t\t\thorizontalOffset,\n\t\t\tverticalOffset;\n\n\t\tif ( pos.length === 1) {\n\t\t\tpos = rhorizontal.test( pos[ 0 ] ) ?\n\t\t\t\tpos.concat( [ \"center\" ] ) :\n\t\t\t\trvertical.test( pos[ 0 ] ) ?\n\t\t\t\t\t[ \"center\" ].concat( pos ) :\n\t\t\t\t\t[ \"center\", \"center\" ];\n\t\t}\n\t\tpos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : \"center\";\n\t\tpos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : \"center\";\n\n\t\t// calculate offsets\n\t\thorizontalOffset = roffset.exec( pos[ 0 ] );\n\t\tverticalOffset = roffset.exec( pos[ 1 ] );\n\t\toffsets[ this ] = [\n\t\t\thorizontalOffset ? horizontalOffset[ 0 ] : 0,\n\t\t\tverticalOffset ? verticalOffset[ 0 ] : 0\n\t\t];\n\n\t\t// reduce to just the positions without the offsets\n\t\toptions[ this ] = [\n\t\t\trposition.exec( pos[ 0 ] )[ 0 ],\n\t\t\trposition.exec( pos[ 1 ] )[ 0 ]\n\t\t];\n\t});\n\n\t// normalize collision option\n\tif ( collision.length === 1 ) {\n\t\tcollision[ 1 ] = collision[ 0 ];\n\t}\n\n\tif ( options.at[ 0 ] === \"right\" ) {\n\t\tbasePosition.left += targetWidth;\n\t} else if ( options.at[ 0 ] === \"center\" ) {\n\t\tbasePosition.left += targetWidth / 2;\n\t}\n\n\tif ( options.at[ 1 ] === \"bottom\" ) {\n\t\tbasePosition.top += targetHeight;\n\t} else if ( options.at[ 1 ] === \"center\" ) {\n\t\tbasePosition.top += targetHeight / 2;\n\t}\n\n\tatOffset = getOffsets( offsets.at, targetWidth, targetHeight );\n\tbasePosition.left += atOffset[ 0 ];\n\tbasePosition.top += atOffset[ 1 ];\n\n\treturn this.each(function() {\n\t\tvar collisionPosition, using,\n\t\t\telem = $( this ),\n\t\t\telemWidth = elem.outerWidth(),\n\t\t\telemHeight = elem.outerHeight(),\n\t\t\tmarginLeft = parseCss( this, \"marginLeft\" ),\n\t\t\tmarginTop = parseCss( this, \"marginTop\" ),\n\t\t\tcollisionWidth = elemWidth + marginLeft + parseCss( this, \"marginRight\" ) + scrollInfo.width,\n\t\t\tcollisionHeight = elemHeight + marginTop + parseCss( this, \"marginBottom\" ) + scrollInfo.height,\n\t\t\tposition = $.extend( {}, basePosition ),\n\t\t\tmyOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() );\n\n\t\tif ( options.my[ 0 ] === \"right\" ) {\n\t\t\tposition.left -= elemWidth;\n\t\t} else if ( options.my[ 0 ] === \"center\" ) {\n\t\t\tposition.left -= elemWidth / 2;\n\t\t}\n\n\t\tif ( options.my[ 1 ] === \"bottom\" ) {\n\t\t\tposition.top -= elemHeight;\n\t\t} else if ( options.my[ 1 ] === \"center\" ) {\n\t\t\tposition.top -= elemHeight / 2;\n\t\t}\n\n\t\tposition.left += myOffset[ 0 ];\n\t\tposition.top += myOffset[ 1 ];\n\n\t\t// if the browser doesn't support fractions, then round for consistent results\n\t\tif ( !$.support.offsetFractions ) {\n\t\t\tposition.left = round( position.left );\n\t\t\tposition.top = round( position.top );\n\t\t}\n\n\t\tcollisionPosition = {\n\t\t\tmarginLeft: marginLeft,\n\t\t\tmarginTop: marginTop\n\t\t};\n\n\t\t$.each( [ \"left\", \"top\" ], function( i, dir ) {\n\t\t\tif ( $.ui.position[ collision[ i ] ] ) {\n\t\t\t\t$.ui.position[ collision[ i ] ][ dir ]( position, {\n\t\t\t\t\ttargetWidth: targetWidth,\n\t\t\t\t\ttargetHeight: targetHeight,\n\t\t\t\t\telemWidth: elemWidth,\n\t\t\t\t\telemHeight: elemHeight,\n\t\t\t\t\tcollisionPosition: collisionPosition,\n\t\t\t\t\tcollisionWidth: collisionWidth,\n\t\t\t\t\tcollisionHeight: collisionHeight,\n\t\t\t\t\toffset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ],\n\t\t\t\t\tmy: options.my,\n\t\t\t\t\tat: options.at,\n\t\t\t\t\twithin: within,\n\t\t\t\t\telem : elem\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tif ( options.using ) {\n\t\t\t// adds feedback as second argument to using callback, if present\n\t\t\tusing = function( props ) {\n\t\t\t\tvar left = targetOffset.left - position.left,\n\t\t\t\t\tright = left + targetWidth - elemWidth,\n\t\t\t\t\ttop = targetOffset.top - position.top,\n\t\t\t\t\tbottom = top + targetHeight - elemHeight,\n\t\t\t\t\tfeedback = {\n\t\t\t\t\t\ttarget: {\n\t\t\t\t\t\t\telement: target,\n\t\t\t\t\t\t\tleft: targetOffset.left,\n\t\t\t\t\t\t\ttop: targetOffset.top,\n\t\t\t\t\t\t\twidth: targetWidth,\n\t\t\t\t\t\t\theight: targetHeight\n\t\t\t\t\t\t},\n\t\t\t\t\t\telement: {\n\t\t\t\t\t\t\telement: elem,\n\t\t\t\t\t\t\tleft: position.left,\n\t\t\t\t\t\t\ttop: position.top,\n\t\t\t\t\t\t\twidth: elemWidth,\n\t\t\t\t\t\t\theight: elemHeight\n\t\t\t\t\t\t},\n\t\t\t\t\t\thorizontal: right < 0 ? \"left\" : left > 0 ? \"right\" : \"center\",\n\t\t\t\t\t\tvertical: bottom < 0 ? \"top\" : top > 0 ? \"bottom\" : \"middle\"\n\t\t\t\t\t};\n\t\t\t\tif ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) {\n\t\t\t\t\tfeedback.horizontal = \"center\";\n\t\t\t\t}\n\t\t\t\tif ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) {\n\t\t\t\t\tfeedback.vertical = \"middle\";\n\t\t\t\t}\n\t\t\t\tif ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) {\n\t\t\t\t\tfeedback.important = \"horizontal\";\n\t\t\t\t} else {\n\t\t\t\t\tfeedback.important = \"vertical\";\n\t\t\t\t}\n\t\t\t\toptions.using.call( this, props, feedback );\n\t\t\t};\n\t\t}\n\n\t\telem.offset( $.extend( position, { using: using } ) );\n\t});\n};\n\n$.ui.position = {\n\tfit: {\n\t\tleft: function( position, data ) {\n\t\t\tvar within = data.within,\n\t\t\t\twithinOffset = within.isWindow ? within.scrollLeft : within.offset.left,\n\t\t\t\touterWidth = within.width,\n\t\t\t\tcollisionPosLeft = position.left - data.collisionPosition.marginLeft,\n\t\t\t\toverLeft = withinOffset - collisionPosLeft,\n\t\t\t\toverRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset,\n\t\t\t\tnewOverRight;\n\n\t\t\t// element is wider than within\n\t\t\tif ( data.collisionWidth > outerWidth ) {\n\t\t\t\t// element is initially over the left side of within\n\t\t\t\tif ( overLeft > 0 && overRight <= 0 ) {\n\t\t\t\t\tnewOverRight = position.left + overLeft + data.collisionWidth - outerWidth - withinOffset;\n\t\t\t\t\tposition.left += overLeft - newOverRight;\n\t\t\t\t// element is initially over right side of within\n\t\t\t\t} else if ( overRight > 0 && overLeft <= 0 ) {\n\t\t\t\t\tposition.left = withinOffset;\n\t\t\t\t// element is initially over both left and right sides of within\n\t\t\t\t} else {\n\t\t\t\t\tif ( overLeft > overRight ) {\n\t\t\t\t\t\tposition.left = withinOffset + outerWidth - data.collisionWidth;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tposition.left = withinOffset;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t// too far left -> align with left edge\n\t\t\t} else if ( overLeft > 0 ) {\n\t\t\t\tposition.left += overLeft;\n\t\t\t// too far right -> align with right edge\n\t\t\t} else if ( overRight > 0 ) {\n\t\t\t\tposition.left -= overRight;\n\t\t\t// adjust based on position and margin\n\t\t\t} else {\n\t\t\t\tposition.left = max( position.left - collisionPosLeft, position.left );\n\t\t\t}\n\t\t},\n\t\ttop: function( position, data ) {\n\t\t\tvar within = data.within,\n\t\t\t\twithinOffset = within.isWindow ? within.scrollTop : within.offset.top,\n\t\t\t\touterHeight = data.within.height,\n\t\t\t\tcollisionPosTop = position.top - data.collisionPosition.marginTop,\n\t\t\t\toverTop = withinOffset - collisionPosTop,\n\t\t\t\toverBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset,\n\t\t\t\tnewOverBottom;\n\n\t\t\t// element is taller than within\n\t\t\tif ( data.collisionHeight > outerHeight ) {\n\t\t\t\t// element is initially over the top of within\n\t\t\t\tif ( overTop > 0 && overBottom <= 0 ) {\n\t\t\t\t\tnewOverBottom = position.top + overTop + data.collisionHeight - outerHeight - withinOffset;\n\t\t\t\t\tposition.top += overTop - newOverBottom;\n\t\t\t\t// element is initially over bottom of within\n\t\t\t\t} else if ( overBottom > 0 && overTop <= 0 ) {\n\t\t\t\t\tposition.top = withinOffset;\n\t\t\t\t// element is initially over both top and bottom of within\n\t\t\t\t} else {\n\t\t\t\t\tif ( overTop > overBottom ) {\n\t\t\t\t\t\tposition.top = withinOffset + outerHeight - data.collisionHeight;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tposition.top = withinOffset;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t// too far up -> align with top\n\t\t\t} else if ( overTop > 0 ) {\n\t\t\t\tposition.top += overTop;\n\t\t\t// too far down -> align with bottom edge\n\t\t\t} else if ( overBottom > 0 ) {\n\t\t\t\tposition.top -= overBottom;\n\t\t\t// adjust based on position and margin\n\t\t\t} else {\n\t\t\t\tposition.top = max( position.top - collisionPosTop, position.top );\n\t\t\t}\n\t\t}\n\t},\n\tflip: {\n\t\tleft: function( position, data ) {\n\t\t\tvar within = data.within,\n\t\t\t\twithinOffset = within.offset.left + within.scrollLeft,\n\t\t\t\touterWidth = within.width,\n\t\t\t\toffsetLeft = within.isWindow ? within.scrollLeft : within.offset.left,\n\t\t\t\tcollisionPosLeft = position.left - data.collisionPosition.marginLeft,\n\t\t\t\toverLeft = collisionPosLeft - offsetLeft,\n\t\t\t\toverRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft,\n\t\t\t\tmyOffset = data.my[ 0 ] === \"left\" ?\n\t\t\t\t\t-data.elemWidth :\n\t\t\t\t\tdata.my[ 0 ] === \"right\" ?\n\t\t\t\t\t\tdata.elemWidth :\n\t\t\t\t\t\t0,\n\t\t\t\tatOffset = data.at[ 0 ] === \"left\" ?\n\t\t\t\t\tdata.targetWidth :\n\t\t\t\t\tdata.at[ 0 ] === \"right\" ?\n\t\t\t\t\t\t-data.targetWidth :\n\t\t\t\t\t\t0,\n\t\t\t\toffset = -2 * data.offset[ 0 ],\n\t\t\t\tnewOverRight,\n\t\t\t\tnewOverLeft;\n\n\t\t\tif ( overLeft < 0 ) {\n\t\t\t\tnewOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth - outerWidth - withinOffset;\n\t\t\t\tif ( newOverRight < 0 || newOverRight < abs( overLeft ) ) {\n\t\t\t\t\tposition.left += myOffset + atOffset + offset;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if ( overRight > 0 ) {\n\t\t\t\tnewOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + atOffset + offset - offsetLeft;\n\t\t\t\tif ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) {\n\t\t\t\t\tposition.left += myOffset + atOffset + offset;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\ttop: function( position, data ) {\n\t\t\tvar within = data.within,\n\t\t\t\twithinOffset = within.offset.top + within.scrollTop,\n\t\t\t\touterHeight = within.height,\n\t\t\t\toffsetTop = within.isWindow ? within.scrollTop : within.offset.top,\n\t\t\t\tcollisionPosTop = position.top - data.collisionPosition.marginTop,\n\t\t\t\toverTop = collisionPosTop - offsetTop,\n\t\t\t\toverBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop,\n\t\t\t\ttop = data.my[ 1 ] === \"top\",\n\t\t\t\tmyOffset = top ?\n\t\t\t\t\t-data.elemHeight :\n\t\t\t\t\tdata.my[ 1 ] === \"bottom\" ?\n\t\t\t\t\t\tdata.elemHeight :\n\t\t\t\t\t\t0,\n\t\t\t\tatOffset = data.at[ 1 ] === \"top\" ?\n\t\t\t\t\tdata.targetHeight :\n\t\t\t\t\tdata.at[ 1 ] === \"bottom\" ?\n\t\t\t\t\t\t-data.targetHeight :\n\t\t\t\t\t\t0,\n\t\t\t\toffset = -2 * data.offset[ 1 ],\n\t\t\t\tnewOverTop,\n\t\t\t\tnewOverBottom;\n\t\t\tif ( overTop < 0 ) {\n\t\t\t\tnewOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight - outerHeight - withinOffset;\n\t\t\t\tif ( ( position.top + myOffset + atOffset + offset) > overTop && ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) ) {\n\t\t\t\t\tposition.top += myOffset + atOffset + offset;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if ( overBottom > 0 ) {\n\t\t\t\tnewOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset + offset - offsetTop;\n\t\t\t\tif ( ( position.top + myOffset + atOffset + offset) > overBottom && ( newOverTop > 0 || abs( newOverTop ) < overBottom ) ) {\n\t\t\t\t\tposition.top += myOffset + atOffset + offset;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\tflipfit: {\n\t\tleft: function() {\n\t\t\t$.ui.position.flip.left.apply( this, arguments );\n\t\t\t$.ui.position.fit.left.apply( this, arguments );\n\t\t},\n\t\ttop: function() {\n\t\t\t$.ui.position.flip.top.apply( this, arguments );\n\t\t\t$.ui.position.fit.top.apply( this, arguments );\n\t\t}\n\t}\n};\n\n// fraction support test\n(function () {\n\tvar testElement, testElementParent, testElementStyle, offsetLeft, i,\n\t\tbody = document.getElementsByTagName( \"body\" )[ 0 ],\n\t\tdiv = document.createElement( \"div\" );\n\n\t//Create a \"fake body\" for testing based on method used in jQuery.support\n\ttestElement = document.createElement( body ? \"div\" : \"body\" );\n\ttestElementStyle = {\n\t\tvisibility: \"hidden\",\n\t\twidth: 0,\n\t\theight: 0,\n\t\tborder: 0,\n\t\tmargin: 0,\n\t\tbackground: \"none\"\n\t};\n\tif ( body ) {\n\t\t$.extend( testElementStyle, {\n\t\t\tposition: \"absolute\",\n\t\t\tleft: \"-1000px\",\n\t\t\ttop: \"-1000px\"\n\t\t});\n\t}\n\tfor ( i in testElementStyle ) {\n\t\ttestElement.style[ i ] = testElementStyle[ i ];\n\t}\n\ttestElement.appendChild( div );\n\ttestElementParent = body || document.documentElement;\n\ttestElementParent.insertBefore( testElement, testElementParent.firstChild );\n\n\tdiv.style.cssText = \"position: absolute; left: 10.7432222px;\";\n\n\toffsetLeft = $( div ).offset().left;\n\t$.support.offsetFractions = offsetLeft > 10 && offsetLeft < 11;\n\n\ttestElement.innerHTML = \"\";\n\ttestElementParent.removeChild( testElement );\n})();\n\n}( jQuery ) );\n\n/*!\n * jQuery UI Button 1.10.4\n * http://jqueryui.com\n *\n * Copyright 2014 jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/button/\n *\n * Depends:\n *\tjquery.ui.core.js\n *\tjquery.ui.widget.js\n */\n(function( $, undefined ) {\n\nvar lastActive,\n\tbaseClasses = \"ui-button ui-widget ui-state-default ui-corner-all\",\n\ttypeClasses = \"ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only\",\n\tformResetHandler = function() {\n\t\tvar form = $( this );\n\t\tsetTimeout(function() {\n\t\t\tform.find( \":ui-button\" ).button( \"refresh\" );\n\t\t}, 1 );\n\t},\n\tradioGroup = function( radio ) {\n\t\tvar name = radio.name,\n\t\t\tform = radio.form,\n\t\t\tradios = $( [] );\n\t\tif ( name ) {\n\t\t\tname = name.replace( /'/g, \"\\\\'\" );\n\t\t\tif ( form ) {\n\t\t\t\tradios = $( form ).find( \"[name='\" + name + \"']\" );\n\t\t\t} else {\n\t\t\t\tradios = $( \"[name='\" + name + \"']\", radio.ownerDocument )\n\t\t\t\t\t.filter(function() {\n\t\t\t\t\t\treturn !this.form;\n\t\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\treturn radios;\n\t};\n\n$.widget( \"ui.button\", {\n\tversion: \"1.10.4\",\n\tdefaultElement: \"<button>\",\n\toptions: {\n\t\tdisabled: null,\n\t\ttext: true,\n\t\tlabel: null,\n\t\ticons: {\n\t\t\tprimary: null,\n\t\t\tsecondary: null\n\t\t}\n\t},\n\t_create: function() {\n\t\tthis.element.closest( \"form\" )\n\t\t\t.unbind( \"reset\" + this.eventNamespace )\n\t\t\t.bind( \"reset\" + this.eventNamespace, formResetHandler );\n\n\t\tif ( typeof this.options.disabled !== \"boolean\" ) {\n\t\t\tthis.options.disabled = !!this.element.prop( \"disabled\" );\n\t\t} else {\n\t\t\tthis.element.prop( \"disabled\", this.options.disabled );\n\t\t}\n\n\t\tthis._determineButtonType();\n\t\tthis.hasTitle = !!this.buttonElement.attr( \"title\" );\n\n\t\tvar that = this,\n\t\t\toptions = this.options,\n\t\t\ttoggleButton = this.type === \"checkbox\" || this.type === \"radio\",\n\t\t\tactiveClass = !toggleButton ? \"ui-state-active\" : \"\";\n\n\t\tif ( options.label === null ) {\n\t\t\toptions.label = (this.type === \"input\" ? this.buttonElement.val() : this.buttonElement.html());\n\t\t}\n\n\t\tthis._hoverable( this.buttonElement );\n\n\t\tthis.buttonElement\n\t\t\t.addClass( baseClasses )\n\t\t\t.attr( \"role\", \"button\" )\n\t\t\t.bind( \"mouseenter\" + this.eventNamespace, function() {\n\t\t\t\tif ( options.disabled ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif ( this === lastActive ) {\n\t\t\t\t\t$( this ).addClass( \"ui-state-active\" );\n\t\t\t\t}\n\t\t\t})\n\t\t\t.bind( \"mouseleave\" + this.eventNamespace, function() {\n\t\t\t\tif ( options.disabled ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t$( this ).removeClass( activeClass );\n\t\t\t})\n\t\t\t.bind( \"click\" + this.eventNamespace, function( event ) {\n\t\t\t\tif ( options.disabled ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t\t}\n\t\t\t});\n\n\t\t// Can't use _focusable() because the element that receives focus\n\t\t// and the element that gets the ui-state-focus class are different\n\t\tthis._on({\n\t\t\tfocus: function() {\n\t\t\t\tthis.buttonElement.addClass( \"ui-state-focus\" );\n\t\t\t},\n\t\t\tblur: function() {\n\t\t\t\tthis.buttonElement.removeClass( \"ui-state-focus\" );\n\t\t\t}\n\t\t});\n\n\t\tif ( toggleButton ) {\n\t\t\tthis.element.bind( \"change\" + this.eventNamespace, function() {\n\t\t\t\tthat.refresh();\n\t\t\t});\n\t\t}\n\n\t\tif ( this.type === \"checkbox\" ) {\n\t\t\tthis.buttonElement.bind( \"click\" + this.eventNamespace, function() {\n\t\t\t\tif ( options.disabled ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t} else if ( this.type === \"radio\" ) {\n\t\t\tthis.buttonElement.bind( \"click\" + this.eventNamespace, function() {\n\t\t\t\tif ( options.disabled ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\t$( this ).addClass( \"ui-state-active\" );\n\t\t\t\tthat.buttonElement.attr( \"aria-pressed\", \"true\" );\n\n\t\t\t\tvar radio = that.element[ 0 ];\n\t\t\t\tradioGroup( radio )\n\t\t\t\t\t.not( radio )\n\t\t\t\t\t.map(function() {\n\t\t\t\t\t\treturn $( this ).button( \"widget\" )[ 0 ];\n\t\t\t\t\t})\n\t\t\t\t\t.removeClass( \"ui-state-active\" )\n\t\t\t\t\t.attr( \"aria-pressed\", \"false\" );\n\t\t\t});\n\t\t} else {\n\t\t\tthis.buttonElement\n\t\t\t\t.bind( \"mousedown\" + this.eventNamespace, function() {\n\t\t\t\t\tif ( options.disabled ) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\t$( this ).addClass( \"ui-state-active\" );\n\t\t\t\t\tlastActive = this;\n\t\t\t\t\tthat.document.one( \"mouseup\", function() {\n\t\t\t\t\t\tlastActive = null;\n\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t\t.bind( \"mouseup\" + this.eventNamespace, function() {\n\t\t\t\t\tif ( options.disabled ) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\t$( this ).removeClass( \"ui-state-active\" );\n\t\t\t\t})\n\t\t\t\t.bind( \"keydown\" + this.eventNamespace, function(event) {\n\t\t\t\t\tif ( options.disabled ) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif ( event.keyCode === $.ui.keyCode.SPACE || event.keyCode === $.ui.keyCode.ENTER ) {\n\t\t\t\t\t\t$( this ).addClass( \"ui-state-active\" );\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t// see #8559, we bind to blur here in case the button element loses\n\t\t\t\t// focus between keydown and keyup, it would be left in an \"active\" state\n\t\t\t\t.bind( \"keyup\" + this.eventNamespace + \" blur\" + this.eventNamespace, function() {\n\t\t\t\t\t$( this ).removeClass( \"ui-state-active\" );\n\t\t\t\t});\n\n\t\t\tif ( this.buttonElement.is(\"a\") ) {\n\t\t\t\tthis.buttonElement.keyup(function(event) {\n\t\t\t\t\tif ( event.keyCode === $.ui.keyCode.SPACE ) {\n\t\t\t\t\t\t// TODO pass through original event correctly (just as 2nd argument doesn't work)\n\t\t\t\t\t\t$( this ).click();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// TODO: pull out $.Widget's handling for the disabled option into\n\t\t// $.Widget.prototype._setOptionDisabled so it's easy to proxy and can\n\t\t// be overridden by individual plugins\n\t\tthis._setOption( \"disabled\", options.disabled );\n\t\tthis._resetButton();\n\t},\n\n\t_determineButtonType: function() {\n\t\tvar ancestor, labelSelector, checked;\n\n\t\tif ( this.element.is(\"[type=checkbox]\") ) {\n\t\t\tthis.type = \"checkbox\";\n\t\t} else if ( this.element.is(\"[type=radio]\") ) {\n\t\t\tthis.type = \"radio\";\n\t\t} else if ( this.element.is(\"input\") ) {\n\t\t\tthis.type = \"input\";\n\t\t} else {\n\t\t\tthis.type = \"button\";\n\t\t}\n\n\t\tif ( this.type === \"checkbox\" || this.type === \"radio\" ) {\n\t\t\t// we don't search against the document in case the element\n\t\t\t// is disconnected from the DOM\n\t\t\tancestor = this.element.parents().last();\n\t\t\tlabelSelector = \"label[for='\" + this.element.attr(\"id\") + \"']\";\n\t\t\tthis.buttonElement = ancestor.find( labelSelector );\n\t\t\tif ( !this.buttonElement.length ) {\n\t\t\t\tancestor = ancestor.length ? ancestor.siblings() : this.element.siblings();\n\t\t\t\tthis.buttonElement = ancestor.filter( labelSelector );\n\t\t\t\tif ( !this.buttonElement.length ) {\n\t\t\t\t\tthis.buttonElement = ancestor.find( labelSelector );\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.element.addClass( \"ui-helper-hidden-accessible\" );\n\n\t\t\tchecked = this.element.is( \":checked\" );\n\t\t\tif ( checked ) {\n\t\t\t\tthis.buttonElement.addClass( \"ui-state-active\" );\n\t\t\t}\n\t\t\tthis.buttonElement.prop( \"aria-pressed\", checked );\n\t\t} else {\n\t\t\tthis.buttonElement = this.element;\n\t\t}\n\t},\n\n\twidget: function() {\n\t\treturn this.buttonElement;\n\t},\n\n\t_destroy: function() {\n\t\tthis.element\n\t\t\t.removeClass( \"ui-helper-hidden-accessible\" );\n\t\tthis.buttonElement\n\t\t\t.removeClass( baseClasses + \" ui-state-active \" + typeClasses )\n\t\t\t.removeAttr( \"role\" )\n\t\t\t.removeAttr( \"aria-pressed\" )\n\t\t\t.html( this.buttonElement.find(\".ui-button-text\").html() );\n\n\t\tif ( !this.hasTitle ) {\n\t\t\tthis.buttonElement.removeAttr( \"title\" );\n\t\t}\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tthis._super( key, value );\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis.element.prop( \"disabled\", !!value );\n\t\t\tif ( value ) {\n\t\t\t\tthis.buttonElement.removeClass( \"ui-state-focus\" );\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tthis._resetButton();\n\t},\n\n\trefresh: function() {\n\t\t//See #8237 & #8828\n\t\tvar isDisabled = this.element.is( \"input, button\" ) ? this.element.is( \":disabled\" ) : this.element.hasClass( \"ui-button-disabled\" );\n\n\t\tif ( isDisabled !== this.options.disabled ) {\n\t\t\tthis._setOption( \"disabled\", isDisabled );\n\t\t}\n\t\tif ( this.type === \"radio\" ) {\n\t\t\tradioGroup( this.element[0] ).each(function() {\n\t\t\t\tif ( $( this ).is( \":checked\" ) ) {\n\t\t\t\t\t$( this ).button( \"widget\" )\n\t\t\t\t\t\t.addClass( \"ui-state-active\" )\n\t\t\t\t\t\t.attr( \"aria-pressed\", \"true\" );\n\t\t\t\t} else {\n\t\t\t\t\t$( this ).button( \"widget\" )\n\t\t\t\t\t\t.removeClass( \"ui-state-active\" )\n\t\t\t\t\t\t.attr( \"aria-pressed\", \"false\" );\n\t\t\t\t}\n\t\t\t});\n\t\t} else if ( this.type === \"checkbox\" ) {\n\t\t\tif ( this.element.is( \":checked\" ) ) {\n\t\t\t\tthis.buttonElement\n\t\t\t\t\t.addClass( \"ui-state-active\" )\n\t\t\t\t\t.attr( \"aria-pressed\", \"true\" );\n\t\t\t} else {\n\t\t\t\tthis.buttonElement\n\t\t\t\t\t.removeClass( \"ui-state-active\" )\n\t\t\t\t\t.attr( \"aria-pressed\", \"false\" );\n\t\t\t}\n\t\t}\n\t},\n\n\t_resetButton: function() {\n\t\tif ( this.type === \"input\" ) {\n\t\t\tif ( this.options.label ) {\n\t\t\t\tthis.element.val( this.options.label );\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tvar buttonElement = this.buttonElement.removeClass( typeClasses ),\n\t\t\tbuttonText = $( \"<span></span>\", this.document[0] )\n\t\t\t\t.addClass( \"ui-button-text\" )\n\t\t\t\t.html( this.options.label )\n\t\t\t\t.appendTo( buttonElement.empty() )\n\t\t\t\t.text(),\n\t\t\ticons = this.options.icons,\n\t\t\tmultipleIcons = icons.primary && icons.secondary,\n\t\t\tbuttonClasses = [];\n\n\t\tif ( icons.primary || icons.secondary ) {\n\t\t\tif ( this.options.text ) {\n\t\t\t\tbuttonClasses.push( \"ui-button-text-icon\" + ( multipleIcons ? \"s\" : ( icons.primary ? \"-primary\" : \"-secondary\" ) ) );\n\t\t\t}\n\n\t\t\tif ( icons.primary ) {\n\t\t\t\tbuttonElement.prepend( \"<span class='ui-button-icon-primary ui-icon \" + icons.primary + \"'></span>\" );\n\t\t\t}\n\n\t\t\tif ( icons.secondary ) {\n\t\t\t\tbuttonElement.append( \"<span class='ui-button-icon-secondary ui-icon \" + icons.secondary + \"'></span>\" );\n\t\t\t}\n\n\t\t\tif ( !this.options.text ) {\n\t\t\t\tbuttonClasses.push( multipleIcons ? \"ui-button-icons-only\" : \"ui-button-icon-only\" );\n\n\t\t\t\tif ( !this.hasTitle ) {\n\t\t\t\t\tbuttonElement.attr( \"title\", $.trim( buttonText ) );\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tbuttonClasses.push( \"ui-button-text-only\" );\n\t\t}\n\t\tbuttonElement.addClass( buttonClasses.join( \" \" ) );\n\t}\n});\n\n$.widget( \"ui.buttonset\", {\n\tversion: \"1.10.4\",\n\toptions: {\n\t\titems: \"button, input[type=button], input[type=submit], input[type=reset], input[type=checkbox], input[type=radio], a, :data(ui-button)\"\n\t},\n\n\t_create: function() {\n\t\tthis.element.addClass( \"ui-buttonset\" );\n\t},\n\n\t_init: function() {\n\t\tthis.refresh();\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis.buttons.button( \"option\", key, value );\n\t\t}\n\n\t\tthis._super( key, value );\n\t},\n\n\trefresh: function() {\n\t\tvar rtl = this.element.css( \"direction\" ) === \"rtl\";\n\n\t\tthis.buttons = this.element.find( this.options.items )\n\t\t\t.filter( \":ui-button\" )\n\t\t\t\t.button( \"refresh\" )\n\t\t\t.end()\n\t\t\t.not( \":ui-button\" )\n\t\t\t\t.button()\n\t\t\t.end()\n\t\t\t.map(function() {\n\t\t\t\treturn $( this ).button( \"widget\" )[ 0 ];\n\t\t\t})\n\t\t\t\t.removeClass( \"ui-corner-all ui-corner-left ui-corner-right\" )\n\t\t\t\t.filter( \":first\" )\n\t\t\t\t\t.addClass( rtl ? \"ui-corner-right\" : \"ui-corner-left\" )\n\t\t\t\t.end()\n\t\t\t\t.filter( \":last\" )\n\t\t\t\t\t.addClass( rtl ? \"ui-corner-left\" : \"ui-corner-right\" )\n\t\t\t\t.end()\n\t\t\t.end();\n\t},\n\n\t_destroy: function() {\n\t\tthis.element.removeClass( \"ui-buttonset\" );\n\t\tthis.buttons\n\t\t\t.map(function() {\n\t\t\t\treturn $( this ).button( \"widget\" )[ 0 ];\n\t\t\t})\n\t\t\t\t.removeClass( \"ui-corner-left ui-corner-right\" )\n\t\t\t.end()\n\t\t\t.button( \"destroy\" );\n\t}\n});\n\n}( jQuery ) );\n\n/*!\n * jQuery UI Slider 1.10.4\n * http://jqueryui.com\n *\n * Copyright 2014 jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/slider/\n *\n * Depends:\n *\tjquery.ui.core.js\n *\tjquery.ui.mouse.js\n *\tjquery.ui.widget.js\n */\n(function( $, undefined ) {\n\n// number of pages in a slider\n// (how many times can you page up/down to go through the whole range)\nvar numPages = 5;\n\n$.widget( \"ui.slider\", $.ui.mouse, {\n\tversion: \"1.10.4\",\n\twidgetEventPrefix: \"slide\",\n\n\toptions: {\n\t\tanimate: false,\n\t\tdistance: 0,\n\t\tmax: 100,\n\t\tmin: 0,\n\t\torientation: \"horizontal\",\n\t\trange: false,\n\t\tstep: 1,\n\t\tvalue: 0,\n\t\tvalues: null,\n\n\t\t// callbacks\n\t\tchange: null,\n\t\tslide: null,\n\t\tstart: null,\n\t\tstop: null\n\t},\n\n\t_create: function() {\n\t\tthis._keySliding = false;\n\t\tthis._mouseSliding = false;\n\t\tthis._animateOff = true;\n\t\tthis._handleIndex = null;\n\t\tthis._detectOrientation();\n\t\tthis._mouseInit();\n\n\t\tthis.element\n\t\t\t.addClass( \"ui-slider\" +\n\t\t\t\t\" ui-slider-\" + this.orientation +\n\t\t\t\t\" ui-widget\" +\n\t\t\t\t\" ui-widget-content\" +\n\t\t\t\t\" ui-corner-all\");\n\n\t\tthis._refresh();\n\t\tthis._setOption( \"disabled\", this.options.disabled );\n\n\t\tthis._animateOff = false;\n\t},\n\n\t_refresh: function() {\n\t\tthis._createRange();\n\t\tthis._createHandles();\n\t\tthis._setupEvents();\n\t\tthis._refreshValue();\n\t},\n\n\t_createHandles: function() {\n\t\tvar i, handleCount,\n\t\t\toptions = this.options,\n\t\t\texistingHandles = this.element.find( \".ui-slider-handle\" ).addClass( \"ui-state-default ui-corner-all\" ),\n\t\t\thandle = \"<a class='ui-slider-handle ui-state-default ui-corner-all' href='#'></a>\",\n\t\t\thandles = [];\n\n\t\thandleCount = ( options.values && options.values.length ) || 1;\n\n\t\tif ( existingHandles.length > handleCount ) {\n\t\t\texistingHandles.slice( handleCount ).remove();\n\t\t\texistingHandles = existingHandles.slice( 0, handleCount );\n\t\t}\n\n\t\tfor ( i = existingHandles.length; i < handleCount; i++ ) {\n\t\t\thandles.push( handle );\n\t\t}\n\n\t\tthis.handles = existingHandles.add( $( handles.join( \"\" ) ).appendTo( this.element ) );\n\n\t\tthis.handle = this.handles.eq( 0 );\n\n\t\tthis.handles.each(function( i ) {\n\t\t\t$( this ).data( \"ui-slider-handle-index\", i );\n\t\t});\n\t},\n\n\t_createRange: function() {\n\t\tvar options = this.options,\n\t\t\tclasses = \"\";\n\n\t\tif ( options.range ) {\n\t\t\tif ( options.range === true ) {\n\t\t\t\tif ( !options.values ) {\n\t\t\t\t\toptions.values = [ this._valueMin(), this._valueMin() ];\n\t\t\t\t} else if ( options.values.length && options.values.length !== 2 ) {\n\t\t\t\t\toptions.values = [ options.values[0], options.values[0] ];\n\t\t\t\t} else if ( $.isArray( options.values ) ) {\n\t\t\t\t\toptions.values = options.values.slice(0);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( !this.range || !this.range.length ) {\n\t\t\t\tthis.range = $( \"<div></div>\" )\n\t\t\t\t\t.appendTo( this.element );\n\n\t\t\t\tclasses = \"ui-slider-range\" +\n\t\t\t\t// note: this isn't the most fittingly semantic framework class for this element,\n\t\t\t\t// but worked best visually with a variety of themes\n\t\t\t\t\" ui-widget-header ui-corner-all\";\n\t\t\t} else {\n\t\t\t\tthis.range.removeClass( \"ui-slider-range-min ui-slider-range-max\" )\n\t\t\t\t\t// Handle range switching from true to min/max\n\t\t\t\t\t.css({\n\t\t\t\t\t\t\"left\": \"\",\n\t\t\t\t\t\t\"bottom\": \"\"\n\t\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis.range.addClass( classes +\n\t\t\t\t( ( options.range === \"min\" || options.range === \"max\" ) ? \" ui-slider-range-\" + options.range : \"\" ) );\n\t\t} else {\n\t\t\tif ( this.range ) {\n\t\t\t\tthis.range.remove();\n\t\t\t}\n\t\t\tthis.range = null;\n\t\t}\n\t},\n\n\t_setupEvents: function() {\n\t\tvar elements = this.handles.add( this.range ).filter( \"a\" );\n\t\tthis._off( elements );\n\t\tthis._on( elements, this._handleEvents );\n\t\tthis._hoverable( elements );\n\t\tthis._focusable( elements );\n\t},\n\n\t_destroy: function() {\n\t\tthis.handles.remove();\n\t\tif ( this.range ) {\n\t\t\tthis.range.remove();\n\t\t}\n\n\t\tthis.element\n\t\t\t.removeClass( \"ui-slider\" +\n\t\t\t\t\" ui-slider-horizontal\" +\n\t\t\t\t\" ui-slider-vertical\" +\n\t\t\t\t\" ui-widget\" +\n\t\t\t\t\" ui-widget-content\" +\n\t\t\t\t\" ui-corner-all\" );\n\n\t\tthis._mouseDestroy();\n\t},\n\n\t_mouseCapture: function( event ) {\n\t\tvar position, normValue, distance, closestHandle, index, allowed, offset, mouseOverHandle,\n\t\t\tthat = this,\n\t\t\to = this.options;\n\n\t\tif ( o.disabled ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tthis.elementSize = {\n\t\t\twidth: this.element.outerWidth(),\n\t\t\theight: this.element.outerHeight()\n\t\t};\n\t\tthis.elementOffset = this.element.offset();\n\n\t\tposition = { x: event.pageX, y: event.pageY };\n\t\tnormValue = this._normValueFromMouse( position );\n\t\tdistance = this._valueMax() - this._valueMin() + 1;\n\t\tthis.handles.each(function( i ) {\n\t\t\tvar thisDistance = Math.abs( normValue - that.values(i) );\n\t\t\tif (( distance > thisDistance ) ||\n\t\t\t\t( distance === thisDistance &&\n\t\t\t\t\t(i === that._lastChangedValue || that.values(i) === o.min ))) {\n\t\t\t\tdistance = thisDistance;\n\t\t\t\tclosestHandle = $( this );\n\t\t\t\tindex = i;\n\t\t\t}\n\t\t});\n\n\t\tallowed = this._start( event, index );\n\t\tif ( allowed === false ) {\n\t\t\treturn false;\n\t\t}\n\t\tthis._mouseSliding = true;\n\n\t\tthis._handleIndex = index;\n\n\t\tclosestHandle\n\t\t\t.addClass( \"ui-state-active\" )\n\t\t\t.focus();\n\n\t\toffset = closestHandle.offset();\n\t\tmouseOverHandle = !$( event.target ).parents().addBack().is( \".ui-slider-handle\" );\n\t\tthis._clickOffset = mouseOverHandle ? { left: 0, top: 0 } : {\n\t\t\tleft: event.pageX - offset.left - ( closestHandle.width() / 2 ),\n\t\t\ttop: event.pageY - offset.top -\n\t\t\t\t( closestHandle.height() / 2 ) -\n\t\t\t\t( parseInt( closestHandle.css(\"borderTopWidth\"), 10 ) || 0 ) -\n\t\t\t\t( parseInt( closestHandle.css(\"borderBottomWidth\"), 10 ) || 0) +\n\t\t\t\t( parseInt( closestHandle.css(\"marginTop\"), 10 ) || 0)\n\t\t};\n\n\t\tif ( !this.handles.hasClass( \"ui-state-hover\" ) ) {\n\t\t\tthis._slide( event, index, normValue );\n\t\t}\n\t\tthis._animateOff = true;\n\t\treturn true;\n\t},\n\n\t_mouseStart: function() {\n\t\treturn true;\n\t},\n\n\t_mouseDrag: function( event ) {\n\t\tvar position = { x: event.pageX, y: event.pageY },\n\t\t\tnormValue = this._normValueFromMouse( position );\n\n\t\tthis._slide( event, this._handleIndex, normValue );\n\n\t\treturn false;\n\t},\n\n\t_mouseStop: function( event ) {\n\t\tthis.handles.removeClass( \"ui-state-active\" );\n\t\tthis._mouseSliding = false;\n\n\t\tthis._stop( event, this._handleIndex );\n\t\tthis._change( event, this._handleIndex );\n\n\t\tthis._handleIndex = null;\n\t\tthis._clickOffset = null;\n\t\tthis._animateOff = false;\n\n\t\treturn false;\n\t},\n\n\t_detectOrientation: function() {\n\t\tthis.orientation = ( this.options.orientation === \"vertical\" ) ? \"vertical\" : \"horizontal\";\n\t},\n\n\t_normValueFromMouse: function( position ) {\n\t\tvar pixelTotal,\n\t\t\tpixelMouse,\n\t\t\tpercentMouse,\n\t\t\tvalueTotal,\n\t\t\tvalueMouse;\n\n\t\tif ( this.orientation === \"horizontal\" ) {\n\t\t\tpixelTotal = this.elementSize.width;\n\t\t\tpixelMouse = position.x - this.elementOffset.left - ( this._clickOffset ? this._clickOffset.left : 0 );\n\t\t} else {\n\t\t\tpixelTotal = this.elementSize.height;\n\t\t\tpixelMouse = position.y - this.elementOffset.top - ( this._clickOffset ? this._clickOffset.top : 0 );\n\t\t}\n\n\t\tpercentMouse = ( pixelMouse / pixelTotal );\n\t\tif ( percentMouse > 1 ) {\n\t\t\tpercentMouse = 1;\n\t\t}\n\t\tif ( percentMouse < 0 ) {\n\t\t\tpercentMouse = 0;\n\t\t}\n\t\tif ( this.orientation === \"vertical\" ) {\n\t\t\tpercentMouse = 1 - percentMouse;\n\t\t}\n\n\t\tvalueTotal = this._valueMax() - this._valueMin();\n\t\tvalueMouse = this._valueMin() + percentMouse * valueTotal;\n\n\t\treturn this._trimAlignValue( valueMouse );\n\t},\n\n\t_start: function( event, index ) {\n\t\tvar uiHash = {\n\t\t\thandle: this.handles[ index ],\n\t\t\tvalue: this.value()\n\t\t};\n\t\tif ( this.options.values && this.options.values.length ) {\n\t\t\tuiHash.value = this.values( index );\n\t\t\tuiHash.values = this.values();\n\t\t}\n\t\treturn this._trigger( \"start\", event, uiHash );\n\t},\n\n\t_slide: function( event, index, newVal ) {\n\t\tvar otherVal,\n\t\t\tnewValues,\n\t\t\tallowed;\n\n\t\tif ( this.options.values && this.options.values.length ) {\n\t\t\totherVal = this.values( index ? 0 : 1 );\n\n\t\t\tif ( ( this.options.values.length === 2 && this.options.range === true ) &&\n\t\t\t\t\t( ( index === 0 && newVal > otherVal) || ( index === 1 && newVal < otherVal ) )\n\t\t\t\t) {\n\t\t\t\tnewVal = otherVal;\n\t\t\t}\n\n\t\t\tif ( newVal !== this.values( index ) ) {\n\t\t\t\tnewValues = this.values();\n\t\t\t\tnewValues[ index ] = newVal;\n\t\t\t\t// A slide can be canceled by returning false from the slide callback\n\t\t\t\tallowed = this._trigger( \"slide\", event, {\n\t\t\t\t\thandle: this.handles[ index ],\n\t\t\t\t\tvalue: newVal,\n\t\t\t\t\tvalues: newValues\n\t\t\t\t} );\n\t\t\t\totherVal = this.values( index ? 0 : 1 );\n\t\t\t\tif ( allowed !== false ) {\n\t\t\t\t\tthis.values( index, newVal );\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif ( newVal !== this.value() ) {\n\t\t\t\t// A slide can be canceled by returning false from the slide callback\n\t\t\t\tallowed = this._trigger( \"slide\", event, {\n\t\t\t\t\thandle: this.handles[ index ],\n\t\t\t\t\tvalue: newVal\n\t\t\t\t} );\n\t\t\t\tif ( allowed !== false ) {\n\t\t\t\t\tthis.value( newVal );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t_stop: function( event, index ) {\n\t\tvar uiHash = {\n\t\t\thandle: this.handles[ index ],\n\t\t\tvalue: this.value()\n\t\t};\n\t\tif ( this.options.values && this.options.values.length ) {\n\t\t\tuiHash.value = this.values( index );\n\t\t\tuiHash.values = this.values();\n\t\t}\n\n\t\tthis._trigger( \"stop\", event, uiHash );\n\t},\n\n\t_change: function( event, index ) {\n\t\tif ( !this._keySliding && !this._mouseSliding ) {\n\t\t\tvar uiHash = {\n\t\t\t\thandle: this.handles[ index ],\n\t\t\t\tvalue: this.value()\n\t\t\t};\n\t\t\tif ( this.options.values && this.options.values.length ) {\n\t\t\t\tuiHash.value = this.values( index );\n\t\t\t\tuiHash.values = this.values();\n\t\t\t}\n\n\t\t\t//store the last changed value index for reference when handles overlap\n\t\t\tthis._lastChangedValue = index;\n\n\t\t\tthis._trigger( \"change\", event, uiHash );\n\t\t}\n\t},\n\n\tvalue: function( newValue ) {\n\t\tif ( arguments.length ) {\n\t\t\tthis.options.value = this._trimAlignValue( newValue );\n\t\t\tthis._refreshValue();\n\t\t\tthis._change( null, 0 );\n\t\t\treturn;\n\t\t}\n\n\t\treturn this._value();\n\t},\n\n\tvalues: function( index, newValue ) {\n\t\tvar vals,\n\t\t\tnewValues,\n\t\t\ti;\n\n\t\tif ( arguments.length > 1 ) {\n\t\t\tthis.options.values[ index ] = this._trimAlignValue( newValue );\n\t\t\tthis._refreshValue();\n\t\t\tthis._change( null, index );\n\t\t\treturn;\n\t\t}\n\n\t\tif ( arguments.length ) {\n\t\t\tif ( $.isArray( arguments[ 0 ] ) ) {\n\t\t\t\tvals = this.options.values;\n\t\t\t\tnewValues = arguments[ 0 ];\n\t\t\t\tfor ( i = 0; i < vals.length; i += 1 ) {\n\t\t\t\t\tvals[ i ] = this._trimAlignValue( newValues[ i ] );\n\t\t\t\t\tthis._change( null, i );\n\t\t\t\t}\n\t\t\t\tthis._refreshValue();\n\t\t\t} else {\n\t\t\t\tif ( this.options.values && this.options.values.length ) {\n\t\t\t\t\treturn this._values( index );\n\t\t\t\t} else {\n\t\t\t\t\treturn this.value();\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\treturn this._values();\n\t\t}\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tvar i,\n\t\t\tvalsLength = 0;\n\n\t\tif ( key === \"range\" && this.options.range === true ) {\n\t\t\tif ( value === \"min\" ) {\n\t\t\t\tthis.options.value = this._values( 0 );\n\t\t\t\tthis.options.values = null;\n\t\t\t} else if ( value === \"max\" ) {\n\t\t\t\tthis.options.value = this._values( this.options.values.length-1 );\n\t\t\t\tthis.options.values = null;\n\t\t\t}\n\t\t}\n\n\t\tif ( $.isArray( this.options.values ) ) {\n\t\t\tvalsLength = this.options.values.length;\n\t\t}\n\n\t\t$.Widget.prototype._setOption.apply( this, arguments );\n\n\t\tswitch ( key ) {\n\t\t\tcase \"orientation\":\n\t\t\t\tthis._detectOrientation();\n\t\t\t\tthis.element\n\t\t\t\t\t.removeClass( \"ui-slider-horizontal ui-slider-vertical\" )\n\t\t\t\t\t.addClass( \"ui-slider-\" + this.orientation );\n\t\t\t\tthis._refreshValue();\n\t\t\t\tbreak;\n\t\t\tcase \"value\":\n\t\t\t\tthis._animateOff = true;\n\t\t\t\tthis._refreshValue();\n\t\t\t\tthis._change( null, 0 );\n\t\t\t\tthis._animateOff = false;\n\t\t\t\tbreak;\n\t\t\tcase \"values\":\n\t\t\t\tthis._animateOff = true;\n\t\t\t\tthis._refreshValue();\n\t\t\t\tfor ( i = 0; i < valsLength; i += 1 ) {\n\t\t\t\t\tthis._change( null, i );\n\t\t\t\t}\n\t\t\t\tthis._animateOff = false;\n\t\t\t\tbreak;\n\t\t\tcase \"min\":\n\t\t\tcase \"max\":\n\t\t\t\tthis._animateOff = true;\n\t\t\t\tthis._refreshValue();\n\t\t\t\tthis._animateOff = false;\n\t\t\t\tbreak;\n\t\t\tcase \"range\":\n\t\t\t\tthis._animateOff = true;\n\t\t\t\tthis._refresh();\n\t\t\t\tthis._animateOff = false;\n\t\t\t\tbreak;\n\t\t}\n\t},\n\n\t//internal value getter\n\t// _value() returns value trimmed by min and max, aligned by step\n\t_value: function() {\n\t\tvar val = this.options.value;\n\t\tval = this._trimAlignValue( val );\n\n\t\treturn val;\n\t},\n\n\t//internal values getter\n\t// _values() returns array of values trimmed by min and max, aligned by step\n\t// _values( index ) returns single value trimmed by min and max, aligned by step\n\t_values: function( index ) {\n\t\tvar val,\n\t\t\tvals,\n\t\t\ti;\n\n\t\tif ( arguments.length ) {\n\t\t\tval = this.options.values[ index ];\n\t\t\tval = this._trimAlignValue( val );\n\n\t\t\treturn val;\n\t\t} else if ( this.options.values && this.options.values.length ) {\n\t\t\t// .slice() creates a copy of the array\n\t\t\t// this copy gets trimmed by min and max and then returned\n\t\t\tvals = this.options.values.slice();\n\t\t\tfor ( i = 0; i < vals.length; i+= 1) {\n\t\t\t\tvals[ i ] = this._trimAlignValue( vals[ i ] );\n\t\t\t}\n\n\t\t\treturn vals;\n\t\t} else {\n\t\t\treturn [];\n\t\t}\n\t},\n\n\t// returns the step-aligned value that val is closest to, between (inclusive) min and max\n\t_trimAlignValue: function( val ) {\n\t\tif ( val <= this._valueMin() ) {\n\t\t\treturn this._valueMin();\n\t\t}\n\t\tif ( val >= this._valueMax() ) {\n\t\t\treturn this._valueMax();\n\t\t}\n\t\tvar step = ( this.options.step > 0 ) ? this.options.step : 1,\n\t\t\tvalModStep = (val - this._valueMin()) % step,\n\t\t\talignValue = val - valModStep;\n\n\t\tif ( Math.abs(valModStep) * 2 >= step ) {\n\t\t\talignValue += ( valModStep > 0 ) ? step : ( -step );\n\t\t}\n\n\t\t// Since JavaScript has problems with large floats, round\n\t\t// the final value to 5 digits after the decimal point (see #4124)\n\t\treturn parseFloat( alignValue.toFixed(5) );\n\t},\n\n\t_valueMin: function() {\n\t\treturn this.options.min;\n\t},\n\n\t_valueMax: function() {\n\t\treturn this.options.max;\n\t},\n\n\t_refreshValue: function() {\n\t\tvar lastValPercent, valPercent, value, valueMin, valueMax,\n\t\t\toRange = this.options.range,\n\t\t\to = this.options,\n\t\t\tthat = this,\n\t\t\tanimate = ( !this._animateOff ) ? o.animate : false,\n\t\t\t_set = {};\n\n\t\tif ( this.options.values && this.options.values.length ) {\n\t\t\tthis.handles.each(function( i ) {\n\t\t\t\tvalPercent = ( that.values(i) - that._valueMin() ) / ( that._valueMax() - that._valueMin() ) * 100;\n\t\t\t\t_set[ that.orientation === \"horizontal\" ? \"left\" : \"bottom\" ] = valPercent + \"%\";\n\t\t\t\t$( this ).stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( _set, o.animate );\n\t\t\t\tif ( that.options.range === true ) {\n\t\t\t\t\tif ( that.orientation === \"horizontal\" ) {\n\t\t\t\t\t\tif ( i === 0 ) {\n\t\t\t\t\t\t\tthat.range.stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( { left: valPercent + \"%\" }, o.animate );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( i === 1 ) {\n\t\t\t\t\t\t\tthat.range[ animate ? \"animate\" : \"css\" ]( { width: ( valPercent - lastValPercent ) + \"%\" }, { queue: false, duration: o.animate } );\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif ( i === 0 ) {\n\t\t\t\t\t\t\tthat.range.stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( { bottom: ( valPercent ) + \"%\" }, o.animate );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( i === 1 ) {\n\t\t\t\t\t\t\tthat.range[ animate ? \"animate\" : \"css\" ]( { height: ( valPercent - lastValPercent ) + \"%\" }, { queue: false, duration: o.animate } );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tlastValPercent = valPercent;\n\t\t\t});\n\t\t} else {\n\t\t\tvalue = this.value();\n\t\t\tvalueMin = this._valueMin();\n\t\t\tvalueMax = this._valueMax();\n\t\t\tvalPercent = ( valueMax !== valueMin ) ?\n\t\t\t\t\t( value - valueMin ) / ( valueMax - valueMin ) * 100 :\n\t\t\t\t\t0;\n\t\t\t_set[ this.orientation === \"horizontal\" ? \"left\" : \"bottom\" ] = valPercent + \"%\";\n\t\t\tthis.handle.stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( _set, o.animate );\n\n\t\t\tif ( oRange === \"min\" && this.orientation === \"horizontal\" ) {\n\t\t\t\tthis.range.stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( { width: valPercent + \"%\" }, o.animate );\n\t\t\t}\n\t\t\tif ( oRange === \"max\" && this.orientation === \"horizontal\" ) {\n\t\t\t\tthis.range[ animate ? \"animate\" : \"css\" ]( { width: ( 100 - valPercent ) + \"%\" }, { queue: false, duration: o.animate } );\n\t\t\t}\n\t\t\tif ( oRange === \"min\" && this.orientation === \"vertical\" ) {\n\t\t\t\tthis.range.stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( { height: valPercent + \"%\" }, o.animate );\n\t\t\t}\n\t\t\tif ( oRange === \"max\" && this.orientation === \"vertical\" ) {\n\t\t\t\tthis.range[ animate ? \"animate\" : \"css\" ]( { height: ( 100 - valPercent ) + \"%\" }, { queue: false, duration: o.animate } );\n\t\t\t}\n\t\t}\n\t},\n\n\t_handleEvents: {\n\t\tkeydown: function( event ) {\n\t\t\tvar allowed, curVal, newVal, step,\n\t\t\t\tindex = $( event.target ).data( \"ui-slider-handle-index\" );\n\n\t\t\tswitch ( event.keyCode ) {\n\t\t\t\tcase $.ui.keyCode.HOME:\n\t\t\t\tcase $.ui.keyCode.END:\n\t\t\t\tcase $.ui.keyCode.PAGE_UP:\n\t\t\t\tcase $.ui.keyCode.PAGE_DOWN:\n\t\t\t\tcase $.ui.keyCode.UP:\n\t\t\t\tcase $.ui.keyCode.RIGHT:\n\t\t\t\tcase $.ui.keyCode.DOWN:\n\t\t\t\tcase $.ui.keyCode.LEFT:\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tif ( !this._keySliding ) {\n\t\t\t\t\t\tthis._keySliding = true;\n\t\t\t\t\t\t$( event.target ).addClass( \"ui-state-active\" );\n\t\t\t\t\t\tallowed = this._start( event, index );\n\t\t\t\t\t\tif ( allowed === false ) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tstep = this.options.step;\n\t\t\tif ( this.options.values && this.options.values.length ) {\n\t\t\t\tcurVal = newVal = this.values( index );\n\t\t\t} else {\n\t\t\t\tcurVal = newVal = this.value();\n\t\t\t}\n\n\t\t\tswitch ( event.keyCode ) {\n\t\t\t\tcase $.ui.keyCode.HOME:\n\t\t\t\t\tnewVal = this._valueMin();\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.END:\n\t\t\t\t\tnewVal = this._valueMax();\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.PAGE_UP:\n\t\t\t\t\tnewVal = this._trimAlignValue( curVal + ( (this._valueMax() - this._valueMin()) / numPages ) );\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.PAGE_DOWN:\n\t\t\t\t\tnewVal = this._trimAlignValue( curVal - ( (this._valueMax() - this._valueMin()) / numPages ) );\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.UP:\n\t\t\t\tcase $.ui.keyCode.RIGHT:\n\t\t\t\t\tif ( curVal === this._valueMax() ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tnewVal = this._trimAlignValue( curVal + step );\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.DOWN:\n\t\t\t\tcase $.ui.keyCode.LEFT:\n\t\t\t\t\tif ( curVal === this._valueMin() ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tnewVal = this._trimAlignValue( curVal - step );\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthis._slide( event, index, newVal );\n\t\t},\n\t\tclick: function( event ) {\n\t\t\tevent.preventDefault();\n\t\t},\n\t\tkeyup: function( event ) {\n\t\t\tvar index = $( event.target ).data( \"ui-slider-handle-index\" );\n\n\t\t\tif ( this._keySliding ) {\n\t\t\t\tthis._keySliding = false;\n\t\t\t\tthis._stop( event, index );\n\t\t\t\tthis._change( event, index );\n\t\t\t\t$( event.target ).removeClass( \"ui-state-active\" );\n\t\t\t}\n\t\t}\n\t}\n\n});\n\n}(jQuery));\n\n/*!\n * jQuery UI Effects 1.10.4\n * http://jqueryui.com\n *\n * Copyright 2014 jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/category/effects-core/\n */\n(function($, undefined) {\n\nvar dataSpace = \"ui-effects-\";\n\n$.effects = {\n\teffect: {}\n};\n\n/*!\n * jQuery Color Animations v2.1.2\n * https://github.com/jquery/jquery-color\n *\n * Copyright 2013 jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * Date: Wed Jan 16 08:47:09 2013 -0600\n */\n(function( jQuery, undefined ) {\n\n\tvar stepHooks = \"backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor\",\n\n\t// plusequals test for += 100 -= 100\n\trplusequals = /^([\\-+])=\\s*(\\d+\\.?\\d*)/,\n\t// a set of RE's that can match strings and generate color tuples.\n\tstringParsers = [{\n\t\t\tre: /rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*(?:,\\s*(\\d?(?:\\.\\d+)?)\\s*)?\\)/,\n\t\t\tparse: function( execResult ) {\n\t\t\t\treturn [\n\t\t\t\t\texecResult[ 1 ],\n\t\t\t\t\texecResult[ 2 ],\n\t\t\t\t\texecResult[ 3 ],\n\t\t\t\t\texecResult[ 4 ]\n\t\t\t\t];\n\t\t\t}\n\t\t}, {\n\t\t\tre: /rgba?\\(\\s*(\\d+(?:\\.\\d+)?)\\%\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*(?:,\\s*(\\d?(?:\\.\\d+)?)\\s*)?\\)/,\n\t\t\tparse: function( execResult ) {\n\t\t\t\treturn [\n\t\t\t\t\texecResult[ 1 ] * 2.55,\n\t\t\t\t\texecResult[ 2 ] * 2.55,\n\t\t\t\t\texecResult[ 3 ] * 2.55,\n\t\t\t\t\texecResult[ 4 ]\n\t\t\t\t];\n\t\t\t}\n\t\t}, {\n\t\t\t// this regex ignores A-F because it's compared against an already lowercased string\n\t\t\tre: /#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,\n\t\t\tparse: function( execResult ) {\n\t\t\t\treturn [\n\t\t\t\t\tparseInt( execResult[ 1 ], 16 ),\n\t\t\t\t\tparseInt( execResult[ 2 ], 16 ),\n\t\t\t\t\tparseInt( execResult[ 3 ], 16 )\n\t\t\t\t];\n\t\t\t}\n\t\t}, {\n\t\t\t// this regex ignores A-F because it's compared against an already lowercased string\n\t\t\tre: /#([a-f0-9])([a-f0-9])([a-f0-9])/,\n\t\t\tparse: function( execResult ) {\n\t\t\t\treturn [\n\t\t\t\t\tparseInt( execResult[ 1 ] + execResult[ 1 ], 16 ),\n\t\t\t\t\tparseInt( execResult[ 2 ] + execResult[ 2 ], 16 ),\n\t\t\t\t\tparseInt( execResult[ 3 ] + execResult[ 3 ], 16 )\n\t\t\t\t];\n\t\t\t}\n\t\t}, {\n\t\t\tre: /hsla?\\(\\s*(\\d+(?:\\.\\d+)?)\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*(?:,\\s*(\\d?(?:\\.\\d+)?)\\s*)?\\)/,\n\t\t\tspace: \"hsla\",\n\t\t\tparse: function( execResult ) {\n\t\t\t\treturn [\n\t\t\t\t\texecResult[ 1 ],\n\t\t\t\t\texecResult[ 2 ] / 100,\n\t\t\t\t\texecResult[ 3 ] / 100,\n\t\t\t\t\texecResult[ 4 ]\n\t\t\t\t];\n\t\t\t}\n\t\t}],\n\n\t// jQuery.Color( )\n\tcolor = jQuery.Color = function( color, green, blue, alpha ) {\n\t\treturn new jQuery.Color.fn.parse( color, green, blue, alpha );\n\t},\n\tspaces = {\n\t\trgba: {\n\t\t\tprops: {\n\t\t\t\tred: {\n\t\t\t\t\tidx: 0,\n\t\t\t\t\ttype: \"byte\"\n\t\t\t\t},\n\t\t\t\tgreen: {\n\t\t\t\t\tidx: 1,\n\t\t\t\t\ttype: \"byte\"\n\t\t\t\t},\n\t\t\t\tblue: {\n\t\t\t\t\tidx: 2,\n\t\t\t\t\ttype: \"byte\"\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\thsla: {\n\t\t\tprops: {\n\t\t\t\thue: {\n\t\t\t\t\tidx: 0,\n\t\t\t\t\ttype: \"degrees\"\n\t\t\t\t},\n\t\t\t\tsaturation: {\n\t\t\t\t\tidx: 1,\n\t\t\t\t\ttype: \"percent\"\n\t\t\t\t},\n\t\t\t\tlightness: {\n\t\t\t\t\tidx: 2,\n\t\t\t\t\ttype: \"percent\"\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\tpropTypes = {\n\t\t\"byte\": {\n\t\t\tfloor: true,\n\t\t\tmax: 255\n\t\t},\n\t\t\"percent\": {\n\t\t\tmax: 1\n\t\t},\n\t\t\"degrees\": {\n\t\t\tmod: 360,\n\t\t\tfloor: true\n\t\t}\n\t},\n\tsupport = color.support = {},\n\n\t// element for support tests\n\tsupportElem = jQuery( \"<p>\" )[ 0 ],\n\n\t// colors = jQuery.Color.names\n\tcolors,\n\n\t// local aliases of functions called often\n\teach = jQuery.each;\n\n// determine rgba support immediately\nsupportElem.style.cssText = \"background-color:rgba(1,1,1,.5)\";\nsupport.rgba = supportElem.style.backgroundColor.indexOf( \"rgba\" ) > -1;\n\n// define cache name and alpha properties\n// for rgba and hsla spaces\neach( spaces, function( spaceName, space ) {\n\tspace.cache = \"_\" + spaceName;\n\tspace.props.alpha = {\n\t\tidx: 3,\n\t\ttype: \"percent\",\n\t\tdef: 1\n\t};\n});\n\nfunction clamp( value, prop, allowEmpty ) {\n\tvar type = propTypes[ prop.type ] || {};\n\n\tif ( value == null ) {\n\t\treturn (allowEmpty || !prop.def) ? null : prop.def;\n\t}\n\n\t// ~~ is an short way of doing floor for positive numbers\n\tvalue = type.floor ? ~~value : parseFloat( value );\n\n\t// IE will pass in empty strings as value for alpha,\n\t// which will hit this case\n\tif ( isNaN( value ) ) {\n\t\treturn prop.def;\n\t}\n\n\tif ( type.mod ) {\n\t\t// we add mod before modding to make sure that negatives values\n\t\t// get converted properly: -10 -> 350\n\t\treturn (value + type.mod) % type.mod;\n\t}\n\n\t// for now all property types without mod have min and max\n\treturn 0 > value ? 0 : type.max < value ? type.max : value;\n}\n\nfunction stringParse( string ) {\n\tvar inst = color(),\n\t\trgba = inst._rgba = [];\n\n\tstring = string.toLowerCase();\n\n\teach( stringParsers, function( i, parser ) {\n\t\tvar parsed,\n\t\t\tmatch = parser.re.exec( string ),\n\t\t\tvalues = match && parser.parse( match ),\n\t\t\tspaceName = parser.space || \"rgba\";\n\n\t\tif ( values ) {\n\t\t\tparsed = inst[ spaceName ]( values );\n\n\t\t\t// if this was an rgba parse the assignment might happen twice\n\t\t\t// oh well....\n\t\t\tinst[ spaces[ spaceName ].cache ] = parsed[ spaces[ spaceName ].cache ];\n\t\t\trgba = inst._rgba = parsed._rgba;\n\n\t\t\t// exit each( stringParsers ) here because we matched\n\t\t\treturn false;\n\t\t}\n\t});\n\n\t// Found a stringParser that handled it\n\tif ( rgba.length ) {\n\n\t\t// if this came from a parsed string, force \"transparent\" when alpha is 0\n\t\t// chrome, (and maybe others) return \"transparent\" as rgba(0,0,0,0)\n\t\tif ( rgba.join() === \"0,0,0,0\" ) {\n\t\t\tjQuery.extend( rgba, colors.transparent );\n\t\t}\n\t\treturn inst;\n\t}\n\n\t// named colors\n\treturn colors[ string ];\n}\n\ncolor.fn = jQuery.extend( color.prototype, {\n\tparse: function( red, green, blue, alpha ) {\n\t\tif ( red === undefined ) {\n\t\t\tthis._rgba = [ null, null, null, null ];\n\t\t\treturn this;\n\t\t}\n\t\tif ( red.jquery || red.nodeType ) {\n\t\t\tred = jQuery( red ).css( green );\n\t\t\tgreen = undefined;\n\t\t}\n\n\t\tvar inst = this,\n\t\t\ttype = jQuery.type( red ),\n\t\t\trgba = this._rgba = [];\n\n\t\t// more than 1 argument specified - assume ( red, green, blue, alpha )\n\t\tif ( green !== undefined ) {\n\t\t\tred = [ red, green, blue, alpha ];\n\t\t\ttype = \"array\";\n\t\t}\n\n\t\tif ( type === \"string\" ) {\n\t\t\treturn this.parse( stringParse( red ) || colors._default );\n\t\t}\n\n\t\tif ( type === \"array\" ) {\n\t\t\teach( spaces.rgba.props, function( key, prop ) {\n\t\t\t\trgba[ prop.idx ] = clamp( red[ prop.idx ], prop );\n\t\t\t});\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( type === \"object\" ) {\n\t\t\tif ( red instanceof color ) {\n\t\t\t\teach( spaces, function( spaceName, space ) {\n\t\t\t\t\tif ( red[ space.cache ] ) {\n\t\t\t\t\t\tinst[ space.cache ] = red[ space.cache ].slice();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\teach( spaces, function( spaceName, space ) {\n\t\t\t\t\tvar cache = space.cache;\n\t\t\t\t\teach( space.props, function( key, prop ) {\n\n\t\t\t\t\t\t// if the cache doesn't exist, and we know how to convert\n\t\t\t\t\t\tif ( !inst[ cache ] && space.to ) {\n\n\t\t\t\t\t\t\t// if the value was null, we don't need to copy it\n\t\t\t\t\t\t\t// if the key was alpha, we don't need to copy it either\n\t\t\t\t\t\t\tif ( key === \"alpha\" || red[ key ] == null ) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tinst[ cache ] = space.to( inst._rgba );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// this is the only case where we allow nulls for ALL properties.\n\t\t\t\t\t\t// call clamp with alwaysAllowEmpty\n\t\t\t\t\t\tinst[ cache ][ prop.idx ] = clamp( red[ key ], prop, true );\n\t\t\t\t\t});\n\n\t\t\t\t\t// everything defined but alpha?\n\t\t\t\t\tif ( inst[ cache ] && jQuery.inArray( null, inst[ cache ].slice( 0, 3 ) ) < 0 ) {\n\t\t\t\t\t\t// use the default of 1\n\t\t\t\t\t\tinst[ cache ][ 3 ] = 1;\n\t\t\t\t\t\tif ( space.from ) {\n\t\t\t\t\t\t\tinst._rgba = space.from( inst[ cache ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t},\n\tis: function( compare ) {\n\t\tvar is = color( compare ),\n\t\t\tsame = true,\n\t\t\tinst = this;\n\n\t\teach( spaces, function( _, space ) {\n\t\t\tvar localCache,\n\t\t\t\tisCache = is[ space.cache ];\n\t\t\tif (isCache) {\n\t\t\t\tlocalCache = inst[ space.cache ] || space.to && space.to( inst._rgba ) || [];\n\t\t\t\teach( space.props, function( _, prop ) {\n\t\t\t\t\tif ( isCache[ prop.idx ] != null ) {\n\t\t\t\t\t\tsame = ( isCache[ prop.idx ] === localCache[ prop.idx ] );\n\t\t\t\t\t\treturn same;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn same;\n\t\t});\n\t\treturn same;\n\t},\n\t_space: function() {\n\t\tvar used = [],\n\t\t\tinst = this;\n\t\teach( spaces, function( spaceName, space ) {\n\t\t\tif ( inst[ space.cache ] ) {\n\t\t\t\tused.push( spaceName );\n\t\t\t}\n\t\t});\n\t\treturn used.pop();\n\t},\n\ttransition: function( other, distance ) {\n\t\tvar end = color( other ),\n\t\t\tspaceName = end._space(),\n\t\t\tspace = spaces[ spaceName ],\n\t\t\tstartColor = this.alpha() === 0 ? color( \"transparent\" ) : this,\n\t\t\tstart = startColor[ space.cache ] || space.to( startColor._rgba ),\n\t\t\tresult = start.slice();\n\n\t\tend = end[ space.cache ];\n\t\teach( space.props, function( key, prop ) {\n\t\t\tvar index = prop.idx,\n\t\t\t\tstartValue = start[ index ],\n\t\t\t\tendValue = end[ index ],\n\t\t\t\ttype = propTypes[ prop.type ] || {};\n\n\t\t\t// if null, don't override start value\n\t\t\tif ( endValue === null ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// if null - use end\n\t\t\tif ( startValue === null ) {\n\t\t\t\tresult[ index ] = endValue;\n\t\t\t} else {\n\t\t\t\tif ( type.mod ) {\n\t\t\t\t\tif ( endValue - startValue > type.mod / 2 ) {\n\t\t\t\t\t\tstartValue += type.mod;\n\t\t\t\t\t} else if ( startValue - endValue > type.mod / 2 ) {\n\t\t\t\t\t\tstartValue -= type.mod;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tresult[ index ] = clamp( ( endValue - startValue ) * distance + startValue, prop );\n\t\t\t}\n\t\t});\n\t\treturn this[ spaceName ]( result );\n\t},\n\tblend: function( opaque ) {\n\t\t// if we are already opaque - return ourself\n\t\tif ( this._rgba[ 3 ] === 1 ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tvar rgb = this._rgba.slice(),\n\t\t\ta = rgb.pop(),\n\t\t\tblend = color( opaque )._rgba;\n\n\t\treturn color( jQuery.map( rgb, function( v, i ) {\n\t\t\treturn ( 1 - a ) * blend[ i ] + a * v;\n\t\t}));\n\t},\n\ttoRgbaString: function() {\n\t\tvar prefix = \"rgba(\",\n\t\t\trgba = jQuery.map( this._rgba, function( v, i ) {\n\t\t\t\treturn v == null ? ( i > 2 ? 1 : 0 ) : v;\n\t\t\t});\n\n\t\tif ( rgba[ 3 ] === 1 ) {\n\t\t\trgba.pop();\n\t\t\tprefix = \"rgb(\";\n\t\t}\n\n\t\treturn prefix + rgba.join() + \")\";\n\t},\n\ttoHslaString: function() {\n\t\tvar prefix = \"hsla(\",\n\t\t\thsla = jQuery.map( this.hsla(), function( v, i ) {\n\t\t\t\tif ( v == null ) {\n\t\t\t\t\tv = i > 2 ? 1 : 0;\n\t\t\t\t}\n\n\t\t\t\t// catch 1 and 2\n\t\t\t\tif ( i && i < 3 ) {\n\t\t\t\t\tv = Math.round( v * 100 ) + \"%\";\n\t\t\t\t}\n\t\t\t\treturn v;\n\t\t\t});\n\n\t\tif ( hsla[ 3 ] === 1 ) {\n\t\t\thsla.pop();\n\t\t\tprefix = \"hsl(\";\n\t\t}\n\t\treturn prefix + hsla.join() + \")\";\n\t},\n\ttoHexString: function( includeAlpha ) {\n\t\tvar rgba = this._rgba.slice(),\n\t\t\talpha = rgba.pop();\n\n\t\tif ( includeAlpha ) {\n\t\t\trgba.push( ~~( alpha * 255 ) );\n\t\t}\n\n\t\treturn \"#\" + jQuery.map( rgba, function( v ) {\n\n\t\t\t// default to 0 when nulls exist\n\t\t\tv = ( v || 0 ).toString( 16 );\n\t\t\treturn v.length === 1 ? \"0\" + v : v;\n\t\t}).join(\"\");\n\t},\n\ttoString: function() {\n\t\treturn this._rgba[ 3 ] === 0 ? \"transparent\" : this.toRgbaString();\n\t}\n});\ncolor.fn.parse.prototype = color.fn;\n\n// hsla conversions adapted from:\n// https://code.google.com/p/maashaack/source/browse/packages/graphics/trunk/src/graphics/colors/HUE2RGB.as?r=5021\n\nfunction hue2rgb( p, q, h ) {\n\th = ( h + 1 ) % 1;\n\tif ( h * 6 < 1 ) {\n\t\treturn p + (q - p) * h * 6;\n\t}\n\tif ( h * 2 < 1) {\n\t\treturn q;\n\t}\n\tif ( h * 3 < 2 ) {\n\t\treturn p + (q - p) * ((2/3) - h) * 6;\n\t}\n\treturn p;\n}\n\nspaces.hsla.to = function ( rgba ) {\n\tif ( rgba[ 0 ] == null || rgba[ 1 ] == null || rgba[ 2 ] == null ) {\n\t\treturn [ null, null, null, rgba[ 3 ] ];\n\t}\n\tvar r = rgba[ 0 ] / 255,\n\t\tg = rgba[ 1 ] / 255,\n\t\tb = rgba[ 2 ] / 255,\n\t\ta = rgba[ 3 ],\n\t\tmax = Math.max( r, g, b ),\n\t\tmin = Math.min( r, g, b ),\n\t\tdiff = max - min,\n\t\tadd = max + min,\n\t\tl = add * 0.5,\n\t\th, s;\n\n\tif ( min === max ) {\n\t\th = 0;\n\t} else if ( r === max ) {\n\t\th = ( 60 * ( g - b ) / diff ) + 360;\n\t} else if ( g === max ) {\n\t\th = ( 60 * ( b - r ) / diff ) + 120;\n\t} else {\n\t\th = ( 60 * ( r - g ) / diff ) + 240;\n\t}\n\n\t// chroma (diff) == 0 means greyscale which, by definition, saturation = 0%\n\t// otherwise, saturation is based on the ratio of chroma (diff) to lightness (add)\n\tif ( diff === 0 ) {\n\t\ts = 0;\n\t} else if ( l <= 0.5 ) {\n\t\ts = diff / add;\n\t} else {\n\t\ts = diff / ( 2 - add );\n\t}\n\treturn [ Math.round(h) % 360, s, l, a == null ? 1 : a ];\n};\n\nspaces.hsla.from = function ( hsla ) {\n\tif ( hsla[ 0 ] == null || hsla[ 1 ] == null || hsla[ 2 ] == null ) {\n\t\treturn [ null, null, null, hsla[ 3 ] ];\n\t}\n\tvar h = hsla[ 0 ] / 360,\n\t\ts = hsla[ 1 ],\n\t\tl = hsla[ 2 ],\n\t\ta = hsla[ 3 ],\n\t\tq = l <= 0.5 ? l * ( 1 + s ) : l + s - l * s,\n\t\tp = 2 * l - q;\n\n\treturn [\n\t\tMath.round( hue2rgb( p, q, h + ( 1 / 3 ) ) * 255 ),\n\t\tMath.round( hue2rgb( p, q, h ) * 255 ),\n\t\tMath.round( hue2rgb( p, q, h - ( 1 / 3 ) ) * 255 ),\n\t\ta\n\t];\n};\n\n\neach( spaces, function( spaceName, space ) {\n\tvar props = space.props,\n\t\tcache = space.cache,\n\t\tto = space.to,\n\t\tfrom = space.from;\n\n\t// makes rgba() and hsla()\n\tcolor.fn[ spaceName ] = function( value ) {\n\n\t\t// generate a cache for this space if it doesn't exist\n\t\tif ( to && !this[ cache ] ) {\n\t\t\tthis[ cache ] = to( this._rgba );\n\t\t}\n\t\tif ( value === undefined ) {\n\t\t\treturn this[ cache ].slice();\n\t\t}\n\n\t\tvar ret,\n\t\t\ttype = jQuery.type( value ),\n\t\t\tarr = ( type === \"array\" || type === \"object\" ) ? value : arguments,\n\t\t\tlocal = this[ cache ].slice();\n\n\t\teach( props, function( key, prop ) {\n\t\t\tvar val = arr[ type === \"object\" ? key : prop.idx ];\n\t\t\tif ( val == null ) {\n\t\t\t\tval = local[ prop.idx ];\n\t\t\t}\n\t\t\tlocal[ prop.idx ] = clamp( val, prop );\n\t\t});\n\n\t\tif ( from ) {\n\t\t\tret = color( from( local ) );\n\t\t\tret[ cache ] = local;\n\t\t\treturn ret;\n\t\t} else {\n\t\t\treturn color( local );\n\t\t}\n\t};\n\n\t// makes red() green() blue() alpha() hue() saturation() lightness()\n\teach( props, function( key, prop ) {\n\t\t// alpha is included in more than one space\n\t\tif ( color.fn[ key ] ) {\n\t\t\treturn;\n\t\t}\n\t\tcolor.fn[ key ] = function( value ) {\n\t\t\tvar vtype = jQuery.type( value ),\n\t\t\t\tfn = ( key === \"alpha\" ? ( this._hsla ? \"hsla\" : \"rgba\" ) : spaceName ),\n\t\t\t\tlocal = this[ fn ](),\n\t\t\t\tcur = local[ prop.idx ],\n\t\t\t\tmatch;\n\n\t\t\tif ( vtype === \"undefined\" ) {\n\t\t\t\treturn cur;\n\t\t\t}\n\n\t\t\tif ( vtype === \"function\" ) {\n\t\t\t\tvalue = value.call( this, cur );\n\t\t\t\tvtype = jQuery.type( value );\n\t\t\t}\n\t\t\tif ( value == null && prop.empty ) {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\tif ( vtype === \"string\" ) {\n\t\t\t\tmatch = rplusequals.exec( value );\n\t\t\t\tif ( match ) {\n\t\t\t\t\tvalue = cur + parseFloat( match[ 2 ] ) * ( match[ 1 ] === \"+\" ? 1 : -1 );\n\t\t\t\t}\n\t\t\t}\n\t\t\tlocal[ prop.idx ] = value;\n\t\t\treturn this[ fn ]( local );\n\t\t};\n\t});\n});\n\n// add cssHook and .fx.step function for each named hook.\n// accept a space separated string of properties\ncolor.hook = function( hook ) {\n\tvar hooks = hook.split( \" \" );\n\teach( hooks, function( i, hook ) {\n\t\tjQuery.cssHooks[ hook ] = {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar parsed, curElem,\n\t\t\t\t\tbackgroundColor = \"\";\n\n\t\t\t\tif ( value !== \"transparent\" && ( jQuery.type( value ) !== \"string\" || ( parsed = stringParse( value ) ) ) ) {\n\t\t\t\t\tvalue = color( parsed || value );\n\t\t\t\t\tif ( !support.rgba && value._rgba[ 3 ] !== 1 ) {\n\t\t\t\t\t\tcurElem = hook === \"backgroundColor\" ? elem.parentNode : elem;\n\t\t\t\t\t\twhile (\n\t\t\t\t\t\t\t(backgroundColor === \"\" || backgroundColor === \"transparent\") &&\n\t\t\t\t\t\t\tcurElem && curElem.style\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tbackgroundColor = jQuery.css( curElem, \"backgroundColor\" );\n\t\t\t\t\t\t\t\tcurElem = curElem.parentNode;\n\t\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvalue = value.blend( backgroundColor && backgroundColor !== \"transparent\" ?\n\t\t\t\t\t\t\tbackgroundColor :\n\t\t\t\t\t\t\t\"_default\" );\n\t\t\t\t\t}\n\n\t\t\t\t\tvalue = value.toRgbaString();\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\telem.style[ hook ] = value;\n\t\t\t\t} catch( e ) {\n\t\t\t\t\t// wrapped to prevent IE from throwing errors on \"invalid\" values like 'auto' or 'inherit'\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tjQuery.fx.step[ hook ] = function( fx ) {\n\t\t\tif ( !fx.colorInit ) {\n\t\t\t\tfx.start = color( fx.elem, hook );\n\t\t\t\tfx.end = color( fx.end );\n\t\t\t\tfx.colorInit = true;\n\t\t\t}\n\t\t\tjQuery.cssHooks[ hook ].set( fx.elem, fx.start.transition( fx.end, fx.pos ) );\n\t\t};\n\t});\n\n};\n\ncolor.hook( stepHooks );\n\njQuery.cssHooks.borderColor = {\n\texpand: function( value ) {\n\t\tvar expanded = {};\n\n\t\teach( [ \"Top\", \"Right\", \"Bottom\", \"Left\" ], function( i, part ) {\n\t\t\texpanded[ \"border\" + part + \"Color\" ] = value;\n\t\t});\n\t\treturn expanded;\n\t}\n};\n\n// Basic color names only.\n// Usage of any of the other color names requires adding yourself or including\n// jquery.color.svg-names.js.\ncolors = jQuery.Color.names = {\n\t// 4.1. Basic color keywords\n\taqua: \"#00ffff\",\n\tblack: \"#000000\",\n\tblue: \"#0000ff\",\n\tfuchsia: \"#ff00ff\",\n\tgray: \"#808080\",\n\tgreen: \"#008000\",\n\tlime: \"#00ff00\",\n\tmaroon: \"#800000\",\n\tnavy: \"#000080\",\n\tolive: \"#808000\",\n\tpurple: \"#800080\",\n\tred: \"#ff0000\",\n\tsilver: \"#c0c0c0\",\n\tteal: \"#008080\",\n\twhite: \"#ffffff\",\n\tyellow: \"#ffff00\",\n\n\t// 4.2.3. \"transparent\" color keyword\n\ttransparent: [ null, null, null, 0 ],\n\n\t_default: \"#ffffff\"\n};\n\n})( jQuery );\n\n\n/******************************************************************************/\n/****************************** CLASS ANIMATIONS ******************************/\n/******************************************************************************/\n(function() {\n\nvar classAnimationActions = [ \"add\", \"remove\", \"toggle\" ],\n\tshorthandStyles = {\n\t\tborder: 1,\n\t\tborderBottom: 1,\n\t\tborderColor: 1,\n\t\tborderLeft: 1,\n\t\tborderRight: 1,\n\t\tborderTop: 1,\n\t\tborderWidth: 1,\n\t\tmargin: 1,\n\t\tpadding: 1\n\t};\n\n$.each([ \"borderLeftStyle\", \"borderRightStyle\", \"borderBottomStyle\", \"borderTopStyle\" ], function( _, prop ) {\n\t$.fx.step[ prop ] = function( fx ) {\n\t\tif ( fx.end !== \"none\" && !fx.setAttr || fx.pos === 1 && !fx.setAttr ) {\n\t\t\tjQuery.style( fx.elem, prop, fx.end );\n\t\t\tfx.setAttr = true;\n\t\t}\n\t};\n});\n\nfunction getElementStyles( elem ) {\n\tvar key, len,\n\t\tstyle = elem.ownerDocument.defaultView ?\n\t\t\telem.ownerDocument.defaultView.getComputedStyle( elem, null ) :\n\t\t\telem.currentStyle,\n\t\tstyles = {};\n\n\tif ( style && style.length && style[ 0 ] && style[ style[ 0 ] ] ) {\n\t\tlen = style.length;\n\t\twhile ( len-- ) {\n\t\t\tkey = style[ len ];\n\t\t\tif ( typeof style[ key ] === \"string\" ) {\n\t\t\t\tstyles[ $.camelCase( key ) ] = style[ key ];\n\t\t\t}\n\t\t}\n\t// support: Opera, IE <9\n\t} else {\n\t\tfor ( key in style ) {\n\t\t\tif ( typeof style[ key ] === \"string\" ) {\n\t\t\t\tstyles[ key ] = style[ key ];\n\t\t\t}\n\t\t}\n\t}\n\n\treturn styles;\n}\n\n\nfunction styleDifference( oldStyle, newStyle ) {\n\tvar diff = {},\n\t\tname, value;\n\n\tfor ( name in newStyle ) {\n\t\tvalue = newStyle[ name ];\n\t\tif ( oldStyle[ name ] !== value ) {\n\t\t\tif ( !shorthandStyles[ name ] ) {\n\t\t\t\tif ( $.fx.step[ name ] || !isNaN( parseFloat( value ) ) ) {\n\t\t\t\t\tdiff[ name ] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn diff;\n}\n\n// support: jQuery <1.8\nif ( !$.fn.addBack ) {\n\t$.fn.addBack = function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t};\n}\n\n$.effects.animateClass = function( value, duration, easing, callback ) {\n\tvar o = $.speed( duration, easing, callback );\n\n\treturn this.queue( function() {\n\t\tvar animated = $( this ),\n\t\t\tbaseClass = animated.attr( \"class\" ) || \"\",\n\t\t\tapplyClassChange,\n\t\t\tallAnimations = o.children ? animated.find( \"*\" ).addBack() : animated;\n\n\t\t// map the animated objects to store the original styles.\n\t\tallAnimations = allAnimations.map(function() {\n\t\t\tvar el = $( this );\n\t\t\treturn {\n\t\t\t\tel: el,\n\t\t\t\tstart: getElementStyles( this )\n\t\t\t};\n\t\t});\n\n\t\t// apply class change\n\t\tapplyClassChange = function() {\n\t\t\t$.each( classAnimationActions, function(i, action) {\n\t\t\t\tif ( value[ action ] ) {\n\t\t\t\t\tanimated[ action + \"Class\" ]( value[ action ] );\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\t\tapplyClassChange();\n\n\t\t// map all animated objects again - calculate new styles and diff\n\t\tallAnimations = allAnimations.map(function() {\n\t\t\tthis.end = getElementStyles( this.el[ 0 ] );\n\t\t\tthis.diff = styleDifference( this.start, this.end );\n\t\t\treturn this;\n\t\t});\n\n\t\t// apply original class\n\t\tanimated.attr( \"class\", baseClass );\n\n\t\t// map all animated objects again - this time collecting a promise\n\t\tallAnimations = allAnimations.map(function() {\n\t\t\tvar styleInfo = this,\n\t\t\t\tdfd = $.Deferred(),\n\t\t\t\topts = $.extend({}, o, {\n\t\t\t\t\tqueue: false,\n\t\t\t\t\tcomplete: function() {\n\t\t\t\t\t\tdfd.resolve( styleInfo );\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\tthis.el.animate( this.diff, opts );\n\t\t\treturn dfd.promise();\n\t\t});\n\n\t\t// once all animations have completed:\n\t\t$.when.apply( $, allAnimations.get() ).done(function() {\n\n\t\t\t// set the final class\n\t\t\tapplyClassChange();\n\n\t\t\t// for each animated element,\n\t\t\t// clear all css properties that were animated\n\t\t\t$.each( arguments, function() {\n\t\t\t\tvar el = this.el;\n\t\t\t\t$.each( this.diff, function(key) {\n\t\t\t\t\tel.css( key, \"\" );\n\t\t\t\t});\n\t\t\t});\n\n\t\t\t// this is guarnteed to be there if you use jQuery.speed()\n\t\t\t// it also handles dequeuing the next anim...\n\t\t\to.complete.call( animated[ 0 ] );\n\t\t});\n\t});\n};\n\n$.fn.extend({\n\taddClass: (function( orig ) {\n\t\treturn function( classNames, speed, easing, callback ) {\n\t\t\treturn speed ?\n\t\t\t\t$.effects.animateClass.call( this,\n\t\t\t\t\t{ add: classNames }, speed, easing, callback ) :\n\t\t\t\torig.apply( this, arguments );\n\t\t};\n\t})( $.fn.addClass ),\n\n\tremoveClass: (function( orig ) {\n\t\treturn function( classNames, speed, easing, callback ) {\n\t\t\treturn arguments.length > 1 ?\n\t\t\t\t$.effects.animateClass.call( this,\n\t\t\t\t\t{ remove: classNames }, speed, easing, callback ) :\n\t\t\t\torig.apply( this, arguments );\n\t\t};\n\t})( $.fn.removeClass ),\n\n\ttoggleClass: (function( orig ) {\n\t\treturn function( classNames, force, speed, easing, callback ) {\n\t\t\tif ( typeof force === \"boolean\" || force === undefined ) {\n\t\t\t\tif ( !speed ) {\n\t\t\t\t\t// without speed parameter\n\t\t\t\t\treturn orig.apply( this, arguments );\n\t\t\t\t} else {\n\t\t\t\t\treturn $.effects.animateClass.call( this,\n\t\t\t\t\t\t(force ? { add: classNames } : { remove: classNames }),\n\t\t\t\t\t\tspeed, easing, callback );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// without force parameter\n\t\t\t\treturn $.effects.animateClass.call( this,\n\t\t\t\t\t{ toggle: classNames }, force, speed, easing );\n\t\t\t}\n\t\t};\n\t})( $.fn.toggleClass ),\n\n\tswitchClass: function( remove, add, speed, easing, callback) {\n\t\treturn $.effects.animateClass.call( this, {\n\t\t\tadd: add,\n\t\t\tremove: remove\n\t\t}, speed, easing, callback );\n\t}\n});\n\n})();\n\n/******************************************************************************/\n/*********************************** EFFECTS **********************************/\n/******************************************************************************/\n\n(function() {\n\n$.extend( $.effects, {\n\tversion: \"1.10.4\",\n\n\t// Saves a set of properties in a data storage\n\tsave: function( element, set ) {\n\t\tfor( var i=0; i < set.length; i++ ) {\n\t\t\tif ( set[ i ] !== null ) {\n\t\t\t\telement.data( dataSpace + set[ i ], element[ 0 ].style[ set[ i ] ] );\n\t\t\t}\n\t\t}\n\t},\n\n\t// Restores a set of previously saved properties from a data storage\n\trestore: function( element, set ) {\n\t\tvar val, i;\n\t\tfor( i=0; i < set.length; i++ ) {\n\t\t\tif ( set[ i ] !== null ) {\n\t\t\t\tval = element.data( dataSpace + set[ i ] );\n\t\t\t\t// support: jQuery 1.6.2\n\t\t\t\t// http://bugs.jquery.com/ticket/9917\n\t\t\t\t// jQuery 1.6.2 incorrectly returns undefined for any falsy value.\n\t\t\t\t// We can't differentiate between \"\" and 0 here, so we just assume\n\t\t\t\t// empty string since it's likely to be a more common value...\n\t\t\t\tif ( val === undefined ) {\n\t\t\t\t\tval = \"\";\n\t\t\t\t}\n\t\t\t\telement.css( set[ i ], val );\n\t\t\t}\n\t\t}\n\t},\n\n\tsetMode: function( el, mode ) {\n\t\tif (mode === \"toggle\") {\n\t\t\tmode = el.is( \":hidden\" ) ? \"show\" : \"hide\";\n\t\t}\n\t\treturn mode;\n\t},\n\n\t// Translates a [top,left] array into a baseline value\n\t// this should be a little more flexible in the future to handle a string & hash\n\tgetBaseline: function( origin, original ) {\n\t\tvar y, x;\n\t\tswitch ( origin[ 0 ] ) {\n\t\t\tcase \"top\": y = 0; break;\n\t\t\tcase \"middle\": y = 0.5; break;\n\t\t\tcase \"bottom\": y = 1; break;\n\t\t\tdefault: y = origin[ 0 ] / original.height;\n\t\t}\n\t\tswitch ( origin[ 1 ] ) {\n\t\t\tcase \"left\": x = 0; break;\n\t\t\tcase \"center\": x = 0.5; break;\n\t\t\tcase \"right\": x = 1; break;\n\t\t\tdefault: x = origin[ 1 ] / original.width;\n\t\t}\n\t\treturn {\n\t\t\tx: x,\n\t\t\ty: y\n\t\t};\n\t},\n\n\t// Wraps the element around a wrapper that copies position properties\n\tcreateWrapper: function( element ) {\n\n\t\t// if the element is already wrapped, return it\n\t\tif ( element.parent().is( \".ui-effects-wrapper\" )) {\n\t\t\treturn element.parent();\n\t\t}\n\n\t\t// wrap the element\n\t\tvar props = {\n\t\t\t\twidth: element.outerWidth(true),\n\t\t\t\theight: element.outerHeight(true),\n\t\t\t\t\"float\": element.css( \"float\" )\n\t\t\t},\n\t\t\twrapper = $( \"<div></div>\" )\n\t\t\t\t.addClass( \"ui-effects-wrapper\" )\n\t\t\t\t.css({\n\t\t\t\t\tfontSize: \"100%\",\n\t\t\t\t\tbackground: \"transparent\",\n\t\t\t\t\tborder: \"none\",\n\t\t\t\t\tmargin: 0,\n\t\t\t\t\tpadding: 0\n\t\t\t\t}),\n\t\t\t// Store the size in case width/height are defined in % - Fixes #5245\n\t\t\tsize = {\n\t\t\t\twidth: element.width(),\n\t\t\t\theight: element.height()\n\t\t\t},\n\t\t\tactive = document.activeElement;\n\n\t\t// support: Firefox\n\t\t// Firefox incorrectly exposes anonymous content\n\t\t// https://bugzilla.mozilla.org/show_bug.cgi?id=561664\n\t\ttry {\n\t\t\tactive.id;\n\t\t} catch( e ) {\n\t\t\tactive = document.body;\n\t\t}\n\n\t\telement.wrap( wrapper );\n\n\t\t// Fixes #7595 - Elements lose focus when wrapped.\n\t\tif ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {\n\t\t\t$( active ).focus();\n\t\t}\n\n\t\twrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually lose the reference to the wrapped element\n\n\t\t// transfer positioning properties to the wrapper\n\t\tif ( element.css( \"position\" ) === \"static\" ) {\n\t\t\twrapper.css({ position: \"relative\" });\n\t\t\telement.css({ position: \"relative\" });\n\t\t} else {\n\t\t\t$.extend( props, {\n\t\t\t\tposition: element.css( \"position\" ),\n\t\t\t\tzIndex: element.css( \"z-index\" )\n\t\t\t});\n\t\t\t$.each([ \"top\", \"left\", \"bottom\", \"right\" ], function(i, pos) {\n\t\t\t\tprops[ pos ] = element.css( pos );\n\t\t\t\tif ( isNaN( parseInt( props[ pos ], 10 ) ) ) {\n\t\t\t\t\tprops[ pos ] = \"auto\";\n\t\t\t\t}\n\t\t\t});\n\t\t\telement.css({\n\t\t\t\tposition: \"relative\",\n\t\t\t\ttop: 0,\n\t\t\t\tleft: 0,\n\t\t\t\tright: \"auto\",\n\t\t\t\tbottom: \"auto\"\n\t\t\t});\n\t\t}\n\t\telement.css(size);\n\n\t\treturn wrapper.css( props ).show();\n\t},\n\n\tremoveWrapper: function( element ) {\n\t\tvar active = document.activeElement;\n\n\t\tif ( element.parent().is( \".ui-effects-wrapper\" ) ) {\n\t\t\telement.parent().replaceWith( element );\n\n\t\t\t// Fixes #7595 - Elements lose focus when wrapped.\n\t\t\tif ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {\n\t\t\t\t$( active ).focus();\n\t\t\t}\n\t\t}\n\n\n\t\treturn element;\n\t},\n\n\tsetTransition: function( element, list, factor, value ) {\n\t\tvalue = value || {};\n\t\t$.each( list, function( i, x ) {\n\t\t\tvar unit = element.cssUnit( x );\n\t\t\tif ( unit[ 0 ] > 0 ) {\n\t\t\t\tvalue[ x ] = unit[ 0 ] * factor + unit[ 1 ];\n\t\t\t}\n\t\t});\n\t\treturn value;\n\t}\n});\n\n// return an effect options object for the given parameters:\nfunction _normalizeArguments( effect, options, speed, callback ) {\n\n\t// allow passing all options as the first parameter\n\tif ( $.isPlainObject( effect ) ) {\n\t\toptions = effect;\n\t\teffect = effect.effect;\n\t}\n\n\t// convert to an object\n\teffect = { effect: effect };\n\n\t// catch (effect, null, ...)\n\tif ( options == null ) {\n\t\toptions = {};\n\t}\n\n\t// catch (effect, callback)\n\tif ( $.isFunction( options ) ) {\n\t\tcallback = options;\n\t\tspeed = null;\n\t\toptions = {};\n\t}\n\n\t// catch (effect, speed, ?)\n\tif ( typeof options === \"number\" || $.fx.speeds[ options ] ) {\n\t\tcallback = speed;\n\t\tspeed = options;\n\t\toptions = {};\n\t}\n\n\t// catch (effect, options, callback)\n\tif ( $.isFunction( speed ) ) {\n\t\tcallback = speed;\n\t\tspeed = null;\n\t}\n\n\t// add options to effect\n\tif ( options ) {\n\t\t$.extend( effect, options );\n\t}\n\n\tspeed = speed || options.duration;\n\teffect.duration = $.fx.off ? 0 :\n\t\ttypeof speed === \"number\" ? speed :\n\t\tspeed in $.fx.speeds ? $.fx.speeds[ speed ] :\n\t\t$.fx.speeds._default;\n\n\teffect.complete = callback || options.complete;\n\n\treturn effect;\n}\n\nfunction standardAnimationOption( option ) {\n\t// Valid standard speeds (nothing, number, named speed)\n\tif ( !option || typeof option === \"number\" || $.fx.speeds[ option ] ) {\n\t\treturn true;\n\t}\n\n\t// Invalid strings - treat as \"normal\" speed\n\tif ( typeof option === \"string\" && !$.effects.effect[ option ] ) {\n\t\treturn true;\n\t}\n\n\t// Complete callback\n\tif ( $.isFunction( option ) ) {\n\t\treturn true;\n\t}\n\n\t// Options hash (but not naming an effect)\n\tif ( typeof option === \"object\" && !option.effect ) {\n\t\treturn true;\n\t}\n\n\t// Didn't match any standard API\n\treturn false;\n}\n\n$.fn.extend({\n\teffect: function( /* effect, options, speed, callback */ ) {\n\t\tvar args = _normalizeArguments.apply( this, arguments ),\n\t\t\tmode = args.mode,\n\t\t\tqueue = args.queue,\n\t\t\teffectMethod = $.effects.effect[ args.effect ];\n\n\t\tif ( $.fx.off || !effectMethod ) {\n\t\t\t// delegate to the original method (e.g., .show()) if possible\n\t\t\tif ( mode ) {\n\t\t\t\treturn this[ mode ]( args.duration, args.complete );\n\t\t\t} else {\n\t\t\t\treturn this.each( function() {\n\t\t\t\t\tif ( args.complete ) {\n\t\t\t\t\t\targs.complete.call( this );\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tfunction run( next ) {\n\t\t\tvar elem = $( this ),\n\t\t\t\tcomplete = args.complete,\n\t\t\t\tmode = args.mode;\n\n\t\t\tfunction done() {\n\t\t\t\tif ( $.isFunction( complete ) ) {\n\t\t\t\t\tcomplete.call( elem[0] );\n\t\t\t\t}\n\t\t\t\tif ( $.isFunction( next ) ) {\n\t\t\t\t\tnext();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If the element already has the correct final state, delegate to\n\t\t\t// the core methods so the internal tracking of \"olddisplay\" works.\n\t\t\tif ( elem.is( \":hidden\" ) ? mode === \"hide\" : mode === \"show\" ) {\n\t\t\t\telem[ mode ]();\n\t\t\t\tdone();\n\t\t\t} else {\n\t\t\t\teffectMethod.call( elem[0], args, done );\n\t\t\t}\n\t\t}\n\n\t\treturn queue === false ? this.each( run ) : this.queue( queue || \"fx\", run );\n\t},\n\n\tshow: (function( orig ) {\n\t\treturn function( option ) {\n\t\t\tif ( standardAnimationOption( option ) ) {\n\t\t\t\treturn orig.apply( this, arguments );\n\t\t\t} else {\n\t\t\t\tvar args = _normalizeArguments.apply( this, arguments );\n\t\t\t\targs.mode = \"show\";\n\t\t\t\treturn this.effect.call( this, args );\n\t\t\t}\n\t\t};\n\t})( $.fn.show ),\n\n\thide: (function( orig ) {\n\t\treturn function( option ) {\n\t\t\tif ( standardAnimationOption( option ) ) {\n\t\t\t\treturn orig.apply( this, arguments );\n\t\t\t} else {\n\t\t\t\tvar args = _normalizeArguments.apply( this, arguments );\n\t\t\t\targs.mode = \"hide\";\n\t\t\t\treturn this.effect.call( this, args );\n\t\t\t}\n\t\t};\n\t})( $.fn.hide ),\n\n\ttoggle: (function( orig ) {\n\t\treturn function( option ) {\n\t\t\tif ( standardAnimationOption( option ) || typeof option === \"boolean\" ) {\n\t\t\t\treturn orig.apply( this, arguments );\n\t\t\t} else {\n\t\t\t\tvar args = _normalizeArguments.apply( this, arguments );\n\t\t\t\targs.mode = \"toggle\";\n\t\t\t\treturn this.effect.call( this, args );\n\t\t\t}\n\t\t};\n\t})( $.fn.toggle ),\n\n\t// helper functions\n\tcssUnit: function(key) {\n\t\tvar style = this.css( key ),\n\t\t\tval = [];\n\n\t\t$.each( [ \"em\", \"px\", \"%\", \"pt\" ], function( i, unit ) {\n\t\t\tif ( style.indexOf( unit ) > 0 ) {\n\t\t\t\tval = [ parseFloat( style ), unit ];\n\t\t\t}\n\t\t});\n\t\treturn val;\n\t}\n});\n\n})();\n\n/******************************************************************************/\n/*********************************** EASING ***********************************/\n/******************************************************************************/\n\n(function() {\n\n// based on easing equations from Robert Penner (http://www.robertpenner.com/easing)\n\nvar baseEasings = {};\n\n$.each( [ \"Quad\", \"Cubic\", \"Quart\", \"Quint\", \"Expo\" ], function( i, name ) {\n\tbaseEasings[ name ] = function( p ) {\n\t\treturn Math.pow( p, i + 2 );\n\t};\n});\n\n$.extend( baseEasings, {\n\tSine: function ( p ) {\n\t\treturn 1 - Math.cos( p * Math.PI / 2 );\n\t},\n\tCirc: function ( p ) {\n\t\treturn 1 - Math.sqrt( 1 - p * p );\n\t},\n\tElastic: function( p ) {\n\t\treturn p === 0 || p === 1 ? p :\n\t\t\t-Math.pow( 2, 8 * (p - 1) ) * Math.sin( ( (p - 1) * 80 - 7.5 ) * Math.PI / 15 );\n\t},\n\tBack: function( p ) {\n\t\treturn p * p * ( 3 * p - 2 );\n\t},\n\tBounce: function ( p ) {\n\t\tvar pow2,\n\t\t\tbounce = 4;\n\n\t\twhile ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) / 11 ) {}\n\t\treturn 1 / Math.pow( 4, 3 - bounce ) - 7.5625 * Math.pow( ( pow2 * 3 - 2 ) / 22 - p, 2 );\n\t}\n});\n\n$.each( baseEasings, function( name, easeIn ) {\n\t$.easing[ \"easeIn\" + name ] = easeIn;\n\t$.easing[ \"easeOut\" + name ] = function( p ) {\n\t\treturn 1 - easeIn( 1 - p );\n\t};\n\t$.easing[ \"easeInOut\" + name ] = function( p ) {\n\t\treturn p < 0.5 ?\n\t\t\teaseIn( p * 2 ) / 2 :\n\t\t\t1 - easeIn( p * -2 + 2 ) / 2;\n\t};\n});\n\n})();\n\n})(jQuery);\n\n/*!\r\n * jQuery UI Touch Punch 0.2.2\r\n *\r\n * Copyright 2011, Dave Furfero\r\n * Dual licensed under the MIT or GPL Version 2 licenses.\r\n *\r\n * Depends:\r\n *  jquery.ui.widget.js\r\n *  jquery.ui.mouse.js\r\n */\r\n(function ($) {\r\n\r\n  // Detect touch support\r\n  $.support.touch = 'ontouchend' in document;\r\n\r\n  // Ignore browsers without touch support\r\n  if (!$.support.touch) {\r\n    return;\r\n  }\r\n\r\n  var mouseProto = $.ui.mouse.prototype,\r\n      _mouseInit = mouseProto._mouseInit,\r\n      touchHandled;\r\n\r\n  /**\r\n   * Simulate a mouse event based on a corresponding touch event\r\n   * @param {Object} event A touch event\r\n   * @param {String} simulatedType The corresponding mouse event\r\n   */\r\n  function simulateMouseEvent (event, simulatedType) {\r\n\r\n    // Ignore multi-touch events\r\n    if (event.originalEvent.touches.length > 1) {\r\n      return;\r\n    }\r\n\r\n    event.preventDefault();\r\n\r\n    var touch = event.originalEvent.changedTouches[0],\r\n        simulatedEvent = document.createEvent('MouseEvents');\r\n    \r\n    // Initialize the simulated mouse event using the touch event's coordinates\r\n    simulatedEvent.initMouseEvent(\r\n      simulatedType,    // type\r\n      true,             // bubbles                    \r\n      true,             // cancelable                 \r\n      window,           // view                       \r\n      1,                // detail                     \r\n      touch.screenX,    // screenX                    \r\n      touch.screenY,    // screenY                    \r\n      touch.clientX,    // clientX                    \r\n      touch.clientY,    // clientY                    \r\n      false,            // ctrlKey                    \r\n      false,            // altKey                     \r\n      false,            // shiftKey                   \r\n      false,            // metaKey                    \r\n      0,                // button                     \r\n      null              // relatedTarget              \r\n    );\r\n\r\n    // Dispatch the simulated event to the target element\r\n    event.target.dispatchEvent(simulatedEvent);\r\n  }\r\n\r\n  /**\r\n   * Handle the jQuery UI widget's touchstart events\r\n   * @param {Object} event The widget element's touchstart event\r\n   */\r\n  mouseProto._touchStart = function (event) {\r\n\r\n    var self = this;\r\n\r\n    // Ignore the event if another widget is already being handled\r\n    if (touchHandled || !self._mouseCapture(event.originalEvent.changedTouches[0])) {\r\n      return;\r\n    }\r\n\r\n    // Set the flag to prevent other widgets from inheriting the touch event\r\n    touchHandled = true;\r\n\r\n    // Track movement to determine if interaction was a click\r\n    self._touchMoved = false;\r\n\r\n    // Simulate the mouseover event\r\n    simulateMouseEvent(event, 'mouseover');\r\n\r\n    // Simulate the mousemove event\r\n    simulateMouseEvent(event, 'mousemove');\r\n\r\n    // Simulate the mousedown event\r\n    simulateMouseEvent(event, 'mousedown');\r\n  };\r\n\r\n  /**\r\n   * Handle the jQuery UI widget's touchmove events\r\n   * @param {Object} event The document's touchmove event\r\n   */\r\n  mouseProto._touchMove = function (event) {\r\n\r\n    // Ignore event if not handled\r\n    if (!touchHandled) {\r\n      return;\r\n    }\r\n\r\n    // Interaction was not a click\r\n    this._touchMoved = true;\r\n\r\n    // Simulate the mousemove event\r\n    simulateMouseEvent(event, 'mousemove');\r\n  };\r\n\r\n  /**\r\n   * Handle the jQuery UI widget's touchend events\r\n   * @param {Object} event The document's touchend event\r\n   */\r\n  mouseProto._touchEnd = function (event) {\r\n\r\n    // Ignore event if not handled\r\n    if (!touchHandled) {\r\n      return;\r\n    }\r\n\r\n    // Simulate the mouseup event\r\n    simulateMouseEvent(event, 'mouseup');\r\n\r\n    // Simulate the mouseout event\r\n    simulateMouseEvent(event, 'mouseout');\r\n\r\n    // If the touch interaction did not move, it should trigger a click\r\n    if (!this._touchMoved) {\r\n\r\n      // Simulate the click event\r\n      simulateMouseEvent(event, 'click');\r\n    }\r\n\r\n    // Unset the flag to allow other widgets to inherit the touch event\r\n    touchHandled = false;\r\n  };\r\n\r\n  /**\r\n   * A duck punch of the $.ui.mouse _mouseInit method to support touch events.\r\n   * This method extends the widget with bound touch event handlers that\r\n   * translate touch events to mouse events and pass them to the widget's\r\n   * original mouse event handling methods.\r\n   */\r\n  mouseProto._mouseInit = function () {\r\n    \r\n    var self = this;\r\n\r\n    // Delegate the touch handlers to the widget's element\r\n    self.element\r\n      .bind('touchstart', $.proxy(self, '_touchStart'))\r\n      .bind('touchmove', $.proxy(self, '_touchMove'))\r\n      .bind('touchend', $.proxy(self, '_touchEnd'));\r\n\r\n    // Call the original $.ui.mouse init method\r\n    _mouseInit.call(self);\r\n  };\r\n\r\n})(jQuery);\n/*!\n * Bootstrap v3.2.0 (http://getbootstrap.com)\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\nif (typeof jQuery === 'undefined') { throw new Error('Bootstrap\\'s JavaScript requires jQuery') }\n\n/* ========================================================================\n * Bootstrap: transition.js v3.2.0\n * http://getbootstrap.com/javascript/#transitions\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)\n  // ============================================================\n\n  function transitionEnd() {\n    var el = document.createElement('bootstrap')\n\n    var transEndEventNames = {\n      WebkitTransition : 'webkitTransitionEnd',\n      MozTransition    : 'transitionend',\n      OTransition      : 'oTransitionEnd otransitionend',\n      transition       : 'transitionend'\n    }\n\n    for (var name in transEndEventNames) {\n      if (el.style[name] !== undefined) {\n        return { end: transEndEventNames[name] }\n      }\n    }\n\n    return false // explicit for ie8 (  ._.)\n  }\n\n  // http://blog.alexmaccaw.com/css-transitions\n  $.fn.emulateTransitionEnd = function (duration) {\n    var called = false\n    var $el = this\n    $(this).one('bsTransitionEnd', function () { called = true })\n    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }\n    setTimeout(callback, duration)\n    return this\n  }\n\n  $(function () {\n    $.support.transition = transitionEnd()\n\n    if (!$.support.transition) return\n\n    $.event.special.bsTransitionEnd = {\n      bindType: $.support.transition.end,\n      delegateType: $.support.transition.end,\n      handle: function (e) {\n        if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)\n      }\n    }\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: alert.js v3.2.0\n * http://getbootstrap.com/javascript/#alerts\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // ALERT CLASS DEFINITION\n  // ======================\n\n  var dismiss = '[data-dismiss=\"alert\"]'\n  var Alert   = function (el) {\n    $(el).on('click', dismiss, this.close)\n  }\n\n  Alert.VERSION = '3.2.0'\n\n  Alert.prototype.close = function (e) {\n    var $this    = $(this)\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n    }\n\n    var $parent = $(selector)\n\n    if (e) e.preventDefault()\n\n    if (!$parent.length) {\n      $parent = $this.hasClass('alert') ? $this : $this.parent()\n    }\n\n    $parent.trigger(e = $.Event('close.bs.alert'))\n\n    if (e.isDefaultPrevented()) return\n\n    $parent.removeClass('in')\n\n    function removeElement() {\n      // detach from parent, fire event then clean up data\n      $parent.detach().trigger('closed.bs.alert').remove()\n    }\n\n    $.support.transition && $parent.hasClass('fade') ?\n      $parent\n        .one('bsTransitionEnd', removeElement)\n        .emulateTransitionEnd(150) :\n      removeElement()\n  }\n\n\n  // ALERT PLUGIN DEFINITION\n  // =======================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.alert')\n\n      if (!data) $this.data('bs.alert', (data = new Alert(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  var old = $.fn.alert\n\n  $.fn.alert             = Plugin\n  $.fn.alert.Constructor = Alert\n\n\n  // ALERT NO CONFLICT\n  // =================\n\n  $.fn.alert.noConflict = function () {\n    $.fn.alert = old\n    return this\n  }\n\n\n  // ALERT DATA-API\n  // ==============\n\n  $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: button.js v3.2.0\n * http://getbootstrap.com/javascript/#buttons\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // BUTTON PUBLIC CLASS DEFINITION\n  // ==============================\n\n  var Button = function (element, options) {\n    this.$element  = $(element)\n    this.options   = $.extend({}, Button.DEFAULTS, options)\n    this.isLoading = false\n  }\n\n  Button.VERSION  = '3.2.0'\n\n  Button.DEFAULTS = {\n    loadingText: 'loading...'\n  }\n\n  Button.prototype.setState = function (state) {\n    var d    = 'disabled'\n    var $el  = this.$element\n    var val  = $el.is('input') ? 'val' : 'html'\n    var data = $el.data()\n\n    state = state + 'Text'\n\n    if (data.resetText == null) $el.data('resetText', $el[val]())\n\n    $el[val](data[state] == null ? this.options[state] : data[state])\n\n    // push to event loop to allow forms to submit\n    setTimeout($.proxy(function () {\n      if (state == 'loadingText') {\n        this.isLoading = true\n        $el.addClass(d).attr(d, d)\n      } else if (this.isLoading) {\n        this.isLoading = false\n        $el.removeClass(d).removeAttr(d)\n      }\n    }, this), 0)\n  }\n\n  Button.prototype.toggle = function () {\n    var changed = true\n    var $parent = this.$element.closest('[data-toggle=\"buttons\"]')\n\n    if ($parent.length) {\n      var $input = this.$element.find('input')\n      if ($input.prop('type') == 'radio') {\n        if ($input.prop('checked') && this.$element.hasClass('active')) changed = false\n        else $parent.find('.active').removeClass('active')\n      }\n      if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change')\n    }\n\n    if (changed) this.$element.toggleClass('active')\n  }\n\n\n  // BUTTON PLUGIN DEFINITION\n  // ========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.button')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.button', (data = new Button(this, options)))\n\n      if (option == 'toggle') data.toggle()\n      else if (option) data.setState(option)\n    })\n  }\n\n  var old = $.fn.button\n\n  $.fn.button             = Plugin\n  $.fn.button.Constructor = Button\n\n\n  // BUTTON NO CONFLICT\n  // ==================\n\n  $.fn.button.noConflict = function () {\n    $.fn.button = old\n    return this\n  }\n\n\n  // BUTTON DATA-API\n  // ===============\n\n  $(document).on('click.bs.button.data-api', '[data-toggle^=\"button\"]', function (e) {\n    var $btn = $(e.target)\n    if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')\n    Plugin.call($btn, 'toggle')\n    e.preventDefault()\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: carousel.js v3.2.0\n * http://getbootstrap.com/javascript/#carousel\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // CAROUSEL CLASS DEFINITION\n  // =========================\n\n  var Carousel = function (element, options) {\n    this.$element    = $(element).on('keydown.bs.carousel', $.proxy(this.keydown, this))\n    this.$indicators = this.$element.find('.carousel-indicators')\n    this.options     = options\n    this.paused      =\n    this.sliding     =\n    this.interval    =\n    this.$active     =\n    this.$items      = null\n\n    this.options.pause == 'hover' && this.$element\n      .on('mouseenter.bs.carousel', $.proxy(this.pause, this))\n      .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))\n  }\n\n  Carousel.VERSION  = '3.2.0'\n\n  Carousel.DEFAULTS = {\n    interval: 5000,\n    pause: 'hover',\n    wrap: true\n  }\n\n  Carousel.prototype.keydown = function (e) {\n    switch (e.which) {\n      case 37: this.prev(); break\n      case 39: this.next(); break\n      default: return\n    }\n\n    e.preventDefault()\n  }\n\n  Carousel.prototype.cycle = function (e) {\n    e || (this.paused = false)\n\n    this.interval && clearInterval(this.interval)\n\n    this.options.interval\n      && !this.paused\n      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))\n\n    return this\n  }\n\n  Carousel.prototype.getItemIndex = function (item) {\n    this.$items = item.parent().children('.item')\n    return this.$items.index(item || this.$active)\n  }\n\n  Carousel.prototype.to = function (pos) {\n    var that        = this\n    var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))\n\n    if (pos > (this.$items.length - 1) || pos < 0) return\n\n    if (this.sliding)       return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, \"slid\"\n    if (activeIndex == pos) return this.pause().cycle()\n\n    return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))\n  }\n\n  Carousel.prototype.pause = function (e) {\n    e || (this.paused = true)\n\n    if (this.$element.find('.next, .prev').length && $.support.transition) {\n      this.$element.trigger($.support.transition.end)\n      this.cycle(true)\n    }\n\n    this.interval = clearInterval(this.interval)\n\n    return this\n  }\n\n  Carousel.prototype.next = function () {\n    if (this.sliding) return\n    return this.slide('next')\n  }\n\n  Carousel.prototype.prev = function () {\n    if (this.sliding) return\n    return this.slide('prev')\n  }\n\n  Carousel.prototype.slide = function (type, next) {\n    var $active   = this.$element.find('.item.active')\n    var $next     = next || $active[type]()\n    var isCycling = this.interval\n    var direction = type == 'next' ? 'left' : 'right'\n    var fallback  = type == 'next' ? 'first' : 'last'\n    var that      = this\n\n    if (!$next.length) {\n      if (!this.options.wrap) return\n      $next = this.$element.find('.item')[fallback]()\n    }\n\n    if ($next.hasClass('active')) return (this.sliding = false)\n\n    var relatedTarget = $next[0]\n    var slideEvent = $.Event('slide.bs.carousel', {\n      relatedTarget: relatedTarget,\n      direction: direction\n    })\n    this.$element.trigger(slideEvent)\n    if (slideEvent.isDefaultPrevented()) return\n\n    this.sliding = true\n\n    isCycling && this.pause()\n\n    if (this.$indicators.length) {\n      this.$indicators.find('.active').removeClass('active')\n      var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])\n      $nextIndicator && $nextIndicator.addClass('active')\n    }\n\n    var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, \"slid\"\n    if ($.support.transition && this.$element.hasClass('slide')) {\n      $next.addClass(type)\n      $next[0].offsetWidth // force reflow\n      $active.addClass(direction)\n      $next.addClass(direction)\n      $active\n        .one('bsTransitionEnd', function () {\n          $next.removeClass([type, direction].join(' ')).addClass('active')\n          $active.removeClass(['active', direction].join(' '))\n          that.sliding = false\n          setTimeout(function () {\n            that.$element.trigger(slidEvent)\n          }, 0)\n        })\n        .emulateTransitionEnd($active.css('transition-duration').slice(0, -1) * 1000)\n    } else {\n      $active.removeClass('active')\n      $next.addClass('active')\n      this.sliding = false\n      this.$element.trigger(slidEvent)\n    }\n\n    isCycling && this.cycle()\n\n    return this\n  }\n\n\n  // CAROUSEL PLUGIN DEFINITION\n  // ==========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.carousel')\n      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)\n      var action  = typeof option == 'string' ? option : options.slide\n\n      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))\n      if (typeof option == 'number') data.to(option)\n      else if (action) data[action]()\n      else if (options.interval) data.pause().cycle()\n    })\n  }\n\n  var old = $.fn.carousel\n\n  $.fn.carousel             = Plugin\n  $.fn.carousel.Constructor = Carousel\n\n\n  // CAROUSEL NO CONFLICT\n  // ====================\n\n  $.fn.carousel.noConflict = function () {\n    $.fn.carousel = old\n    return this\n  }\n\n\n  // CAROUSEL DATA-API\n  // =================\n\n  $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {\n    var href\n    var $this   = $(this)\n    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) // strip for ie7\n    if (!$target.hasClass('carousel')) return\n    var options = $.extend({}, $target.data(), $this.data())\n    var slideIndex = $this.attr('data-slide-to')\n    if (slideIndex) options.interval = false\n\n    Plugin.call($target, options)\n\n    if (slideIndex) {\n      $target.data('bs.carousel').to(slideIndex)\n    }\n\n    e.preventDefault()\n  })\n\n  $(window).on('load', function () {\n    $('[data-ride=\"carousel\"]').each(function () {\n      var $carousel = $(this)\n      Plugin.call($carousel, $carousel.data())\n    })\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: collapse.js v3.2.0\n * http://getbootstrap.com/javascript/#collapse\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // COLLAPSE PUBLIC CLASS DEFINITION\n  // ================================\n\n  var Collapse = function (element, options) {\n    this.$element      = $(element)\n    this.options       = $.extend({}, Collapse.DEFAULTS, options)\n    this.transitioning = null\n\n    if (this.options.parent) this.$parent = $(this.options.parent)\n    if (this.options.toggle) this.toggle()\n  }\n\n  Collapse.VERSION  = '3.2.0'\n\n  Collapse.DEFAULTS = {\n    toggle: true\n  }\n\n  Collapse.prototype.dimension = function () {\n    var hasWidth = this.$element.hasClass('width')\n    return hasWidth ? 'width' : 'height'\n  }\n\n  Collapse.prototype.show = function () {\n    if (this.transitioning || this.$element.hasClass('in')) return\n\n    var startEvent = $.Event('show.bs.collapse')\n    this.$element.trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) return\n\n    var actives = this.$parent && this.$parent.find('> .panel > .in')\n\n    if (actives && actives.length) {\n      var hasData = actives.data('bs.collapse')\n      if (hasData && hasData.transitioning) return\n      Plugin.call(actives, 'hide')\n      hasData || actives.data('bs.collapse', null)\n    }\n\n    var dimension = this.dimension()\n\n    this.$element\n      .removeClass('collapse')\n      .addClass('collapsing')[dimension](0)\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.$element\n        .removeClass('collapsing')\n        .addClass('collapse in')[dimension]('')\n      this.transitioning = 0\n      this.$element\n        .trigger('shown.bs.collapse')\n    }\n\n    if (!$.support.transition) return complete.call(this)\n\n    var scrollSize = $.camelCase(['scroll', dimension].join('-'))\n\n    this.$element\n      .one('bsTransitionEnd', $.proxy(complete, this))\n      .emulateTransitionEnd(350)[dimension](this.$element[0][scrollSize])\n  }\n\n  Collapse.prototype.hide = function () {\n    if (this.transitioning || !this.$element.hasClass('in')) return\n\n    var startEvent = $.Event('hide.bs.collapse')\n    this.$element.trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) return\n\n    var dimension = this.dimension()\n\n    this.$element[dimension](this.$element[dimension]())[0].offsetHeight\n\n    this.$element\n      .addClass('collapsing')\n      .removeClass('collapse')\n      .removeClass('in')\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.transitioning = 0\n      this.$element\n        .trigger('hidden.bs.collapse')\n        .removeClass('collapsing')\n        .addClass('collapse')\n    }\n\n    if (!$.support.transition) return complete.call(this)\n\n    this.$element\n      [dimension](0)\n      .one('bsTransitionEnd', $.proxy(complete, this))\n      .emulateTransitionEnd(350)\n  }\n\n  Collapse.prototype.toggle = function () {\n    this[this.$element.hasClass('in') ? 'hide' : 'show']()\n  }\n\n\n  // COLLAPSE PLUGIN DEFINITION\n  // ==========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.collapse')\n      var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\n      if (!data && options.toggle && option == 'show') option = !option\n      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.collapse\n\n  $.fn.collapse             = Plugin\n  $.fn.collapse.Constructor = Collapse\n\n\n  // COLLAPSE NO CONFLICT\n  // ====================\n\n  $.fn.collapse.noConflict = function () {\n    $.fn.collapse = old\n    return this\n  }\n\n\n  // COLLAPSE DATA-API\n  // =================\n\n  $(document).on('click.bs.collapse.data-api', '[data-toggle=\"collapse\"]', function (e) {\n    var href\n    var $this   = $(this)\n    var target  = $this.attr('data-target')\n        || e.preventDefault()\n        || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '') // strip for ie7\n    var $target = $(target)\n    var data    = $target.data('bs.collapse')\n    var option  = data ? 'toggle' : $this.data()\n    var parent  = $this.attr('data-parent')\n    var $parent = parent && $(parent)\n\n    if (!data || !data.transitioning) {\n      if ($parent) $parent.find('[data-toggle=\"collapse\"][data-parent=\"' + parent + '\"]').not($this).addClass('collapsed')\n      $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed')\n    }\n\n    Plugin.call($target, option)\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: dropdown.js v3.2.0\n * http://getbootstrap.com/javascript/#dropdowns\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // DROPDOWN CLASS DEFINITION\n  // =========================\n\n  var backdrop = '.dropdown-backdrop'\n  var toggle   = '[data-toggle=\"dropdown\"]'\n  var Dropdown = function (element) {\n    $(element).on('click.bs.dropdown', this.toggle)\n  }\n\n  Dropdown.VERSION = '3.2.0'\n\n  Dropdown.prototype.toggle = function (e) {\n    var $this = $(this)\n\n    if ($this.is('.disabled, :disabled')) return\n\n    var $parent  = getParent($this)\n    var isActive = $parent.hasClass('open')\n\n    clearMenus()\n\n    if (!isActive) {\n      if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {\n        // if mobile we use a backdrop because click events don't delegate\n        $('<div class=\"dropdown-backdrop\"/>').insertAfter($(this)).on('click', clearMenus)\n      }\n\n      var relatedTarget = { relatedTarget: this }\n      $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))\n\n      if (e.isDefaultPrevented()) return\n\n      $this.trigger('focus')\n\n      $parent\n        .toggleClass('open')\n        .trigger('shown.bs.dropdown', relatedTarget)\n    }\n\n    return false\n  }\n\n  Dropdown.prototype.keydown = function (e) {\n    if (!/(38|40|27)/.test(e.keyCode)) return\n\n    var $this = $(this)\n\n    e.preventDefault()\n    e.stopPropagation()\n\n    if ($this.is('.disabled, :disabled')) return\n\n    var $parent  = getParent($this)\n    var isActive = $parent.hasClass('open')\n\n    if (!isActive || (isActive && e.keyCode == 27)) {\n      if (e.which == 27) $parent.find(toggle).trigger('focus')\n      return $this.trigger('click')\n    }\n\n    var desc = ' li:not(.divider):visible a'\n    var $items = $parent.find('[role=\"menu\"]' + desc + ', [role=\"listbox\"]' + desc)\n\n    if (!$items.length) return\n\n    var index = $items.index($items.filter(':focus'))\n\n    if (e.keyCode == 38 && index > 0)                 index--                        // up\n    if (e.keyCode == 40 && index < $items.length - 1) index++                        // down\n    if (!~index)                                      index = 0\n\n    $items.eq(index).trigger('focus')\n  }\n\n  function clearMenus(e) {\n    if (e && e.which === 3) return\n    $(backdrop).remove()\n    $(toggle).each(function () {\n      var $parent = getParent($(this))\n      var relatedTarget = { relatedTarget: this }\n      if (!$parent.hasClass('open')) return\n      $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))\n      if (e.isDefaultPrevented()) return\n      $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget)\n    })\n  }\n\n  function getParent($this) {\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n    }\n\n    var $parent = selector && $(selector)\n\n    return $parent && $parent.length ? $parent : $this.parent()\n  }\n\n\n  // DROPDOWN PLUGIN DEFINITION\n  // ==========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.dropdown')\n\n      if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  var old = $.fn.dropdown\n\n  $.fn.dropdown             = Plugin\n  $.fn.dropdown.Constructor = Dropdown\n\n\n  // DROPDOWN NO CONFLICT\n  // ====================\n\n  $.fn.dropdown.noConflict = function () {\n    $.fn.dropdown = old\n    return this\n  }\n\n\n  // APPLY TO STANDARD DROPDOWN ELEMENTS\n  // ===================================\n\n  $(document)\n    .on('click.bs.dropdown.data-api', clearMenus)\n    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })\n    .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)\n    .on('keydown.bs.dropdown.data-api', toggle + ', [role=\"menu\"], [role=\"listbox\"]', Dropdown.prototype.keydown)\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: modal.js v3.2.0\n * http://getbootstrap.com/javascript/#modals\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // MODAL CLASS DEFINITION\n  // ======================\n\n  var Modal = function (element, options) {\n    this.options        = options\n    this.$body          = $(document.body)\n    this.$element       = $(element)\n    this.$backdrop      =\n    this.isShown        = null\n    this.scrollbarWidth = 0\n\n    if (this.options.remote) {\n      this.$element\n        .find('.modal-content')\n        .load(this.options.remote, $.proxy(function () {\n          this.$element.trigger('loaded.bs.modal')\n        }, this))\n    }\n  }\n\n  Modal.VERSION  = '3.2.0'\n\n  Modal.DEFAULTS = {\n    backdrop: true,\n    keyboard: true,\n    show: true\n  }\n\n  Modal.prototype.toggle = function (_relatedTarget) {\n    return this.isShown ? this.hide() : this.show(_relatedTarget)\n  }\n\n  Modal.prototype.show = function (_relatedTarget) {\n    var that = this\n    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })\n\n    this.$element.trigger(e)\n\n    if (this.isShown || e.isDefaultPrevented()) return\n\n    this.isShown = true\n\n    this.checkScrollbar()\n    this.$body.addClass('modal-open')\n\n    this.setScrollbar()\n    this.escape()\n\n    this.$element.on('click.dismiss.bs.modal', '[data-dismiss=\"modal\"]', $.proxy(this.hide, this))\n\n    this.backdrop(function () {\n      var transition = $.support.transition && that.$element.hasClass('fade')\n\n      if (!that.$element.parent().length) {\n        that.$element.appendTo(that.$body) // don't move modals dom position\n      }\n\n      that.$element\n        .show()\n        .scrollTop(0)\n\n      if (transition) {\n        that.$element[0].offsetWidth // force reflow\n      }\n\n      that.$element\n        .addClass('in')\n        .attr('aria-hidden', false)\n\n      that.enforceFocus()\n\n      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })\n\n      transition ?\n        that.$element.find('.modal-dialog') // wait for modal to slide in\n          .one('bsTransitionEnd', function () {\n            that.$element.trigger('focus').trigger(e)\n          })\n          .emulateTransitionEnd(300) :\n        that.$element.trigger('focus').trigger(e)\n    })\n  }\n\n  Modal.prototype.hide = function (e) {\n    if (e) e.preventDefault()\n\n    e = $.Event('hide.bs.modal')\n\n    this.$element.trigger(e)\n\n    if (!this.isShown || e.isDefaultPrevented()) return\n\n    this.isShown = false\n\n    this.$body.removeClass('modal-open')\n\n    this.resetScrollbar()\n    this.escape()\n\n    $(document).off('focusin.bs.modal')\n\n    this.$element\n      .removeClass('in')\n      .attr('aria-hidden', true)\n      .off('click.dismiss.bs.modal')\n\n    $.support.transition && this.$element.hasClass('fade') ?\n      this.$element\n        .one('bsTransitionEnd', $.proxy(this.hideModal, this))\n        .emulateTransitionEnd(300) :\n      this.hideModal()\n  }\n\n  Modal.prototype.enforceFocus = function () {\n    $(document)\n      .off('focusin.bs.modal') // guard against infinite focus loop\n      .on('focusin.bs.modal', $.proxy(function (e) {\n        if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {\n          this.$element.trigger('focus')\n        }\n      }, this))\n  }\n\n  Modal.prototype.escape = function () {\n    if (this.isShown && this.options.keyboard) {\n      this.$element.on('keyup.dismiss.bs.modal', $.proxy(function (e) {\n        e.which == 27 && this.hide()\n      }, this))\n    } else if (!this.isShown) {\n      this.$element.off('keyup.dismiss.bs.modal')\n    }\n  }\n\n  Modal.prototype.hideModal = function () {\n    var that = this\n    this.$element.hide()\n    this.backdrop(function () {\n      that.$element.trigger('hidden.bs.modal')\n    })\n  }\n\n  Modal.prototype.removeBackdrop = function () {\n    this.$backdrop && this.$backdrop.remove()\n    this.$backdrop = null\n  }\n\n  Modal.prototype.backdrop = function (callback) {\n    var that = this\n    var animate = this.$element.hasClass('fade') ? 'fade' : ''\n\n    if (this.isShown && this.options.backdrop) {\n      var doAnimate = $.support.transition && animate\n\n      this.$backdrop = $('<div class=\"modal-backdrop ' + animate + '\" />')\n        .appendTo(this.$body)\n\n      this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {\n        if (e.target !== e.currentTarget) return\n        this.options.backdrop == 'static'\n          ? this.$element[0].focus.call(this.$element[0])\n          : this.hide.call(this)\n      }, this))\n\n      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow\n\n      this.$backdrop.addClass('in')\n\n      if (!callback) return\n\n      doAnimate ?\n        this.$backdrop\n          .one('bsTransitionEnd', callback)\n          .emulateTransitionEnd(150) :\n        callback()\n\n    } else if (!this.isShown && this.$backdrop) {\n      this.$backdrop.removeClass('in')\n\n      var callbackRemove = function () {\n        that.removeBackdrop()\n        callback && callback()\n      }\n      $.support.transition && this.$element.hasClass('fade') ?\n        this.$backdrop\n          .one('bsTransitionEnd', callbackRemove)\n          .emulateTransitionEnd(150) :\n        callbackRemove()\n\n    } else if (callback) {\n      callback()\n    }\n  }\n\n  Modal.prototype.checkScrollbar = function () {\n    if (document.body.clientWidth >= window.innerWidth) return\n    this.scrollbarWidth = this.scrollbarWidth || this.measureScrollbar()\n  }\n\n  Modal.prototype.setScrollbar = function () {\n    var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)\n    if (this.scrollbarWidth) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)\n  }\n\n  Modal.prototype.resetScrollbar = function () {\n    this.$body.css('padding-right', '')\n  }\n\n  Modal.prototype.measureScrollbar = function () { // thx walsh\n    var scrollDiv = document.createElement('div')\n    scrollDiv.className = 'modal-scrollbar-measure'\n    this.$body.append(scrollDiv)\n    var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth\n    this.$body[0].removeChild(scrollDiv)\n    return scrollbarWidth\n  }\n\n\n  // MODAL PLUGIN DEFINITION\n  // =======================\n\n  function Plugin(option, _relatedTarget) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.modal')\n      var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\n      if (!data) $this.data('bs.modal', (data = new Modal(this, options)))\n      if (typeof option == 'string') data[option](_relatedTarget)\n      else if (options.show) data.show(_relatedTarget)\n    })\n  }\n\n  var old = $.fn.modal\n\n  $.fn.modal             = Plugin\n  $.fn.modal.Constructor = Modal\n\n\n  // MODAL NO CONFLICT\n  // =================\n\n  $.fn.modal.noConflict = function () {\n    $.fn.modal = old\n    return this\n  }\n\n\n  // MODAL DATA-API\n  // ==============\n\n  $(document).on('click.bs.modal.data-api', '[data-toggle=\"modal\"]', function (e) {\n    var $this   = $(this)\n    var href    = $this.attr('href')\n    var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\\s]+$)/, ''))) // strip for ie7\n    var option  = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())\n\n    if ($this.is('a')) e.preventDefault()\n\n    $target.one('show.bs.modal', function (showEvent) {\n      if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown\n      $target.one('hidden.bs.modal', function () {\n        $this.is(':visible') && $this.trigger('focus')\n      })\n    })\n    Plugin.call($target, option, this)\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: tooltip.js v3.2.0\n * http://getbootstrap.com/javascript/#tooltip\n * Inspired by the original jQuery.tipsy by Jason Frame\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // TOOLTIP PUBLIC CLASS DEFINITION\n  // ===============================\n\n  var Tooltip = function (element, options) {\n    this.type       =\n    this.options    =\n    this.enabled    =\n    this.timeout    =\n    this.hoverState =\n    this.$element   = null\n\n    this.init('tooltip', element, options)\n  }\n\n  Tooltip.VERSION  = '3.2.0'\n\n  Tooltip.DEFAULTS = {\n    animation: true,\n    placement: 'top',\n    selector: false,\n    template: '<div class=\"tooltip\" role=\"tooltip\"><div class=\"tooltip-arrow\"></div><div class=\"tooltip-inner\"></div></div>',\n    trigger: 'hover focus',\n    title: '',\n    delay: 0,\n    html: false,\n    container: false,\n    viewport: {\n      selector: 'body',\n      padding: 0\n    }\n  }\n\n  Tooltip.prototype.init = function (type, element, options) {\n    this.enabled   = true\n    this.type      = type\n    this.$element  = $(element)\n    this.options   = this.getOptions(options)\n    this.$viewport = this.options.viewport && $(this.options.viewport.selector || this.options.viewport)\n\n    var triggers = this.options.trigger.split(' ')\n\n    for (var i = triggers.length; i--;) {\n      var trigger = triggers[i]\n\n      if (trigger == 'click') {\n        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))\n      } else if (trigger != 'manual') {\n        var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focusin'\n        var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'\n\n        this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))\n        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))\n      }\n    }\n\n    this.options.selector ?\n      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :\n      this.fixTitle()\n  }\n\n  Tooltip.prototype.getDefaults = function () {\n    return Tooltip.DEFAULTS\n  }\n\n  Tooltip.prototype.getOptions = function (options) {\n    options = $.extend({}, this.getDefaults(), this.$element.data(), options)\n\n    if (options.delay && typeof options.delay == 'number') {\n      options.delay = {\n        show: options.delay,\n        hide: options.delay\n      }\n    }\n\n    return options\n  }\n\n  Tooltip.prototype.getDelegateOptions = function () {\n    var options  = {}\n    var defaults = this.getDefaults()\n\n    this._options && $.each(this._options, function (key, value) {\n      if (defaults[key] != value) options[key] = value\n    })\n\n    return options\n  }\n\n  Tooltip.prototype.enter = function (obj) {\n    var self = obj instanceof this.constructor ?\n      obj : $(obj.currentTarget).data('bs.' + this.type)\n\n    if (!self) {\n      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())\n      $(obj.currentTarget).data('bs.' + this.type, self)\n    }\n\n    clearTimeout(self.timeout)\n\n    self.hoverState = 'in'\n\n    if (!self.options.delay || !self.options.delay.show) return self.show()\n\n    self.timeout = setTimeout(function () {\n      if (self.hoverState == 'in') self.show()\n    }, self.options.delay.show)\n  }\n\n  Tooltip.prototype.leave = function (obj) {\n    var self = obj instanceof this.constructor ?\n      obj : $(obj.currentTarget).data('bs.' + this.type)\n\n    if (!self) {\n      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())\n      $(obj.currentTarget).data('bs.' + this.type, self)\n    }\n\n    clearTimeout(self.timeout)\n\n    self.hoverState = 'out'\n\n    if (!self.options.delay || !self.options.delay.hide) return self.hide()\n\n    self.timeout = setTimeout(function () {\n      if (self.hoverState == 'out') self.hide()\n    }, self.options.delay.hide)\n  }\n\n  Tooltip.prototype.show = function () {\n    var e = $.Event('show.bs.' + this.type)\n\n    if (this.hasContent() && this.enabled) {\n      this.$element.trigger(e)\n\n      var inDom = $.contains(document.documentElement, this.$element[0])\n      if (e.isDefaultPrevented() || !inDom) return\n      var that = this\n\n      var $tip = this.tip()\n\n      var tipId = this.getUID(this.type)\n\n      this.setContent()\n      $tip.attr('id', tipId)\n      this.$element.attr('aria-describedby', tipId)\n\n      if (this.options.animation) $tip.addClass('fade')\n\n      var placement = typeof this.options.placement == 'function' ?\n        this.options.placement.call(this, $tip[0], this.$element[0]) :\n        this.options.placement\n\n      var autoToken = /\\s?auto?\\s?/i\n      var autoPlace = autoToken.test(placement)\n      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'\n\n      $tip\n        .detach()\n        .css({ top: 0, left: 0, display: 'block' })\n        .addClass(placement)\n        .data('bs.' + this.type, this)\n\n      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)\n\n      var pos          = this.getPosition()\n      var actualWidth  = $tip[0].offsetWidth\n      var actualHeight = $tip[0].offsetHeight\n\n      if (autoPlace) {\n        var orgPlacement = placement\n        var $parent      = this.$element.parent()\n        var parentDim    = this.getPosition($parent)\n\n        placement = placement == 'bottom' && pos.top   + pos.height       + actualHeight - parentDim.scroll > parentDim.height ? 'top'    :\n                    placement == 'top'    && pos.top   - parentDim.scroll - actualHeight < 0                                   ? 'bottom' :\n                    placement == 'right'  && pos.right + actualWidth      > parentDim.width                                    ? 'left'   :\n                    placement == 'left'   && pos.left  - actualWidth      < parentDim.left                                     ? 'right'  :\n                    placement\n\n        $tip\n          .removeClass(orgPlacement)\n          .addClass(placement)\n      }\n\n      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)\n\n      this.applyPlacement(calculatedOffset, placement)\n\n      var complete = function () {\n        that.$element.trigger('shown.bs.' + that.type)\n        that.hoverState = null\n      }\n\n      $.support.transition && this.$tip.hasClass('fade') ?\n        $tip\n          .one('bsTransitionEnd', complete)\n          .emulateTransitionEnd(150) :\n        complete()\n    }\n  }\n\n  Tooltip.prototype.applyPlacement = function (offset, placement) {\n    var $tip   = this.tip()\n    var width  = $tip[0].offsetWidth\n    var height = $tip[0].offsetHeight\n\n    // manually read margins because getBoundingClientRect includes difference\n    var marginTop = parseInt($tip.css('margin-top'), 10)\n    var marginLeft = parseInt($tip.css('margin-left'), 10)\n\n    // we must check for NaN for ie 8/9\n    if (isNaN(marginTop))  marginTop  = 0\n    if (isNaN(marginLeft)) marginLeft = 0\n\n    offset.top  = offset.top  + marginTop\n    offset.left = offset.left + marginLeft\n\n    // $.fn.offset doesn't round pixel values\n    // so we use setOffset directly with our own function B-0\n    $.offset.setOffset($tip[0], $.extend({\n      using: function (props) {\n        $tip.css({\n          top: Math.round(props.top),\n          left: Math.round(props.left)\n        })\n      }\n    }, offset), 0)\n\n    $tip.addClass('in')\n\n    // check to see if placing tip in new offset caused the tip to resize itself\n    var actualWidth  = $tip[0].offsetWidth\n    var actualHeight = $tip[0].offsetHeight\n\n    if (placement == 'top' && actualHeight != height) {\n      offset.top = offset.top + height - actualHeight\n    }\n\n    var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)\n\n    if (delta.left) offset.left += delta.left\n    else offset.top += delta.top\n\n    var arrowDelta          = delta.left ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight\n    var arrowPosition       = delta.left ? 'left'        : 'top'\n    var arrowOffsetPosition = delta.left ? 'offsetWidth' : 'offsetHeight'\n\n    $tip.offset(offset)\n    this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], arrowPosition)\n  }\n\n  Tooltip.prototype.replaceArrow = function (delta, dimension, position) {\n    this.arrow().css(position, delta ? (50 * (1 - delta / dimension) + '%') : '')\n  }\n\n  Tooltip.prototype.setContent = function () {\n    var $tip  = this.tip()\n    var title = this.getTitle()\n\n    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)\n    $tip.removeClass('fade in top bottom left right')\n  }\n\n  Tooltip.prototype.hide = function () {\n    var that = this\n    var $tip = this.tip()\n    var e    = $.Event('hide.bs.' + this.type)\n\n    this.$element.removeAttr('aria-describedby')\n\n    function complete() {\n      if (that.hoverState != 'in') $tip.detach()\n      that.$element.trigger('hidden.bs.' + that.type)\n    }\n\n    this.$element.trigger(e)\n\n    if (e.isDefaultPrevented()) return\n\n    $tip.removeClass('in')\n\n    $.support.transition && this.$tip.hasClass('fade') ?\n      $tip\n        .one('bsTransitionEnd', complete)\n        .emulateTransitionEnd(150) :\n      complete()\n\n    this.hoverState = null\n\n    return this\n  }\n\n  Tooltip.prototype.fixTitle = function () {\n    var $e = this.$element\n    if ($e.attr('title') || typeof ($e.attr('data-original-title')) != 'string') {\n      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')\n    }\n  }\n\n  Tooltip.prototype.hasContent = function () {\n    return this.getTitle()\n  }\n\n  Tooltip.prototype.getPosition = function ($element) {\n    $element   = $element || this.$element\n    var el     = $element[0]\n    var isBody = el.tagName == 'BODY'\n    return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : null, {\n      scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop(),\n      width:  isBody ? $(window).width()  : $element.outerWidth(),\n      height: isBody ? $(window).height() : $element.outerHeight()\n    }, isBody ? { top: 0, left: 0 } : $element.offset())\n  }\n\n  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {\n    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2  } :\n           placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2  } :\n           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :\n        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width   }\n\n  }\n\n  Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {\n    var delta = { top: 0, left: 0 }\n    if (!this.$viewport) return delta\n\n    var viewportPadding = this.options.viewport && this.options.viewport.padding || 0\n    var viewportDimensions = this.getPosition(this.$viewport)\n\n    if (/right|left/.test(placement)) {\n      var topEdgeOffset    = pos.top - viewportPadding - viewportDimensions.scroll\n      var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight\n      if (topEdgeOffset < viewportDimensions.top) { // top overflow\n        delta.top = viewportDimensions.top - topEdgeOffset\n      } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow\n        delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset\n      }\n    } else {\n      var leftEdgeOffset  = pos.left - viewportPadding\n      var rightEdgeOffset = pos.left + viewportPadding + actualWidth\n      if (leftEdgeOffset < viewportDimensions.left) { // left overflow\n        delta.left = viewportDimensions.left - leftEdgeOffset\n      } else if (rightEdgeOffset > viewportDimensions.width) { // right overflow\n        delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset\n      }\n    }\n\n    return delta\n  }\n\n  Tooltip.prototype.getTitle = function () {\n    var title\n    var $e = this.$element\n    var o  = this.options\n\n    title = $e.attr('data-original-title')\n      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)\n\n    return title\n  }\n\n  Tooltip.prototype.getUID = function (prefix) {\n    do prefix += ~~(Math.random() * 1000000)\n    while (document.getElementById(prefix))\n    return prefix\n  }\n\n  Tooltip.prototype.tip = function () {\n    return (this.$tip = this.$tip || $(this.options.template))\n  }\n\n  Tooltip.prototype.arrow = function () {\n    return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))\n  }\n\n  Tooltip.prototype.validate = function () {\n    if (!this.$element[0].parentNode) {\n      this.hide()\n      this.$element = null\n      this.options  = null\n    }\n  }\n\n  Tooltip.prototype.enable = function () {\n    this.enabled = true\n  }\n\n  Tooltip.prototype.disable = function () {\n    this.enabled = false\n  }\n\n  Tooltip.prototype.toggleEnabled = function () {\n    this.enabled = !this.enabled\n  }\n\n  Tooltip.prototype.toggle = function (e) {\n    var self = this\n    if (e) {\n      self = $(e.currentTarget).data('bs.' + this.type)\n      if (!self) {\n        self = new this.constructor(e.currentTarget, this.getDelegateOptions())\n        $(e.currentTarget).data('bs.' + this.type, self)\n      }\n    }\n\n    self.tip().hasClass('in') ? self.leave(self) : self.enter(self)\n  }\n\n  Tooltip.prototype.destroy = function () {\n    clearTimeout(this.timeout)\n    this.hide().$element.off('.' + this.type).removeData('bs.' + this.type)\n  }\n\n\n  // TOOLTIP PLUGIN DEFINITION\n  // =========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.tooltip')\n      var options = typeof option == 'object' && option\n\n      if (!data && option == 'destroy') return\n      if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.tooltip\n\n  $.fn.tooltip             = Plugin\n  $.fn.tooltip.Constructor = Tooltip\n\n\n  // TOOLTIP NO CONFLICT\n  // ===================\n\n  $.fn.tooltip.noConflict = function () {\n    $.fn.tooltip = old\n    return this\n  }\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: popover.js v3.2.0\n * http://getbootstrap.com/javascript/#popovers\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // POPOVER PUBLIC CLASS DEFINITION\n  // ===============================\n\n  var Popover = function (element, options) {\n    this.init('popover', element, options)\n  }\n\n  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')\n\n  Popover.VERSION  = '3.2.0'\n\n  Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {\n    placement: 'right',\n    trigger: 'click',\n    content: '',\n    template: '<div class=\"popover\" role=\"tooltip\"><div class=\"arrow\"></div><h3 class=\"popover-title\"></h3><div class=\"popover-content\"></div></div>'\n  })\n\n\n  // NOTE: POPOVER EXTENDS tooltip.js\n  // ================================\n\n  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)\n\n  Popover.prototype.constructor = Popover\n\n  Popover.prototype.getDefaults = function () {\n    return Popover.DEFAULTS\n  }\n\n  Popover.prototype.setContent = function () {\n    var $tip    = this.tip()\n    var title   = this.getTitle()\n    var content = this.getContent()\n\n    $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)\n    $tip.find('.popover-content').empty()[ // we use append for html objects to maintain js events\n      this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'\n    ](content)\n\n    $tip.removeClass('fade top bottom left right in')\n\n    // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do\n    // this manually by checking the contents.\n    if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()\n  }\n\n  Popover.prototype.hasContent = function () {\n    return this.getTitle() || this.getContent()\n  }\n\n  Popover.prototype.getContent = function () {\n    var $e = this.$element\n    var o  = this.options\n\n    return $e.attr('data-content')\n      || (typeof o.content == 'function' ?\n            o.content.call($e[0]) :\n            o.content)\n  }\n\n  Popover.prototype.arrow = function () {\n    return (this.$arrow = this.$arrow || this.tip().find('.arrow'))\n  }\n\n  Popover.prototype.tip = function () {\n    if (!this.$tip) this.$tip = $(this.options.template)\n    return this.$tip\n  }\n\n\n  // POPOVER PLUGIN DEFINITION\n  // =========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.popover')\n      var options = typeof option == 'object' && option\n\n      if (!data && option == 'destroy') return\n      if (!data) $this.data('bs.popover', (data = new Popover(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.popover\n\n  $.fn.popover             = Plugin\n  $.fn.popover.Constructor = Popover\n\n\n  // POPOVER NO CONFLICT\n  // ===================\n\n  $.fn.popover.noConflict = function () {\n    $.fn.popover = old\n    return this\n  }\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: scrollspy.js v3.2.0\n * http://getbootstrap.com/javascript/#scrollspy\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // SCROLLSPY CLASS DEFINITION\n  // ==========================\n\n  function ScrollSpy(element, options) {\n    var process  = $.proxy(this.process, this)\n\n    this.$body          = $('body')\n    this.$scrollElement = $(element).is('body') ? $(window) : $(element)\n    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)\n    this.selector       = (this.options.target || '') + ' .nav li > a'\n    this.offsets        = []\n    this.targets        = []\n    this.activeTarget   = null\n    this.scrollHeight   = 0\n\n    this.$scrollElement.on('scroll.bs.scrollspy', process)\n    this.refresh()\n    this.process()\n  }\n\n  ScrollSpy.VERSION  = '3.2.0'\n\n  ScrollSpy.DEFAULTS = {\n    offset: 10\n  }\n\n  ScrollSpy.prototype.getScrollHeight = function () {\n    return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)\n  }\n\n  ScrollSpy.prototype.refresh = function () {\n    var offsetMethod = 'offset'\n    var offsetBase   = 0\n\n    if (!$.isWindow(this.$scrollElement[0])) {\n      offsetMethod = 'position'\n      offsetBase   = this.$scrollElement.scrollTop()\n    }\n\n    this.offsets = []\n    this.targets = []\n    this.scrollHeight = this.getScrollHeight()\n\n    var self     = this\n\n    this.$body\n      .find(this.selector)\n      .map(function () {\n        var $el   = $(this)\n        var href  = $el.data('target') || $el.attr('href')\n        var $href = /^#./.test(href) && $(href)\n\n        return ($href\n          && $href.length\n          && $href.is(':visible')\n          && [[$href[offsetMethod]().top + offsetBase, href]]) || null\n      })\n      .sort(function (a, b) { return a[0] - b[0] })\n      .each(function () {\n        self.offsets.push(this[0])\n        self.targets.push(this[1])\n      })\n  }\n\n  ScrollSpy.prototype.process = function () {\n    var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset\n    var scrollHeight = this.getScrollHeight()\n    var maxScroll    = this.options.offset + scrollHeight - this.$scrollElement.height()\n    var offsets      = this.offsets\n    var targets      = this.targets\n    var activeTarget = this.activeTarget\n    var i\n\n    if (this.scrollHeight != scrollHeight) {\n      this.refresh()\n    }\n\n    if (scrollTop >= maxScroll) {\n      return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)\n    }\n\n    if (activeTarget && scrollTop <= offsets[0]) {\n      return activeTarget != (i = targets[0]) && this.activate(i)\n    }\n\n    for (i = offsets.length; i--;) {\n      activeTarget != targets[i]\n        && scrollTop >= offsets[i]\n        && (!offsets[i + 1] || scrollTop <= offsets[i + 1])\n        && this.activate(targets[i])\n    }\n  }\n\n  ScrollSpy.prototype.activate = function (target) {\n    this.activeTarget = target\n\n    $(this.selector)\n      .parentsUntil(this.options.target, '.active')\n      .removeClass('active')\n\n    var selector = this.selector +\n        '[data-target=\"' + target + '\"],' +\n        this.selector + '[href=\"' + target + '\"]'\n\n    var active = $(selector)\n      .parents('li')\n      .addClass('active')\n\n    if (active.parent('.dropdown-menu').length) {\n      active = active\n        .closest('li.dropdown')\n        .addClass('active')\n    }\n\n    active.trigger('activate.bs.scrollspy')\n  }\n\n\n  // SCROLLSPY PLUGIN DEFINITION\n  // ===========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.scrollspy')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.scrollspy\n\n  $.fn.scrollspy             = Plugin\n  $.fn.scrollspy.Constructor = ScrollSpy\n\n\n  // SCROLLSPY NO CONFLICT\n  // =====================\n\n  $.fn.scrollspy.noConflict = function () {\n    $.fn.scrollspy = old\n    return this\n  }\n\n\n  // SCROLLSPY DATA-API\n  // ==================\n\n  $(window).on('load.bs.scrollspy.data-api', function () {\n    $('[data-spy=\"scroll\"]').each(function () {\n      var $spy = $(this)\n      Plugin.call($spy, $spy.data())\n    })\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: tab.js v3.2.0\n * http://getbootstrap.com/javascript/#tabs\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // TAB CLASS DEFINITION\n  // ====================\n\n  var Tab = function (element) {\n    this.element = $(element)\n  }\n\n  Tab.VERSION = '3.2.0'\n\n  Tab.prototype.show = function () {\n    var $this    = this.element\n    var $ul      = $this.closest('ul:not(.dropdown-menu)')\n    var selector = $this.data('target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n    }\n\n    if ($this.parent('li').hasClass('active')) return\n\n    var previous = $ul.find('.active:last a')[0]\n    var e        = $.Event('show.bs.tab', {\n      relatedTarget: previous\n    })\n\n    $this.trigger(e)\n\n    if (e.isDefaultPrevented()) return\n\n    var $target = $(selector)\n\n    this.activate($this.closest('li'), $ul)\n    this.activate($target, $target.parent(), function () {\n      $this.trigger({\n        type: 'shown.bs.tab',\n        relatedTarget: previous\n      })\n    })\n  }\n\n  Tab.prototype.activate = function (element, container, callback) {\n    var $active    = container.find('> .active')\n    var transition = callback\n      && $.support.transition\n      && $active.hasClass('fade')\n\n    function next() {\n      $active\n        .removeClass('active')\n        .find('> .dropdown-menu > .active')\n        .removeClass('active')\n\n      element.addClass('active')\n\n      if (transition) {\n        element[0].offsetWidth // reflow for transition\n        element.addClass('in')\n      } else {\n        element.removeClass('fade')\n      }\n\n      if (element.parent('.dropdown-menu')) {\n        element.closest('li.dropdown').addClass('active')\n      }\n\n      callback && callback()\n    }\n\n    transition ?\n      $active\n        .one('bsTransitionEnd', next)\n        .emulateTransitionEnd(150) :\n      next()\n\n    $active.removeClass('in')\n  }\n\n\n  // TAB PLUGIN DEFINITION\n  // =====================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.tab')\n\n      if (!data) $this.data('bs.tab', (data = new Tab(this)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.tab\n\n  $.fn.tab             = Plugin\n  $.fn.tab.Constructor = Tab\n\n\n  // TAB NO CONFLICT\n  // ===============\n\n  $.fn.tab.noConflict = function () {\n    $.fn.tab = old\n    return this\n  }\n\n\n  // TAB DATA-API\n  // ============\n\n  $(document).on('click.bs.tab.data-api', '[data-toggle=\"tab\"], [data-toggle=\"pill\"]', function (e) {\n    e.preventDefault()\n    Plugin.call($(this), 'show')\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: affix.js v3.2.0\n * http://getbootstrap.com/javascript/#affix\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // AFFIX CLASS DEFINITION\n  // ======================\n\n  var Affix = function (element, options) {\n    this.options = $.extend({}, Affix.DEFAULTS, options)\n\n    this.$target = $(this.options.target)\n      .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))\n      .on('click.bs.affix.data-api',  $.proxy(this.checkPositionWithEventLoop, this))\n\n    this.$element     = $(element)\n    this.affixed      =\n    this.unpin        =\n    this.pinnedOffset = null\n\n    this.checkPosition()\n  }\n\n  Affix.VERSION  = '3.2.0'\n\n  Affix.RESET    = 'affix affix-top affix-bottom'\n\n  Affix.DEFAULTS = {\n    offset: 0,\n    target: window\n  }\n\n  Affix.prototype.getPinnedOffset = function () {\n    if (this.pinnedOffset) return this.pinnedOffset\n    this.$element.removeClass(Affix.RESET).addClass('affix')\n    var scrollTop = this.$target.scrollTop()\n    var position  = this.$element.offset()\n    return (this.pinnedOffset = position.top - scrollTop)\n  }\n\n  Affix.prototype.checkPositionWithEventLoop = function () {\n    setTimeout($.proxy(this.checkPosition, this), 1)\n  }\n\n  Affix.prototype.checkPosition = function () {\n    if (!this.$element.is(':visible')) return\n\n    var scrollHeight = $(document).height()\n    var scrollTop    = this.$target.scrollTop()\n    var position     = this.$element.offset()\n    var offset       = this.options.offset\n    var offsetTop    = offset.top\n    var offsetBottom = offset.bottom\n\n    if (typeof offset != 'object')         offsetBottom = offsetTop = offset\n    if (typeof offsetTop == 'function')    offsetTop    = offset.top(this.$element)\n    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)\n\n    var affix = this.unpin   != null && (scrollTop + this.unpin <= position.top) ? false :\n                offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? 'bottom' :\n                offsetTop    != null && (scrollTop <= offsetTop) ? 'top' : false\n\n    if (this.affixed === affix) return\n    if (this.unpin != null) this.$element.css('top', '')\n\n    var affixType = 'affix' + (affix ? '-' + affix : '')\n    var e         = $.Event(affixType + '.bs.affix')\n\n    this.$element.trigger(e)\n\n    if (e.isDefaultPrevented()) return\n\n    this.affixed = affix\n    this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null\n\n    this.$element\n      .removeClass(Affix.RESET)\n      .addClass(affixType)\n      .trigger($.Event(affixType.replace('affix', 'affixed')))\n\n    if (affix == 'bottom') {\n      this.$element.offset({\n        top: scrollHeight - this.$element.height() - offsetBottom\n      })\n    }\n  }\n\n\n  // AFFIX PLUGIN DEFINITION\n  // =======================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.affix')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.affix\n\n  $.fn.affix             = Plugin\n  $.fn.affix.Constructor = Affix\n\n\n  // AFFIX NO CONFLICT\n  // =================\n\n  $.fn.affix.noConflict = function () {\n    $.fn.affix = old\n    return this\n  }\n\n\n  // AFFIX DATA-API\n  // ==============\n\n  $(window).on('load', function () {\n    $('[data-spy=\"affix\"]').each(function () {\n      var $spy = $(this)\n      var data = $spy.data()\n\n      data.offset = data.offset || {}\n\n      if (data.offsetBottom) data.offset.bottom = data.offsetBottom\n      if (data.offsetTop)    data.offset.top    = data.offsetTop\n\n      Plugin.call($spy, data)\n    })\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * bootstrap-switch - v3.0.2\n * http://www.bootstrap-switch.org\n * ========================================================================\n * Copyright 2012-2013 Mattia Larentis\n *\n * ========================================================================\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================================\n */\n\n(function() {\n  var __slice = [].slice;\n\n  (function($, window) {\n    \"use strict\";\n    var BootstrapSwitch;\n    BootstrapSwitch = (function() {\n      function BootstrapSwitch(element, options) {\n        if (options == null) {\n          options = {};\n        }\n        this.$element = $(element);\n        this.options = $.extend({}, $.fn.bootstrapSwitch.defaults, {\n          state: this.$element.is(\":checked\"),\n          size: this.$element.data(\"size\"),\n          animate: this.$element.data(\"animate\"),\n          disabled: this.$element.is(\":disabled\"),\n          readonly: this.$element.is(\"[readonly]\"),\n          indeterminate: this.$element.data(\"indeterminate\"),\n          onColor: this.$element.data(\"on-color\"),\n          offColor: this.$element.data(\"off-color\"),\n          onText: this.$element.data(\"on-text\"),\n          offText: this.$element.data(\"off-text\"),\n          labelText: this.$element.data(\"label-text\"),\n          baseClass: this.$element.data(\"base-class\"),\n          wrapperClass: this.$element.data(\"wrapper-class\"),\n          radioAllOff: this.$element.data(\"radio-all-off\")\n        }, options);\n        this.$wrapper = $(\"<div>\", {\n          \"class\": (function(_this) {\n            return function() {\n              var classes;\n              classes = [\"\" + _this.options.baseClass].concat(_this._getClasses(_this.options.wrapperClass));\n              classes.push(_this.options.state ? \"\" + _this.options.baseClass + \"-on\" : \"\" + _this.options.baseClass + \"-off\");\n              if (_this.options.size != null) {\n                classes.push(\"\" + _this.options.baseClass + \"-\" + _this.options.size);\n              }\n              if (_this.options.animate) {\n                classes.push(\"\" + _this.options.baseClass + \"-animate\");\n              }\n              if (_this.options.disabled) {\n                classes.push(\"\" + _this.options.baseClass + \"-disabled\");\n              }\n              if (_this.options.readonly) {\n                classes.push(\"\" + _this.options.baseClass + \"-readonly\");\n              }\n              if (_this.options.indeterminate) {\n                classes.push(\"\" + _this.options.baseClass + \"-indeterminate\");\n              }\n              if (_this.$element.attr(\"id\")) {\n                classes.push(\"\" + _this.options.baseClass + \"-id-\" + (_this.$element.attr(\"id\")));\n              }\n              return classes.join(\" \");\n            };\n          })(this)()\n        });\n        this.$container = $(\"<div>\", {\n          \"class\": \"\" + this.options.baseClass + \"-container\"\n        });\n        this.$on = $(\"<span>\", {\n          html: this.options.onText,\n          \"class\": \"\" + this.options.baseClass + \"-handle-on \" + this.options.baseClass + \"-\" + this.options.onColor\n        });\n        this.$off = $(\"<span>\", {\n          html: this.options.offText,\n          \"class\": \"\" + this.options.baseClass + \"-handle-off \" + this.options.baseClass + \"-\" + this.options.offColor\n        });\n        this.$label = $(\"<label>\", {\n          html: this.options.labelText,\n          \"class\": \"\" + this.options.baseClass + \"-label\"\n        });\n        if (this.options.indeterminate) {\n          this.$element.prop(\"indeterminate\", true);\n        }\n        this.$element.on(\"init.bootstrapSwitch\", (function(_this) {\n          return function() {\n            return _this.options.onInit.apply(element, arguments);\n          };\n        })(this));\n        this.$element.on(\"switchChange.bootstrapSwitch\", (function(_this) {\n          return function() {\n            return _this.options.onSwitchChange.apply(element, arguments);\n          };\n        })(this));\n        this.$container = this.$element.wrap(this.$container).parent();\n        this.$wrapper = this.$container.wrap(this.$wrapper).parent();\n        this.$element.before(this.$on).before(this.$label).before(this.$off).trigger(\"init.bootstrapSwitch\");\n        this._elementHandlers();\n        this._handleHandlers();\n        this._labelHandlers();\n        this._formHandler();\n      }\n\n      BootstrapSwitch.prototype._constructor = BootstrapSwitch;\n\n      BootstrapSwitch.prototype.state = function(value, skip) {\n        if (typeof value === \"undefined\") {\n          return this.options.state;\n        }\n        if (this.options.disabled || this.options.readonly || this.options.indeterminate) {\n          return this.$element;\n        }\n        if (this.options.state && !this.options.radioAllOff && this.$element.is(':radio')) {\n          return this.$element;\n        }\n        value = !!value;\n        this.$element.prop(\"checked\", value).trigger(\"change.bootstrapSwitch\", skip);\n        return this.$element;\n      };\n\n      BootstrapSwitch.prototype.toggleState = function(skip) {\n        if (this.options.disabled || this.options.readonly || this.options.indeterminate) {\n          return this.$element;\n        }\n        return this.$element.prop(\"checked\", !this.options.state).trigger(\"change.bootstrapSwitch\", skip);\n      };\n\n      BootstrapSwitch.prototype.size = function(value) {\n        if (typeof value === \"undefined\") {\n          return this.options.size;\n        }\n        if (this.options.size != null) {\n          this.$wrapper.removeClass(\"\" + this.options.baseClass + \"-\" + this.options.size);\n        }\n        if (value) {\n          this.$wrapper.addClass(\"\" + this.options.baseClass + \"-\" + value);\n        }\n        this.options.size = value;\n        return this.$element;\n      };\n\n      BootstrapSwitch.prototype.animate = function(value) {\n        if (typeof value === \"undefined\") {\n          return this.options.animate;\n        }\n        value = !!value;\n        this.$wrapper[value ? \"addClass\" : \"removeClass\"](\"\" + this.options.baseClass + \"-animate\");\n        this.options.animate = value;\n        return this.$element;\n      };\n\n      BootstrapSwitch.prototype.disabled = function(value) {\n        if (typeof value === \"undefined\") {\n          return this.options.disabled;\n        }\n        value = !!value;\n        this.$wrapper[value ? \"addClass\" : \"removeClass\"](\"\" + this.options.baseClass + \"-disabled\");\n        this.$element.prop(\"disabled\", value);\n        this.options.disabled = value;\n        return this.$element;\n      };\n\n      BootstrapSwitch.prototype.toggleDisabled = function() {\n        this.$element.prop(\"disabled\", !this.options.disabled);\n        this.$wrapper.toggleClass(\"\" + this.options.baseClass + \"-disabled\");\n        this.options.disabled = !this.options.disabled;\n        return this.$element;\n      };\n\n      BootstrapSwitch.prototype.readonly = function(value) {\n        if (typeof value === \"undefined\") {\n          return this.options.readonly;\n        }\n        value = !!value;\n        this.$wrapper[value ? \"addClass\" : \"removeClass\"](\"\" + this.options.baseClass + \"-readonly\");\n        this.$element.prop(\"readonly\", value);\n        this.options.readonly = value;\n        return this.$element;\n      };\n\n      BootstrapSwitch.prototype.toggleReadonly = function() {\n        this.$element.prop(\"readonly\", !this.options.readonly);\n        this.$wrapper.toggleClass(\"\" + this.options.baseClass + \"-readonly\");\n        this.options.readonly = !this.options.readonly;\n        return this.$element;\n      };\n\n      BootstrapSwitch.prototype.indeterminate = function(value) {\n        if (typeof value === \"undefined\") {\n          return this.options.indeterminate;\n        }\n        value = !!value;\n        this.$wrapper[value ? \"addClass\" : \"removeClass\"](\"\" + this.options.baseClass + \"-indeterminate\");\n        this.$element.prop(\"indeterminate\", value);\n        this.options.indeterminate = value;\n        return this.$element;\n      };\n\n      BootstrapSwitch.prototype.toggleIndeterminate = function() {\n        this.$element.prop(\"indeterminate\", !this.options.indeterminate);\n        this.$wrapper.toggleClass(\"\" + this.options.baseClass + \"-indeterminate\");\n        this.options.indeterminate = !this.options.indeterminate;\n        return this.$element;\n      };\n\n      BootstrapSwitch.prototype.onColor = function(value) {\n        var color;\n        color = this.options.onColor;\n        if (typeof value === \"undefined\") {\n          return color;\n        }\n        if (color != null) {\n          this.$on.removeClass(\"\" + this.options.baseClass + \"-\" + color);\n        }\n        this.$on.addClass(\"\" + this.options.baseClass + \"-\" + value);\n        this.options.onColor = value;\n        return this.$element;\n      };\n\n      BootstrapSwitch.prototype.offColor = function(value) {\n        var color;\n        color = this.options.offColor;\n        if (typeof value === \"undefined\") {\n          return color;\n        }\n        if (color != null) {\n          this.$off.removeClass(\"\" + this.options.baseClass + \"-\" + color);\n        }\n        this.$off.addClass(\"\" + this.options.baseClass + \"-\" + value);\n        this.options.offColor = value;\n        return this.$element;\n      };\n\n      BootstrapSwitch.prototype.onText = function(value) {\n        if (typeof value === \"undefined\") {\n          return this.options.onText;\n        }\n        this.$on.html(value);\n        this.options.onText = value;\n        return this.$element;\n      };\n\n      BootstrapSwitch.prototype.offText = function(value) {\n        if (typeof value === \"undefined\") {\n          return this.options.offText;\n        }\n        this.$off.html(value);\n        this.options.offText = value;\n        return this.$element;\n      };\n\n      BootstrapSwitch.prototype.labelText = function(value) {\n        if (typeof value === \"undefined\") {\n          return this.options.labelText;\n        }\n        this.$label.html(value);\n        this.options.labelText = value;\n        return this.$element;\n      };\n\n      BootstrapSwitch.prototype.baseClass = function(value) {\n        return this.options.baseClass;\n      };\n\n      BootstrapSwitch.prototype.wrapperClass = function(value) {\n        if (typeof value === \"undefined\") {\n          return this.options.wrapperClass;\n        }\n        if (!value) {\n          value = $.fn.bootstrapSwitch.defaults.wrapperClass;\n        }\n        this.$wrapper.removeClass(this._getClasses(this.options.wrapperClass).join(\" \"));\n        this.$wrapper.addClass(this._getClasses(value).join(\" \"));\n        this.options.wrapperClass = value;\n        return this.$element;\n      };\n\n      BootstrapSwitch.prototype.radioAllOff = function(value) {\n        if (typeof value === \"undefined\") {\n          return this.options.radioAllOff;\n        }\n        this.options.radioAllOff = value;\n        return this.$element;\n      };\n\n      BootstrapSwitch.prototype.onInit = function(value) {\n        if (typeof value === \"undefined\") {\n          return this.options.onInit;\n        }\n        if (!value) {\n          value = $.fn.bootstrapSwitch.defaults.onInit;\n        }\n        this.options.onInit = value;\n        return this.$element;\n      };\n\n      BootstrapSwitch.prototype.onSwitchChange = function(value) {\n        if (typeof value === \"undefined\") {\n          return this.options.onSwitchChange;\n        }\n        if (!value) {\n          value = $.fn.bootstrapSwitch.defaults.onSwitchChange;\n        }\n        this.options.onSwitchChange = value;\n        return this.$element;\n      };\n\n      BootstrapSwitch.prototype.destroy = function() {\n        var $form;\n        $form = this.$element.closest(\"form\");\n        if ($form.length) {\n          $form.off(\"reset.bootstrapSwitch\").removeData(\"bootstrap-switch\");\n        }\n        this.$container.children().not(this.$element).remove();\n        this.$element.unwrap().unwrap().off(\".bootstrapSwitch\").removeData(\"bootstrap-switch\");\n        return this.$element;\n      };\n\n      BootstrapSwitch.prototype._elementHandlers = function() {\n        return this.$element.on({\n          \"change.bootstrapSwitch\": (function(_this) {\n            return function(e, skip) {\n              var checked;\n              e.preventDefault();\n              e.stopImmediatePropagation();\n              checked = _this.$element.is(\":checked\");\n              if (checked === _this.options.state) {\n                return;\n              }\n              _this.options.state = checked;\n              _this.$wrapper.removeClass(checked ? \"\" + _this.options.baseClass + \"-off\" : \"\" + _this.options.baseClass + \"-on\").addClass(checked ? \"\" + _this.options.baseClass + \"-on\" : \"\" + _this.options.baseClass + \"-off\");\n              if (!skip) {\n                if (_this.$element.is(\":radio\")) {\n                  $(\"[name='\" + (_this.$element.attr('name')) + \"']\").not(_this.$element).prop(\"checked\", false).trigger(\"change.bootstrapSwitch\", true);\n                }\n                return _this.$element.trigger(\"switchChange.bootstrapSwitch\", [checked]);\n              }\n            };\n          })(this),\n          \"focus.bootstrapSwitch\": (function(_this) {\n            return function(e) {\n              e.preventDefault();\n              return _this.$wrapper.addClass(\"\" + _this.options.baseClass + \"-focused\");\n            };\n          })(this),\n          \"blur.bootstrapSwitch\": (function(_this) {\n            return function(e) {\n              e.preventDefault();\n              return _this.$wrapper.removeClass(\"\" + _this.options.baseClass + \"-focused\");\n            };\n          })(this),\n          \"keydown.bootstrapSwitch\": (function(_this) {\n            return function(e) {\n              if (!e.which || _this.options.disabled || _this.options.readonly || _this.options.indeterminate) {\n                return;\n              }\n              switch (e.which) {\n                case 37:\n                  e.preventDefault();\n                  e.stopImmediatePropagation();\n                  return _this.state(false);\n                case 39:\n                  e.preventDefault();\n                  e.stopImmediatePropagation();\n                  return _this.state(true);\n              }\n            };\n          })(this)\n        });\n      };\n\n      BootstrapSwitch.prototype._handleHandlers = function() {\n        this.$on.on(\"click.bootstrapSwitch\", (function(_this) {\n          return function(e) {\n            _this.state(false);\n            return _this.$element.trigger(\"focus.bootstrapSwitch\");\n          };\n        })(this));\n        return this.$off.on(\"click.bootstrapSwitch\", (function(_this) {\n          return function(e) {\n            _this.state(true);\n            return _this.$element.trigger(\"focus.bootstrapSwitch\");\n          };\n        })(this));\n      };\n\n      BootstrapSwitch.prototype._labelHandlers = function() {\n        return this.$label.on({\n          \"mousemove.bootstrapSwitch touchmove.bootstrapSwitch\": (function(_this) {\n            return function(e) {\n              var left, pageX, percent, right;\n              if (!_this.isLabelDragging) {\n                return;\n              }\n              e.preventDefault();\n              _this.isLabelDragged = true;\n              pageX = e.pageX || e.originalEvent.touches[0].pageX;\n              percent = ((pageX - _this.$wrapper.offset().left) / _this.$wrapper.width()) * 100;\n              left = 25;\n              right = 75;\n              if (_this.options.animate) {\n                _this.$wrapper.removeClass(\"\" + _this.options.baseClass + \"-animate\");\n              }\n              if (percent < left) {\n                percent = left;\n              } else if (percent > right) {\n                percent = right;\n              }\n              _this.$container.css(\"margin-left\", \"\" + (percent - right) + \"%\");\n              return _this.$element.trigger(\"focus.bootstrapSwitch\");\n            };\n          })(this),\n          \"mousedown.bootstrapSwitch touchstart.bootstrapSwitch\": (function(_this) {\n            return function(e) {\n              if (_this.isLabelDragging || _this.options.disabled || _this.options.readonly || _this.options.indeterminate) {\n                return;\n              }\n              e.preventDefault();\n              _this.isLabelDragging = true;\n              return _this.$element.trigger(\"focus.bootstrapSwitch\");\n            };\n          })(this),\n          \"mouseup.bootstrapSwitch touchend.bootstrapSwitch\": (function(_this) {\n            return function(e) {\n              if (!_this.isLabelDragging) {\n                return;\n              }\n              e.preventDefault();\n              if (_this.isLabelDragged) {\n                _this.isLabelDragged = false;\n                _this.state(parseInt(_this.$container.css(\"margin-left\"), 10) > -(_this.$container.width() / 6));\n                if (_this.options.animate) {\n                  _this.$wrapper.addClass(\"\" + _this.options.baseClass + \"-animate\");\n                }\n                _this.$container.css(\"margin-left\", \"\");\n              } else {\n                _this.state(!_this.options.state);\n              }\n              return _this.isLabelDragging = false;\n            };\n          })(this),\n          \"mouseleave.bootstrapSwitch\": (function(_this) {\n            return function(e) {\n              return _this.$label.trigger(\"mouseup.bootstrapSwitch\");\n            };\n          })(this)\n        });\n      };\n\n      BootstrapSwitch.prototype._formHandler = function() {\n        var $form;\n        $form = this.$element.closest(\"form\");\n        if ($form.data(\"bootstrap-switch\")) {\n          return;\n        }\n        return $form.on(\"reset.bootstrapSwitch\", function() {\n          return window.setTimeout(function() {\n            return $form.find(\"input\").filter(function() {\n              return $(this).data(\"bootstrap-switch\");\n            }).each(function() {\n              return $(this).bootstrapSwitch(\"state\", this.checked);\n            });\n          }, 1);\n        }).data(\"bootstrap-switch\", true);\n      };\n\n      BootstrapSwitch.prototype._getClasses = function(classes) {\n        var c, cls, _i, _len;\n        if (!$.isArray(classes)) {\n          return [\"\" + this.options.baseClass + \"-\" + classes];\n        }\n        cls = [];\n        for (_i = 0, _len = classes.length; _i < _len; _i++) {\n          c = classes[_i];\n          cls.push(\"\" + this.options.baseClass + \"-\" + c);\n        }\n        return cls;\n      };\n\n      return BootstrapSwitch;\n\n    })();\n    $.fn.bootstrapSwitch = function() {\n      var args, option, ret;\n      option = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : [];\n      ret = this;\n      this.each(function() {\n        var $this, data;\n        $this = $(this);\n        data = $this.data(\"bootstrap-switch\");\n        if (!data) {\n          $this.data(\"bootstrap-switch\", data = new BootstrapSwitch(this, option));\n        }\n        if (typeof option === \"string\") {\n          return ret = data[option].apply(data, args);\n        }\n      });\n      return ret;\n    };\n    $.fn.bootstrapSwitch.Constructor = BootstrapSwitch;\n    return $.fn.bootstrapSwitch.defaults = {\n      state: true,\n      size: null,\n      animate: true,\n      disabled: false,\n      readonly: false,\n      indeterminate: false,\n      onColor: \"primary\",\n      offColor: \"default\",\n      onText: \"ON\",\n      offText: \"OFF\",\n      labelText: \"&nbsp;\",\n      baseClass: \"bootstrap-switch\",\n      wrapperClass: \"wrapper\",\n      radioAllOff: false,\n      onInit: function() {},\n      onSwitchChange: function() {}\n    };\n  })(window.jQuery, window);\n\n}).call(this);\n\n(function ($) {\n  \"use strict\";\n\n  var defaultOptions = {\n    tagClass: function(item) {\n      return 'label label-info';\n    },\n    itemValue: function(item) {\n      return item ? item.toString() : item;\n    },\n    itemText: function(item) {\n      return this.itemValue(item);\n    },\n    freeInput: true,\n    addOnBlur: true,\n    maxTags: undefined,\n    maxChars: undefined,\n    confirmKeys: [13, 44],\n    onTagExists: function(item, $tag) {\n      $tag.hide().fadeIn();\n    },\n    trimValue: false,\n    allowDuplicates: false\n  };\n\n  /**\n   * Constructor function\n   */\n  function TagsInput(element, options) {\n    this.itemsArray = [];\n\n    this.$element = $(element);\n    this.$element.hide();\n\n    this.isSelect = (element.tagName === 'SELECT');\n    this.multiple = (this.isSelect && element.hasAttribute('multiple'));\n    this.objectItems = options && options.itemValue;\n    this.placeholderText = element.hasAttribute('placeholder') ? this.$element.attr('placeholder') : '';\n    this.inputSize = Math.max(1, this.placeholderText.length);\n\n    this.$container = $('<div class=\"bootstrap-tagsinput\"></div>');\n    this.$input = $('<input type=\"text\" placeholder=\"' + this.placeholderText + '\"/>').appendTo(this.$container);\n\n    this.$element.after(this.$container);\n\n    var inputWidth = (this.inputSize < 3 ? 3 : this.inputSize) + \"em\";\n    this.$input.get(0).style.cssText = \"width: \" + inputWidth + \" !important;\";\n    this.build(options);\n  }\n\n  TagsInput.prototype = {\n    constructor: TagsInput,\n\n    /**\n     * Adds the given item as a new tag. Pass true to dontPushVal to prevent\n     * updating the elements val()\n     */\n    add: function(item, dontPushVal) {\n      var self = this;\n\n      if (self.options.maxTags && self.itemsArray.length >= self.options.maxTags)\n        return;\n\n      // Ignore falsey values, except false\n      if (item !== false && !item)\n        return;\n\n      // Trim value\n      if (typeof item === \"string\" && self.options.trimValue) {\n        item = $.trim(item);\n      }\n\n      // Throw an error when trying to add an object while the itemValue option was not set\n      if (typeof item === \"object\" && !self.objectItems)\n        throw(\"Can't add objects when itemValue option is not set\");\n\n      // Ignore strings only containg whitespace\n      if (item.toString().match(/^\\s*$/))\n        return;\n\n      // If SELECT but not multiple, remove current tag\n      if (self.isSelect && !self.multiple && self.itemsArray.length > 0)\n        self.remove(self.itemsArray[0]);\n\n      if (typeof item === \"string\" && this.$element[0].tagName === 'INPUT') {\n        var items = item.split(',');\n        if (items.length > 1) {\n          for (var i = 0; i < items.length; i++) {\n            this.add(items[i], true);\n          }\n\n          if (!dontPushVal)\n            self.pushVal();\n          return;\n        }\n      }\n\n      var itemValue = self.options.itemValue(item),\n          itemText = self.options.itemText(item),\n          tagClass = self.options.tagClass(item);\n\n      // Ignore items allready added\n      var existing = $.grep(self.itemsArray, function(item) { return self.options.itemValue(item) === itemValue; } )[0];\n      if (existing && !self.options.allowDuplicates) {\n        // Invoke onTagExists\n        if (self.options.onTagExists) {\n          var $existingTag = $(\".tag\", self.$container).filter(function() { return $(this).data(\"item\") === existing; });\n          self.options.onTagExists(item, $existingTag);\n        }\n        return;\n      }\n\n      // if length greater than limit\n      if (self.items().toString().length + item.length + 1 > self.options.maxInputLength)\n        return;\n\n      // raise beforeItemAdd arg\n      var beforeItemAddEvent = $.Event('beforeItemAdd', { item: item, cancel: false });\n      self.$element.trigger(beforeItemAddEvent);\n      if (beforeItemAddEvent.cancel)\n        return;\n\n      // register item in internal array and map\n      self.itemsArray.push(item);\n\n      // add a tag element\n      var $tag = $('<span class=\"tag ' + htmlEncode(tagClass) + '\">' + htmlEncode(itemText) + '<span data-role=\"remove\"></span></span>');\n      $tag.data('item', item);\n      self.findInputWrapper().before($tag);\n      $tag.after(' ');\n\n      // add <option /> if item represents a value not present in one of the <select />'s options\n      if (self.isSelect && !$('option[value=\"' + encodeURIComponent(itemValue) + '\"]',self.$element)[0]) {\n        var $option = $('<option selected>' + htmlEncode(itemText) + '</option>');\n        $option.data('item', item);\n        $option.attr('value', itemValue);\n        self.$element.append($option);\n      }\n\n      if (!dontPushVal)\n        self.pushVal();\n\n      // Add class when reached maxTags\n      if (self.options.maxTags === self.itemsArray.length || self.items().toString().length === self.options.maxInputLength)\n        self.$container.addClass('bootstrap-tagsinput-max');\n\n      self.$element.trigger($.Event('itemAdded', { item: item }));\n    },\n\n    /**\n     * Removes the given item. Pass true to dontPushVal to prevent updating the\n     * elements val()\n     */\n    remove: function(item, dontPushVal) {\n      var self = this;\n\n      if (self.objectItems) {\n        if (typeof item === \"object\")\n          item = $.grep(self.itemsArray, function(other) { return self.options.itemValue(other) ==  self.options.itemValue(item); } );\n        else\n          item = $.grep(self.itemsArray, function(other) { return self.options.itemValue(other) ==  item; } );\n\n        item = item[item.length-1];\n      }\n\n      if (item) {\n        var beforeItemRemoveEvent = $.Event('beforeItemRemove', { item: item, cancel: false });\n        self.$element.trigger(beforeItemRemoveEvent);\n        if (beforeItemRemoveEvent.cancel)\n          return;\n\n        $('.tag', self.$container).filter(function() { return $(this).data('item') === item; }).remove();\n        $('option', self.$element).filter(function() { return $(this).data('item') === item; }).remove();\n        if($.inArray(item, self.itemsArray) !== -1)\n          self.itemsArray.splice($.inArray(item, self.itemsArray), 1);\n      }\n\n      if (!dontPushVal)\n        self.pushVal();\n\n      // Remove class when reached maxTags\n      if (self.options.maxTags > self.itemsArray.length)\n        self.$container.removeClass('bootstrap-tagsinput-max');\n\n      self.$element.trigger($.Event('itemRemoved',  { item: item }));\n    },\n\n    /**\n     * Removes all items\n     */\n    removeAll: function() {\n      var self = this;\n\n      $('.tag', self.$container).remove();\n      $('option', self.$element).remove();\n\n      while(self.itemsArray.length > 0)\n        self.itemsArray.pop();\n\n      self.pushVal();\n    },\n\n    /**\n     * Refreshes the tags so they match the text/value of their corresponding\n     * item.\n     */\n    refresh: function() {\n      var self = this;\n      $('.tag', self.$container).each(function() {\n        var $tag = $(this),\n            item = $tag.data('item'),\n            itemValue = self.options.itemValue(item),\n            itemText = self.options.itemText(item),\n            tagClass = self.options.tagClass(item);\n\n          // Update tag's class and inner text\n          $tag.attr('class', null);\n          $tag.addClass('tag ' + htmlEncode(tagClass));\n          $tag.contents().filter(function() {\n            return this.nodeType == 3;\n          })[0].nodeValue = htmlEncode(itemText);\n\n          if (self.isSelect) {\n            var option = $('option', self.$element).filter(function() { return $(this).data('item') === item; });\n            option.attr('value', itemValue);\n          }\n      });\n    },\n\n    /**\n     * Returns the items added as tags\n     */\n    items: function() {\n      return this.itemsArray;\n    },\n\n    /**\n     * Assembly value by retrieving the value of each item, and set it on the\n     * element.\n     */\n    pushVal: function() {\n      var self = this,\n          val = $.map(self.items(), function(item) {\n            return self.options.itemValue(item).toString();\n          });\n\n      self.$element.val(val, true).trigger('change');\n    },\n\n    /**\n     * Initializes the tags input behaviour on the element\n     */\n    build: function(options) {\n      var self = this;\n\n      self.options = $.extend({}, defaultOptions, options);\n      // When itemValue is set, freeInput should always be false\n      if (self.objectItems)\n        self.options.freeInput = false;\n\n      makeOptionItemFunction(self.options, 'itemValue');\n      makeOptionItemFunction(self.options, 'itemText');\n      makeOptionFunction(self.options, 'tagClass');\n      \n      // Typeahead Bootstrap version 2.3.2\n      if (self.options.typeahead) {\n        var typeahead = self.options.typeahead || {};\n\n        makeOptionFunction(typeahead, 'source');\n\n        self.$input.typeahead($.extend({}, typeahead, {\n          source: function (query, process) {\n            function processItems(items) {\n              var texts = [];\n\n              for (var i = 0; i < items.length; i++) {\n                var text = self.options.itemText(items[i]);\n                map[text] = items[i];\n                texts.push(text);\n              }\n              process(texts);\n            }\n\n            this.map = {};\n            var map = this.map,\n                data = typeahead.source(query);\n\n            if ($.isFunction(data.success)) {\n              // support for Angular callbacks\n              data.success(processItems);\n            } else if ($.isFunction(data.then)) {\n              // support for Angular promises\n              data.then(processItems);\n            } else {\n              // support for functions and jquery promises\n              $.when(data)\n               .then(processItems);\n            }\n          },\n          updater: function (text) {\n            self.add(this.map[text]);\n          },\n          matcher: function (text) {\n            return (text.toLowerCase().indexOf(this.query.trim().toLowerCase()) !== -1);\n          },\n          sorter: function (texts) {\n            return texts.sort();\n          },\n          highlighter: function (text) {\n            var regex = new RegExp( '(' + this.query + ')', 'gi' );\n            return text.replace( regex, \"<strong>$1</strong>\" );\n          }\n        }));\n      }\n\n      // typeahead.js\n      if (self.options.typeaheadjs) {\n          var typeaheadjs = self.options.typeaheadjs || {};\n          \n          self.$input.typeahead(null, typeaheadjs).on('typeahead:selected', $.proxy(function (obj, datum) {\n            if (typeaheadjs.valueKey)\n              self.add(datum[typeaheadjs.valueKey]);\n            else\n              self.add(datum);\n            self.$input.typeahead('val', '');\n          }, self));\n      }\n\n      self.$container.on('click', $.proxy(function(event) {\n        if (! self.$element.attr('disabled')) {\n          self.$input.removeAttr('disabled');\n        }\n        self.$input.focus();\n      }, self));\n\n        if (self.options.addOnBlur && self.options.freeInput) {\n          self.$input.on('focusout', $.proxy(function(event) {\n              // HACK: only process on focusout when no typeahead opened, to\n              //       avoid adding the typeahead text as tag\n              if ($('.typeahead, .twitter-typeahead', self.$container).length === 0) {\n                self.add(self.$input.val());\n                self.$input.val('');\n              }\n          }, self));\n        }\n        \n\n      self.$container.on('keydown', 'input', $.proxy(function(event) {\n        var $input = $(event.target),\n            $inputWrapper = self.findInputWrapper();\n\n        if (self.$element.attr('disabled')) {\n          self.$input.attr('disabled', 'disabled');\n          return;\n        }\n\n        switch (event.which) {\n          // BACKSPACE\n          case 8:\n            if (doGetCaretPosition($input[0]) === 0) {\n              var prev = $inputWrapper.prev();\n              if (prev) {\n                self.remove(prev.data('item'));\n              }\n            }\n            break;\n\n          // DELETE\n          case 46:\n            if (doGetCaretPosition($input[0]) === 0) {\n              var next = $inputWrapper.next();\n              if (next) {\n                self.remove(next.data('item'));\n              }\n            }\n            break;\n\n          // LEFT ARROW\n          case 37:\n            // Try to move the input before the previous tag\n            var $prevTag = $inputWrapper.prev();\n            if ($input.val().length === 0 && $prevTag[0]) {\n              $prevTag.before($inputWrapper);\n              $input.focus();\n            }\n            break;\n          // RIGHT ARROW\n          case 39:\n            // Try to move the input after the next tag\n            var $nextTag = $inputWrapper.next();\n            if ($input.val().length === 0 && $nextTag[0]) {\n              $nextTag.after($inputWrapper);\n              $input.focus();\n            }\n            break;\n         default:\n             // ignore\n         }\n\n        // Reset internal input's size\n        var textLength = $input.val().length,\n            wordSpace = Math.ceil(textLength / 5),\n            size = textLength + wordSpace + 1;\n        $input.attr('size', Math.max(this.inputSize, $input.val().length));\n      }, self));\n\n      self.$container.on('keypress', 'input', $.proxy(function(event) {\n         var $input = $(event.target);\n\n         if (self.$element.attr('disabled')) {\n            self.$input.attr('disabled', 'disabled');\n            return;\n         }\n\n         var text = $input.val(),\n         maxLengthReached = self.options.maxChars && text.length >= self.options.maxChars;\n         if (self.options.freeInput && (keyCombinationInList(event, self.options.confirmKeys) || maxLengthReached)) {\n            self.add(maxLengthReached ? text.substr(0, self.options.maxChars) : text);\n            $input.val('');\n            event.preventDefault();\n         }\n\n         // Reset internal input's size\n         var textLength = $input.val().length,\n            wordSpace = Math.ceil(textLength / 5),\n            size = textLength + wordSpace + 1;\n         $input.attr('size', Math.max(this.inputSize, $input.val().length));\n      }, self));\n\n      // Remove icon clicked\n      self.$container.on('click', '[data-role=remove]', $.proxy(function(event) {\n        if (self.$element.attr('disabled')) {\n          return;\n        }\n        self.remove($(event.target).closest('.tag').data('item'));\n      }, self));\n\n      // Only add existing value as tags when using strings as tags\n      if (self.options.itemValue === defaultOptions.itemValue) {\n        if (self.$element[0].tagName === 'INPUT') {\n            self.add(self.$element.val());\n        } else {\n          $('option', self.$element).each(function() {\n            self.add($(this).attr('value'), true);\n          });\n        }\n      }\n    },\n\n    /**\n     * Removes all tagsinput behaviour and unregsiter all event handlers\n     */\n    destroy: function() {\n      var self = this;\n\n      // Unbind events\n      self.$container.off('keypress', 'input');\n      self.$container.off('click', '[role=remove]');\n\n      self.$container.remove();\n      self.$element.removeData('tagsinput');\n      self.$element.show();\n    },\n\n    /**\n     * Sets focus on the tagsinput\n     */\n    focus: function() {\n      this.$input.focus();\n    },\n\n    /**\n     * Returns the internal input element\n     */\n    input: function() {\n      return this.$input;\n    },\n\n    /**\n     * Returns the element which is wrapped around the internal input. This\n     * is normally the $container, but typeahead.js moves the $input element.\n     */\n    findInputWrapper: function() {\n      var elt = this.$input[0],\n          container = this.$container[0];\n      while(elt && elt.parentNode !== container)\n        elt = elt.parentNode;\n\n      return $(elt);\n    }\n  };\n\n  /**\n   * Register JQuery plugin\n   */\n  $.fn.tagsinput = function(arg1, arg2) {\n    var results = [];\n\n    this.each(function() {\n      var tagsinput = $(this).data('tagsinput');\n      // Initialize a new tags input\n      if (!tagsinput) {\n          tagsinput = new TagsInput(this, arg1);\n          $(this).data('tagsinput', tagsinput);\n          results.push(tagsinput);\n\n          if (this.tagName === 'SELECT') {\n              $('option', $(this)).attr('selected', 'selected');\n          }\n\n          // Init tags from $(this).val()\n          $(this).val($(this).val());\n      } else if (!arg1 && !arg2) {\n          // tagsinput already exists\n          // no function, trying to init\n          results.push(tagsinput);\n      } else if(tagsinput[arg1] !== undefined) {\n          // Invoke function on existing tags input\n          var retVal = tagsinput[arg1](arg2);\n          if (retVal !== undefined)\n              results.push(retVal);\n      }\n    });\n\n    if ( typeof arg1 == 'string') {\n      // Return the results from the invoked function calls\n      return results.length > 1 ? results : results[0];\n    } else {\n      return results;\n    }\n  };\n\n  $.fn.tagsinput.Constructor = TagsInput;\n\n  /**\n   * Most options support both a string or number as well as a function as\n   * option value. This function makes sure that the option with the given\n   * key in the given options is wrapped in a function\n   */\n  function makeOptionItemFunction(options, key) {\n    if (typeof options[key] !== 'function') {\n      var propertyName = options[key];\n      options[key] = function(item) { return item[propertyName]; };\n    }\n  }\n  function makeOptionFunction(options, key) {\n    if (typeof options[key] !== 'function') {\n      var value = options[key];\n      options[key] = function() { return value; };\n    }\n  }\n  /**\n   * HtmlEncodes the given value\n   */\n  var htmlEncodeContainer = $('<div />');\n  function htmlEncode(value) {\n    if (value) {\n      return htmlEncodeContainer.text(value).html();\n    } else {\n      return '';\n    }\n  }\n\n  /**\n   * Returns the position of the caret in the given input field\n   * http://flightschool.acylt.com/devnotes/caret-position-woes/\n   */\n  function doGetCaretPosition(oField) {\n    var iCaretPos = 0;\n    if (document.selection) {\n      oField.focus ();\n      var oSel = document.selection.createRange();\n      oSel.moveStart ('character', -oField.value.length);\n      iCaretPos = oSel.text.length;\n    } else if (oField.selectionStart || oField.selectionStart == '0') {\n      iCaretPos = oField.selectionStart;\n    }\n    return (iCaretPos);\n  }\n\n  /**\n    * Returns boolean indicates whether user has pressed an expected key combination. \n    * @param object keyPressEvent: JavaScript event object, refer\n    *     http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\n    * @param object lookupList: expected key combinations, as in:\n    *     [13, {which: 188, shiftKey: true}]\n    */\n  function keyCombinationInList(keyPressEvent, lookupList) {\n      var found = false;\n      $.each(lookupList, function (index, keyCombination) {\n          if (typeof (keyCombination) === 'number' && keyPressEvent.which === keyCombination) {\n              found = true;\n              return false;\n          }\n\n          if (keyPressEvent.which === keyCombination.which) {\n              var alt = !keyCombination.hasOwnProperty('altKey') || keyPressEvent.altKey === keyCombination.altKey,\n                  shift = !keyCombination.hasOwnProperty('shiftKey') || keyPressEvent.shiftKey === keyCombination.shiftKey,\n                  ctrl = !keyCombination.hasOwnProperty('ctrlKey') || keyPressEvent.ctrlKey === keyCombination.ctrlKey;\n              if (alt && shift && ctrl) {\n                  found = true;\n                  return false;\n              }\n          }\n      });\n\n      return found;\n  }\n\n  /**\n   * Initialize tagsinput behaviour on inputs and selects which have\n   * data-role=tagsinput\n   */\n  $(function() {\n    $(\"input[data-role=tagsinput], select[multiple][data-role=tagsinput]\").tagsinput();\n  });\n})(window.jQuery);\n\n/*!\n\nHolder - client side image placeholders\nVersion 2.4.0+bxlim\n© 2014 Ivan Malopinsky - http://imsky.co\n\nSite:     http://imsky.github.io/holder\nIssues:   https://github.com/imsky/holder/issues\nLicense:  http://opensource.org/licenses/MIT\n\n*/\n!function(e,t,r){t[e]=r}(\"onDomReady\",this,function(e){\"use strict\";function t(e){if(!b){if(!a.body)return i(t);for(b=!0;e=S.shift();)i(e)}}function r(e){(y||e.type===s||a[c]===u)&&(n(),t())}function n(){y?(a[x](m,r,d),e[x](s,r,d)):(a[g](v,r),e[g](h,r))}function i(e,t){setTimeout(e,+t>=0?t:1)}function o(e){b?i(e):S.push(e)}null==document.readyState&&document.addEventListener&&(document.addEventListener(\"DOMContentLoaded\",function E(){document.removeEventListener(\"DOMContentLoaded\",E,!1),document.readyState=\"complete\"},!1),document.readyState=\"loading\");var a=e.document,l=a.documentElement,s=\"load\",d=!1,h=\"on\"+s,u=\"complete\",c=\"readyState\",f=\"attachEvent\",g=\"detachEvent\",p=\"addEventListener\",m=\"DOMContentLoaded\",v=\"onreadystatechange\",x=\"removeEventListener\",y=p in a,w=d,b=d,S=[];if(a[c]===u)i(t);else if(y)a[p](m,r,d),e[p](s,r,d);else{a[f](v,r),e[f](h,r);try{w=null==e.frameElement&&l}catch(C){}w&&w.doScroll&&!function k(){if(!b){try{w.doScroll(\"left\")}catch(e){return i(k,50)}n(),t()}}()}return o.version=\"1.4.0\",o.isReady=function(){return b},o}(this)),document.querySelectorAll||(document.querySelectorAll=function(e){var t,r=document.createElement(\"style\"),n=[];for(document.documentElement.firstChild.appendChild(r),document._qsa=[],r.styleSheet.cssText=e+\"{x-qsa:expression(document._qsa && document._qsa.push(this))}\",window.scrollBy(0,0),r.parentNode.removeChild(r);document._qsa.length;)t=document._qsa.shift(),t.style.removeAttribute(\"x-qsa\"),n.push(t);return document._qsa=null,n}),document.querySelector||(document.querySelector=function(e){var t=document.querySelectorAll(e);return t.length?t[0]:null}),document.getElementsByClassName||(document.getElementsByClassName=function(e){return e=String(e).replace(/^|\\s+/g,\".\"),document.querySelectorAll(e)}),Object.keys||(Object.keys=function(e){if(e!==Object(e))throw TypeError(\"Object.keys called on non-object\");var t,r=[];for(t in e)Object.prototype.hasOwnProperty.call(e,t)&&r.push(t);return r}),function(e){var t=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";e.atob=e.atob||function(e){e=String(e);var r,n=0,i=[],o=0,a=0;if(e=e.replace(/\\s/g,\"\"),e.length%4===0&&(e=e.replace(/=+$/,\"\")),e.length%4===1)throw Error(\"InvalidCharacterError\");if(/[^+/0-9A-Za-z]/.test(e))throw Error(\"InvalidCharacterError\");for(;n<e.length;)r=t.indexOf(e.charAt(n)),o=o<<6|r,a+=6,24===a&&(i.push(String.fromCharCode(o>>16&255)),i.push(String.fromCharCode(o>>8&255)),i.push(String.fromCharCode(255&o)),a=0,o=0),n+=1;return 12===a?(o>>=4,i.push(String.fromCharCode(255&o))):18===a&&(o>>=2,i.push(String.fromCharCode(o>>8&255)),i.push(String.fromCharCode(255&o))),i.join(\"\")},e.btoa=e.btoa||function(e){e=String(e);var r,n,i,o,a,l,s,d=0,h=[];if(/[^\\x00-\\xFF]/.test(e))throw Error(\"InvalidCharacterError\");for(;d<e.length;)r=e.charCodeAt(d++),n=e.charCodeAt(d++),i=e.charCodeAt(d++),o=r>>2,a=(3&r)<<4|n>>4,l=(15&n)<<2|i>>6,s=63&i,d===e.length+2?(l=64,s=64):d===e.length+1&&(s=64),h.push(t.charAt(o),t.charAt(a),t.charAt(l),t.charAt(s));return h.join(\"\")}}(this),function(){function e(t,r,n){t.document;var i,o=t.currentStyle[r].match(/([\\d\\.]+)(%|cm|em|in|mm|pc|pt|)/)||[0,0,\"\"],a=o[1],l=o[2];return n=n?/%|em/.test(l)&&t.parentElement?e(t.parentElement,\"fontSize\",null):16:n,i=\"fontSize\"==r?n:/width/i.test(r)?t.clientWidth:t.clientHeight,\"%\"==l?a/100*i:\"cm\"==l?.3937*a*96:\"em\"==l?a*n:\"in\"==l?96*a:\"mm\"==l?.3937*a*96/10:\"pc\"==l?12*a*96/72:\"pt\"==l?96*a/72:a}function t(e,t){var r=\"border\"==t?\"Width\":\"\",n=t+\"Top\"+r,i=t+\"Right\"+r,o=t+\"Bottom\"+r,a=t+\"Left\"+r;e[t]=(e[n]==e[i]&&e[n]==e[o]&&e[n]==e[a]?[e[n]]:e[n]==e[o]&&e[a]==e[i]?[e[n],e[i]]:e[a]==e[i]?[e[n],e[i],e[o]]:[e[n],e[i],e[o],e[a]]).join(\" \")}function r(r){var n,i=this,o=r.currentStyle,a=e(r,\"fontSize\"),l=function(e){return\"-\"+e.toLowerCase()};for(n in o)if(Array.prototype.push.call(i,\"styleFloat\"==n?\"float\":n.replace(/[A-Z]/,l)),\"width\"==n)i[n]=r.offsetWidth+\"px\";else if(\"height\"==n)i[n]=r.offsetHeight+\"px\";else if(\"styleFloat\"==n)i.float=o[n];else if(/margin.|padding.|border.+W/.test(n)&&\"auto\"!=i[n])i[n]=Math.round(e(r,n,a))+\"px\";else if(/^outline/.test(n))try{i[n]=o[n]}catch(s){i.outlineColor=o.color,i.outlineStyle=i.outlineStyle||\"none\",i.outlineWidth=i.outlineWidth||\"0px\",i.outline=[i.outlineColor,i.outlineWidth,i.outlineStyle].join(\" \")}else i[n]=o[n];t(i,\"margin\"),t(i,\"padding\"),t(i,\"border\"),i.fontSize=Math.round(a)+\"px\"}window.getComputedStyle||(r.prototype={constructor:r,getPropertyPriority:function(){throw new Error(\"NotSupportedError: DOM Exception 9\")},getPropertyValue:function(e){return this[e.replace(/-\\w/g,function(e){return e[1].toUpperCase()})]},item:function(e){return this[e]},removeProperty:function(){throw new Error(\"NoModificationAllowedError: DOM Exception 7\")},setProperty:function(){throw new Error(\"NoModificationAllowedError: DOM Exception 7\")},getPropertyCSSValue:function(){throw new Error(\"NotSupportedError: DOM Exception 9\")}},window.getComputedStyle=Window.prototype.getComputedStyle=function(e){return new r(e)})}(),Object.prototype.hasOwnProperty||(Object.prototype.hasOwnProperty=function(e){var t=this.__proto__||this.constructor.prototype;return e in this&&(!(e in t)||t[e]!==this[e])}),function(e,t){e.augment=t()}(this,function(){\"use strict\";var e=function(){},t=Array.prototype.slice,r=function(r,n){var i=e.prototype=\"function\"==typeof r?r.prototype:r,o=new e,a=n.apply(o,t.call(arguments,2).concat(i));if(\"object\"==typeof a)for(var l in a)o[l]=a[l];if(!o.hasOwnProperty(\"constructor\"))return o;var s=o.constructor;return s.prototype=o,s};return r.defclass=function(e){var t=e.constructor;return t.prototype=e,t},r.extend=function(e,t){return r(e,function(e){return this.uber=e,t})},r}),function(e,t){function r(e,t,r,o){var a=n(r.substr(r.lastIndexOf(e.domain)),e);a&&i(null,o,a,t)}function n(e,t){for(var r={theme:p(A.settings.themes.gray,null),stylesheets:t.stylesheets,holderURL:[]},n=!1,i=String.fromCharCode(11),o=e.replace(/([^\\\\])\\//g,\"$1\"+i).split(i),a=/%[0-9a-f]{2}/gi,l=o.length,s=0;l>s;s++){var d=o[s];if(d.match(a))try{d=decodeURIComponent(d)}catch(h){d=o[s]}var u=!1;if(A.flags.dimensions.match(d))n=!0,r.dimensions=A.flags.dimensions.output(d),u=!0;else if(A.flags.fluid.match(d))n=!0,r.dimensions=A.flags.fluid.output(d),r.fluid=!0,u=!0;else if(A.flags.textmode.match(d))r.textmode=A.flags.textmode.output(d),u=!0;else if(A.flags.colors.match(d)){var c=A.flags.colors.output(d);r.theme=p(r.theme,c),u=!0}else if(t.themes[d])t.themes.hasOwnProperty(d)&&(r.theme=p(t.themes[d],null)),u=!0;else if(A.flags.font.match(d))r.font=A.flags.font.output(d),u=!0;else if(A.flags.auto.match(d))r.auto=!0,u=!0;else if(A.flags.text.match(d))r.text=A.flags.text.output(d),u=!0;else if(A.flags.random.match(d)){null==A.vars.cache.themeKeys&&(A.vars.cache.themeKeys=Object.keys(t.themes));var f=A.vars.cache.themeKeys[0|Math.random()*A.vars.cache.themeKeys.length];r.theme=p(t.themes[f],null),u=!0}u&&r.holderURL.push(d)}return r.holderURL.unshift(t.domain),r.holderURL=r.holderURL.join(\"/\"),n?r:!1}function i(e,t,r,n){var i=r.dimensions,a=r.theme,l=i.width+\"x\"+i.height;if(e=null==e?r.fluid?\"fluid\":\"image\":e,null!=r.text&&(a.text=r.text,\"object\"===t.nodeName.toLowerCase())){for(var d=a.text.split(\"\\\\n\"),u=0;u<d.length;u++)d[u]=b(d[u]);a.text=d.join(\"\\\\n\")}var f=r.holderURL,g=p(n,null);r.font&&(a.font=r.font,!g.noFontFallback&&\"img\"===t.nodeName.toLowerCase()&&A.setup.supportsCanvas&&\"svg\"===g.renderer&&(g=p(g,{renderer:\"canvas\"}))),r.font&&\"canvas\"==g.renderer&&(g.reRender=!0),\"background\"==e?null==t.getAttribute(\"data-background-src\")&&c(t,{\"data-background-src\":f}):c(t,{\"data-src\":f}),r.theme=a,t.holderData={flags:r,renderSettings:g},(\"image\"==e||\"fluid\"==e)&&c(t,{alt:a.text?(a.text.length>16?a.text.substring(0,16)+\"…\":a.text)+\" [\"+l+\"]\":l}),\"image\"==e?(\"html\"!=g.renderer&&r.auto||(t.style.width=i.width+\"px\",t.style.height=i.height+\"px\"),\"html\"==g.renderer?t.style.backgroundColor=a.background:(o(e,{dimensions:i,theme:a,flags:r},t,g),r.textmode&&\"exact\"==r.textmode&&(A.vars.resizableImages.push(t),s(t)))):\"background\"==e&&\"html\"!=g.renderer?o(e,{dimensions:i,theme:a,flags:r},t,g):\"fluid\"==e&&(\"%\"==i.height.slice(-1)?t.style.height=i.height:null!=r.auto&&r.auto||(t.style.height=i.height+\"px\"),\"%\"==i.width.slice(-1)?t.style.width=i.width:null!=r.auto&&r.auto||(t.style.width=i.width+\"px\"),(\"inline\"==t.style.display||\"\"===t.style.display||\"none\"==t.style.display)&&(t.style.display=\"block\"),h(t),\"html\"==g.renderer?t.style.backgroundColor=a.background:(A.vars.resizableImages.push(t),s(t)))}function o(e,t,r,n){function i(){var e=null;switch(n.renderer){case\"canvas\":e=L(s);break;case\"svg\":e=O(s,n);break;default:throw\"Holder: invalid renderer: \"+n.renderer}return e}var o=null;switch(n.renderer){case\"svg\":if(!A.setup.supportsSVG)return;break;case\"canvas\":if(!A.setup.supportsCanvas)return;break;default:return}{var l={width:t.dimensions.width,height:t.dimensions.height,theme:t.theme,flags:t.flags},s=a(l);({text:l.text,width:l.width,height:l.height,textHeight:l.font.size,font:l.font.family,fontWeight:l.font.weight,template:l.theme})}if(o=i(),null==o)throw\"Holder: couldn't render placeholder\";\"background\"==e?(r.style.backgroundImage=\"url(\"+o+\")\",r.style.backgroundSize=l.width+\"px \"+l.height+\"px\"):(\"img\"===r.nodeName.toLowerCase()?c(r,{src:o}):\"object\"===r.nodeName.toLowerCase()&&(c(r,{data:o}),c(r,{type:\"image/svg+xml\"})),n.reRender&&setTimeout(function(){var e=i();if(null==e)throw\"Holder: couldn't render placeholder\";\"img\"===r.nodeName.toLowerCase()?c(r,{src:e}):\"object\"===r.nodeName.toLowerCase()&&(c(r,{data:e}),c(r,{type:\"image/svg+xml\"}))},100)),c(r,{\"data-holder-rendered\":!0})}function a(e){function t(e,t,r,n){t.width=r,t.height=n,e.width=Math.max(e.width,t.width),e.height+=t.height,e.add(t)}switch(e.font={family:e.theme.font?e.theme.font:\"Arial, Helvetica, Open Sans, sans-serif\",size:l(e.width,e.height,e.theme.size?e.theme.size:12),weight:e.theme.fontweight?e.theme.fontweight:\"bold\"},e.text=e.theme.text?e.theme.text:Math.floor(e.width)+\"x\"+Math.floor(e.height),e.flags.textmode){case\"literal\":e.text=e.flags.dimensions.width+\"x\"+e.flags.dimensions.height;break;case\"exact\":if(!e.flags.exactDimensions)break;e.text=Math.floor(e.flags.exactDimensions.width)+\"x\"+Math.floor(e.flags.exactDimensions.height)}var r=new F({width:e.width,height:e.height}),n=r.Shape,i=new n.Rect(\"holderBg\",{fill:e.theme.background});i.resize(e.width,e.height),r.root.add(i);var o=new n.Group(\"holderTextGroup\",{text:e.text,align:\"center\",font:e.font,fill:e.theme.foreground});o.moveTo(null,null,1),r.root.add(o);var a=o.textPositionData=T(r);if(!a)throw\"Holder: staging fallback not supported yet.\";o.properties.leading=a.boundingBox.height;var s=null,d=null;if(a.lineCount>1){var h=0,u=0,c=e.width*A.setup.lineWrapRatio,f=0;d=new n.Group(\"line\"+f);for(var g=0;g<a.words.length;g++){var p=a.words[g];s=new n.Text(p.text);var m=\"\\\\n\"==p.text;(h+p.width>=c||m===!0)&&(t(o,d,h,o.properties.leading),h=0,u+=o.properties.leading,f+=1,d=new n.Group(\"line\"+f),d.y=u),m!==!0&&(s.moveTo(h,0),h+=a.spaceWidth+p.width,d.add(s))}t(o,d,h,o.properties.leading);for(var v in o.children)d=o.children[v],d.moveTo((o.width-d.width)/2,null,null);o.moveTo((e.width-o.width)/2,(e.height-o.height)/2,null),(e.height-o.height)/2<0&&o.moveTo(null,0,null)}else s=new n.Text(e.text),d=new n.Group(\"line0\"),d.add(s),o.add(d),o.moveTo((e.width-a.boundingBox.width)/2,(e.height-a.boundingBox.height)/2,null);return r}function l(e,t,r){t=parseInt(t,10),e=parseInt(e,10);var n=Math.max(t,e),i=Math.min(t,e),o=1/12,a=Math.min(.75*i,.75*n*o);return Math.round(Math.max(r,a))}function s(e){var t;t=null==e||null==e.nodeType?A.vars.resizableImages:[e];for(var r in t)if(t.hasOwnProperty(r)){var n=t[r];if(n.holderData){var i=n.holderData.flags,a=d(n,k.invisibleErrorFn(s));if(a){if(i.fluid&&i.auto){var l=n.holderData.fluidConfig;switch(l.mode){case\"width\":a.height=a.width/l.ratio;break;case\"height\":a.width=a.height*l.ratio}}var h={dimensions:a,theme:i.theme,flags:i};i.textmode&&\"exact\"==i.textmode&&(i.exactDimensions=a,h.dimensions=i.dimensions),o(\"image\",h,n,n.holderData.renderSettings)}}}}function d(e,t){var r={height:e.clientHeight,width:e.clientWidth};return r.height||r.width?(e.removeAttribute(\"data-holder-invisible\"),r):(c(e,{\"data-holder-invisible\":!0}),void t.call(this,e))}function h(e){if(e.holderData){var t=d(e,k.invisibleErrorFn(h));if(t){var r=e.holderData.flags,n={fluidHeight:\"%\"==r.dimensions.height.slice(-1),fluidWidth:\"%\"==r.dimensions.width.slice(-1),mode:null,initialDimensions:t};n.fluidWidth&&!n.fluidHeight?(n.mode=\"width\",n.ratio=n.initialDimensions.width/parseFloat(r.dimensions.height)):!n.fluidWidth&&n.fluidHeight&&(n.mode=\"height\",n.ratio=parseFloat(r.dimensions.width)/n.initialDimensions.height),e.holderData.fluidConfig=n}}}function u(e,t){return null==t?E.createElement(e):E.createElementNS(t,e)}function c(e,t){for(var r in t)e.setAttribute(r,t[r])}function f(e,t,r){if(null==e){e=u(\"svg\",C);var n=u(\"defs\",C);e.appendChild(n)}return e.webkitMatchesSelector&&e.setAttribute(\"xmlns\",C),c(e,{width:t,height:r,viewBox:\"0 0 \"+t+\" \"+r,preserveAspectRatio:\"none\"}),e}function g(e,r){if(t.XMLSerializer){{var n=new XMLSerializer,i=\"\",o=r.stylesheets;e.querySelector(\"defs\")}if(r.svgXMLStylesheet){for(var a=(new DOMParser).parseFromString(\"<xml />\",\"application/xml\"),l=o.length-1;l>=0;l--){var s=a.createProcessingInstruction(\"xml-stylesheet\",'href=\"'+o[l]+'\" rel=\"stylesheet\"');a.insertBefore(s,a.firstChild)}var d=a.createProcessingInstruction(\"xml\",'version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"');a.insertBefore(d,a.firstChild),a.removeChild(a.documentElement),i=n.serializeToString(a)}var h=n.serializeToString(e);return h=h.replace(/\\&amp;(\\#[0-9]{2,}\\;)/g,\"&$1\"),i+h}}function p(e,t){var r={};for(var n in e)e.hasOwnProperty(n)&&(r[n]=e[n]);if(null!=t)for(var i in t)t.hasOwnProperty(i)&&(r[i]=t[i]);return r}function m(e){var t=[];for(var r in e)e.hasOwnProperty(r)&&t.push(r+\":\"+e[r]);return t.join(\";\")}function v(e){A.vars.debounceTimer||e.call(this),A.vars.debounceTimer&&clearTimeout(A.vars.debounceTimer),A.vars.debounceTimer=setTimeout(function(){A.vars.debounceTimer=null,e.call(this)},A.setup.debounce)}function x(){v(function(){s(null)})}function y(e){var r=null;return\"string\"==typeof e?r=E.querySelectorAll(e):t.NodeList&&e instanceof t.NodeList?r=e:t.Node&&e instanceof t.Node?r=[e]:t.HTMLCollection&&e instanceof t.HTMLCollection?r=e:null===e&&(r=[]),r}function w(e,t){var r=new Image;r.onerror=function(){t.call(this,!1,e)},r.onload=function(){t.call(this,!0,e)},r.src=e.src}function b(e){for(var t=[],r=0,n=e.length-1;n>=0;n--)r=e[n].charCodeAt(),t.unshift(r>128?[\"&#\",r,\";\"].join(\"\"):e[n]);return t.join(\"\")}function S(e){return e.replace(/&#(\\d+);/g,function(e,t){return String.fromCharCode(t)})}var C=\"http://www.w3.org/2000/svg\",E=t.document,k={addTheme:function(e,t){return null!=e&&null!=t&&(A.settings.themes[e]=t),delete A.vars.cache.themeKeys,this},addImage:function(e,t){var r=E.querySelectorAll(t);if(r.length)for(var n=0,i=r.length;i>n;n++){var o=u(\"img\");c(o,{\"data-src\":e}),r[n].appendChild(o)}return this},run:function(e){e=e||{};var o={};A.vars.preempted=!0;var a=p(A.settings,e);o.renderer=a.renderer?a.renderer:A.setup.renderer,-1===A.setup.renderers.join(\",\").indexOf(o.renderer)&&(o.renderer=A.setup.supportsSVG?\"svg\":A.setup.supportsCanvas?\"canvas\":\"html\"),a.use_canvas?o.renderer=\"canvas\":a.use_svg&&(o.renderer=\"svg\");var l=y(a.images),s=y(a.bgnodes),d=y(a.stylenodes),h=y(a.objects);o.stylesheets=[],o.svgXMLStylesheet=!0,o.noFontFallback=a.noFontFallback?a.noFontFallback:!1;for(var c=0;c<d.length;c++){var f=d[c];if(f.attributes.rel&&f.attributes.href&&\"stylesheet\"==f.attributes.rel.value){var g=f.attributes.href.value,m=u(\"a\");m.href=g;var v=m.protocol+\"//\"+m.host+m.pathname+m.search;o.stylesheets.push(v)}}for(c=0;c<s.length;c++){var x=t.getComputedStyle(s[c],null).getPropertyValue(\"background-image\"),b=s[c].getAttribute(\"data-background-src\"),S=null;S=null==b?x:b;var C=null,E=\"?\"+a.domain+\"/\";if(0===S.indexOf(E))C=S.slice(1);else if(-1!=S.indexOf(E)){var k=S.substr(S.indexOf(E)).slice(1),T=k.match(/([^\\\"]*)\"?\\)/);null!=T&&(C=T[1])}if(null!=C){var L=n(C,a);L&&i(\"background\",s[c],L,o)}}for(c=0;c<h.length;c++){var O=h[c],F={};try{F.data=O.getAttribute(\"data\"),F.dataSrc=O.getAttribute(\"data-src\")}catch(z){}var M=null!=F.data&&0===F.data.indexOf(a.domain),D=null!=F.dataSrc&&0===F.dataSrc.indexOf(a.domain);M?r(a,o,F.data,O):D&&r(a,o,F.dataSrc,O)}for(c=0;c<l.length;c++){var R=l[c],j={};try{j.src=R.getAttribute(\"src\"),j.dataSrc=R.getAttribute(\"data-src\"),j.rendered=R.getAttribute(\"data-holder-rendered\")}catch(z){}var B=null!=j.src,P=null!=j.dataSrc&&0===j.dataSrc.indexOf(a.domain),N=null!=j.rendered&&\"true\"==j.rendered;B?0===j.src.indexOf(a.domain)?r(a,o,j.src,R):P&&(N?r(a,o,j.dataSrc,R):w({src:j.src,options:a,renderSettings:o,dataSrc:j.dataSrc,image:R},function(e,t){e||r(t.options,t.renderSettings,t.dataSrc,t.image)})):P&&r(a,o,j.dataSrc,R)}return this},invisibleErrorFn:function(){return function(e){if(e.hasAttribute(\"data-holder-invisible\"))throw\"Holder: invisible placeholder\"}}};k.add_theme=k.addTheme,k.add_image=k.addImage,k.invisible_error_fn=k.invisibleErrorFn;var A={settings:{domain:\"holder.js\",images:\"img\",objects:\"object\",bgnodes:\"body .holderjs\",stylenodes:\"head link.holderjs\",stylesheets:[],themes:{gray:{background:\"#EEEEEE\",foreground:\"#AAAAAA\"},social:{background:\"#3a5a97\",foreground:\"#FFFFFF\"},industrial:{background:\"#434A52\",foreground:\"#C2F200\"},sky:{background:\"#0D8FDB\",foreground:\"#FFFFFF\"},vine:{background:\"#39DBAC\",foreground:\"#1E292C\"},lava:{background:\"#F8591A\",foreground:\"#1C2846\",size:12}}},flags:{dimensions:{regex:/^(\\d+)x(\\d+)$/,output:function(e){var t=this.regex.exec(e);return{width:+t[1],height:+t[2]}}},fluid:{regex:/^([0-9]+%?)x([0-9]+%?)$/,output:function(e){var t=this.regex.exec(e);return{width:t[1],height:t[2]}}},colors:{regex:/(?:#|\\^)([0-9a-f]{3,})\\:(?:#|\\^)([0-9a-f]{3,})/i,output:function(e){var t=this.regex.exec(e);return{foreground:\"#\"+t[2],background:\"#\"+t[1]}}},text:{regex:/text\\:(.*)/,output:function(e){return this.regex.exec(e)[1].replace(\"\\\\/\",\"/\")}},font:{regex:/font\\:(.*)/,output:function(e){return this.regex.exec(e)[1]}},auto:{regex:/^auto$/},textmode:{regex:/textmode\\:(.*)/,output:function(e){return this.regex.exec(e)[1]}},random:{regex:/^random$/}}},T=function(){var e=null,t=null,r=null;return function(n){var i=n.root;if(A.setup.supportsSVG){var o=!1,a=function(e){return E.createTextNode(e)};null==e&&(o=!0),e=f(e,i.properties.width,i.properties.height),o&&(t=u(\"text\",C),r=a(null),c(t,{x:0}),t.appendChild(r),e.appendChild(t),E.body.appendChild(e),e.style.visibility=\"hidden\",e.style.position=\"absolute\",e.style.top=\"-100%\",e.style.left=\"-100%\");var l=i.children.holderTextGroup,s=l.properties;c(t,{y:s.font.size,style:m({\"font-weight\":s.font.weight,\"font-size\":s.font.size+\"px\",\"font-family\":s.font.family,\"dominant-baseline\":\"middle\"})}),r.nodeValue=s.text;var d=t.getBBox(),h=Math.ceil(d.width/(i.properties.width*A.setup.lineWrapRatio)),g=s.text.split(\" \"),p=s.text.match(/\\\\n/g);h+=null==p?0:p.length,r.nodeValue=s.text.replace(/[ ]+/g,\"\");var v=t.getComputedTextLength(),x=d.width-v,y=Math.round(x/Math.max(1,g.length-1)),w=[];if(h>1){r.nodeValue=\"\";for(var b=0;b<g.length;b++)if(0!==g[b].length){r.nodeValue=S(g[b]);var k=t.getBBox();w.push({text:g[b],width:k.width})}}return{spaceWidth:y,lineCount:h,boundingBox:d,words:w}}return!1}}(),L=function(){var e=u(\"canvas\"),t=null;return function(r){null==t&&(t=e.getContext(\"2d\"));var n=r.root;e.width=A.dpr(n.properties.width),e.height=A.dpr(n.properties.height),t.textBaseline=\"middle\",t.fillStyle=n.children.holderBg.properties.fill,t.fillRect(0,0,A.dpr(n.children.holderBg.width),A.dpr(n.children.holderBg.height));{var i=n.children.holderTextGroup;i.properties}t.font=i.properties.font.weight+\" \"+A.dpr(i.properties.font.size)+\"px \"+i.properties.font.family+\", monospace\",t.fillStyle=i.properties.fill;for(var o in i.children){var a=i.children[o];for(var l in a.children){var s=a.children[l],d=A.dpr(i.x+a.x+s.x),h=A.dpr(i.y+a.y+s.y+i.properties.leading/2);t.fillText(s.properties.text,d,h)}}return e.toDataURL(\"image/png\")}}(),O=function(){if(t.XMLSerializer){var e=f(null,0,0),r=u(\"rect\",C);return e.appendChild(r),function(t,n){var i=t.root;f(e,i.properties.width,i.properties.height);for(var o=e.querySelectorAll(\"g\"),a=0;a<o.length;a++)o[a].parentNode.removeChild(o[a]);c(r,{width:i.children.holderBg.width,height:i.children.holderBg.height,fill:i.children.holderBg.properties.fill});var l=i.children.holderTextGroup,s=l.properties,d=u(\"g\",C);e.appendChild(d);for(var h in l.children){var p=l.children[h];for(var v in p.children){var x=p.children[v],y=l.x+p.x+x.x,w=l.y+p.y+x.y+l.properties.leading/2,b=u(\"text\",C),S=E.createTextNode(null);c(b,{x:y,y:w,style:m({fill:s.fill,\"font-weight\":s.font.weight,\"font-family\":s.font.family+\", monospace\",\"font-size\":s.font.size+\"px\",\"dominant-baseline\":\"central\"})}),S.nodeValue=x.properties.text,b.appendChild(S),d.appendChild(b)}}var k=\"data:image/svg+xml;base64,\"+btoa(unescape(encodeURIComponent(g(e,n))));return k}}}(),F=function(e){function t(e,t){for(var r in t)e[r]=t[r];return e}var r=1,n=augment.defclass({constructor:function(e){r++,this.parent=null,this.children={},this.id=r,this.name=\"n\"+r,null!=e&&(this.name=e),this.x=0,this.y=0,this.z=0,this.width=0,this.height=0},resize:function(e,t){null!=e&&(this.width=e),null!=t&&(this.height=t)},moveTo:function(e,t,r){this.x=null!=e?e:this.x,this.y=null!=t?t:this.y,this.z=null!=r?r:this.z},add:function(e){var t=e.name;if(null!=this.children[t])throw\"SceneGraph: child with that name already exists: \"+t;this.children[t]=e,e.parent=this}}),i=augment(n,function(t){this.constructor=function(){t.constructor.call(this,\"root\"),this.properties=e}}),o=augment(n,function(e){function r(r,n){if(e.constructor.call(this,r),this.properties={fill:\"#000\"},null!=n)t(this.properties,n);else if(null!=r&&\"string\"!=typeof r)throw\"SceneGraph: invalid node name\"}this.Group=augment.extend(this,{constructor:r,type:\"group\"}),this.Rect=augment.extend(this,{constructor:r,type:\"rect\"}),this.Text=augment.extend(this,{constructor:function(e){r.call(this),this.properties.text=e},type:\"text\"})}),a=new i;return this.Shape=o,this.root=a,this};for(var z in A.flags)A.flags.hasOwnProperty(z)&&(A.flags[z].match=function(e){return e.match(this.regex)});A.setup={renderer:\"html\",debounce:100,ratio:1,supportsCanvas:!1,supportsSVG:!1,lineWrapRatio:.9,renderers:[\"html\",\"canvas\",\"svg\"]},A.dpr=function(e){return e*A.setup.ratio},A.vars={preempted:!1,resizableImages:[],debounceTimer:null,cache:{}},function(){var e=1,r=1,n=u(\"canvas\"),i=null;n.getContext&&-1!=n.toDataURL(\"image/png\").indexOf(\"data:image/png\")&&(A.setup.renderer=\"canvas\",i=n.getContext(\"2d\"),A.setup.supportsCanvas=!0),A.setup.supportsCanvas&&(e=t.devicePixelRatio||1,r=i.webkitBackingStorePixelRatio||i.mozBackingStorePixelRatio||i.msBackingStorePixelRatio||i.oBackingStorePixelRatio||i.backingStorePixelRatio||1),A.setup.ratio=e/r,E.createElementNS&&E.createElementNS(C,\"svg\").createSVGRect&&(A.setup.renderer=\"svg\",A.setup.supportsSVG=!0)}(),e(k,\"Holder\",t),t.onDomReady&&t.onDomReady(function(){A.vars.preempted||k.run(),t.addEventListener?(t.addEventListener(\"resize\",x,!1),t.addEventListener(\"orientationchange\",x,!1)):t.attachEvent(\"onresize\",x),\"object\"==typeof t.Turbolinks&&t.document.addEventListener(\"page:change\",function(){k.run()})})}(function(e,t,r){var n=\"function\"==typeof define&&define.amd;n?define(e):r[t]=e},this);\n/*!\n * typeahead.js 0.10.5\n * https://github.com/twitter/typeahead.js\n * Copyright 2013-2014 Twitter, Inc. and other contributors; Licensed MIT\n */\n\n(function($) {\n    var _ = function() {\n        \"use strict\";\n        return {\n            isMsie: function() {\n                return /(msie|trident)/i.test(navigator.userAgent) ? navigator.userAgent.match(/(msie |rv:)(\\d+(.\\d+)?)/i)[2] : false;\n            },\n            isBlankString: function(str) {\n                return !str || /^\\s*$/.test(str);\n            },\n            escapeRegExChars: function(str) {\n                return str.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, \"\\\\$&\");\n            },\n            isString: function(obj) {\n                return typeof obj === \"string\";\n            },\n            isNumber: function(obj) {\n                return typeof obj === \"number\";\n            },\n            isArray: $.isArray,\n            isFunction: $.isFunction,\n            isObject: $.isPlainObject,\n            isUndefined: function(obj) {\n                return typeof obj === \"undefined\";\n            },\n            toStr: function toStr(s) {\n                return _.isUndefined(s) || s === null ? \"\" : s + \"\";\n            },\n            bind: $.proxy,\n            each: function(collection, cb) {\n                $.each(collection, reverseArgs);\n                function reverseArgs(index, value) {\n                    return cb(value, index);\n                }\n            },\n            map: $.map,\n            filter: $.grep,\n            every: function(obj, test) {\n                var result = true;\n                if (!obj) {\n                    return result;\n                }\n                $.each(obj, function(key, val) {\n                    if (!(result = test.call(null, val, key, obj))) {\n                        return false;\n                    }\n                });\n                return !!result;\n            },\n            some: function(obj, test) {\n                var result = false;\n                if (!obj) {\n                    return result;\n                }\n                $.each(obj, function(key, val) {\n                    if (result = test.call(null, val, key, obj)) {\n                        return false;\n                    }\n                });\n                return !!result;\n            },\n            mixin: $.extend,\n            getUniqueId: function() {\n                var counter = 0;\n                return function() {\n                    return counter++;\n                };\n            }(),\n            templatify: function templatify(obj) {\n                return $.isFunction(obj) ? obj : template;\n                function template() {\n                    return String(obj);\n                }\n            },\n            defer: function(fn) {\n                setTimeout(fn, 0);\n            },\n            debounce: function(func, wait, immediate) {\n                var timeout, result;\n                return function() {\n                    var context = this, args = arguments, later, callNow;\n                    later = function() {\n                        timeout = null;\n                        if (!immediate) {\n                            result = func.apply(context, args);\n                        }\n                    };\n                    callNow = immediate && !timeout;\n                    clearTimeout(timeout);\n                    timeout = setTimeout(later, wait);\n                    if (callNow) {\n                        result = func.apply(context, args);\n                    }\n                    return result;\n                };\n            },\n            throttle: function(func, wait) {\n                var context, args, timeout, result, previous, later;\n                previous = 0;\n                later = function() {\n                    previous = new Date();\n                    timeout = null;\n                    result = func.apply(context, args);\n                };\n                return function() {\n                    var now = new Date(), remaining = wait - (now - previous);\n                    context = this;\n                    args = arguments;\n                    if (remaining <= 0) {\n                        clearTimeout(timeout);\n                        timeout = null;\n                        previous = now;\n                        result = func.apply(context, args);\n                    } else if (!timeout) {\n                        timeout = setTimeout(later, remaining);\n                    }\n                    return result;\n                };\n            },\n            noop: function() {}\n        };\n    }();\n    var VERSION = \"0.10.5\";\n    var tokenizers = function() {\n        \"use strict\";\n        return {\n            nonword: nonword,\n            whitespace: whitespace,\n            obj: {\n                nonword: getObjTokenizer(nonword),\n                whitespace: getObjTokenizer(whitespace)\n            }\n        };\n        function whitespace(str) {\n            str = _.toStr(str);\n            return str ? str.split(/\\s+/) : [];\n        }\n        function nonword(str) {\n            str = _.toStr(str);\n            return str ? str.split(/\\W+/) : [];\n        }\n        function getObjTokenizer(tokenizer) {\n            return function setKey() {\n                var args = [].slice.call(arguments, 0);\n                return function tokenize(o) {\n                    var tokens = [];\n                    _.each(args, function(k) {\n                        tokens = tokens.concat(tokenizer(_.toStr(o[k])));\n                    });\n                    return tokens;\n                };\n            };\n        }\n    }();\n    var LruCache = function() {\n        \"use strict\";\n        function LruCache(maxSize) {\n            this.maxSize = _.isNumber(maxSize) ? maxSize : 100;\n            this.reset();\n            if (this.maxSize <= 0) {\n                this.set = this.get = $.noop;\n            }\n        }\n        _.mixin(LruCache.prototype, {\n            set: function set(key, val) {\n                var tailItem = this.list.tail, node;\n                if (this.size >= this.maxSize) {\n                    this.list.remove(tailItem);\n                    delete this.hash[tailItem.key];\n                }\n                if (node = this.hash[key]) {\n                    node.val = val;\n                    this.list.moveToFront(node);\n                } else {\n                    node = new Node(key, val);\n                    this.list.add(node);\n                    this.hash[key] = node;\n                    this.size++;\n                }\n            },\n            get: function get(key) {\n                var node = this.hash[key];\n                if (node) {\n                    this.list.moveToFront(node);\n                    return node.val;\n                }\n            },\n            reset: function reset() {\n                this.size = 0;\n                this.hash = {};\n                this.list = new List();\n            }\n        });\n        function List() {\n            this.head = this.tail = null;\n        }\n        _.mixin(List.prototype, {\n            add: function add(node) {\n                if (this.head) {\n                    node.next = this.head;\n                    this.head.prev = node;\n                }\n                this.head = node;\n                this.tail = this.tail || node;\n            },\n            remove: function remove(node) {\n                node.prev ? node.prev.next = node.next : this.head = node.next;\n                node.next ? node.next.prev = node.prev : this.tail = node.prev;\n            },\n            moveToFront: function(node) {\n                this.remove(node);\n                this.add(node);\n            }\n        });\n        function Node(key, val) {\n            this.key = key;\n            this.val = val;\n            this.prev = this.next = null;\n        }\n        return LruCache;\n    }();\n    var PersistentStorage = function() {\n        \"use strict\";\n        var ls, methods;\n        try {\n            ls = window.localStorage;\n            ls.setItem(\"~~~\", \"!\");\n            ls.removeItem(\"~~~\");\n        } catch (err) {\n            ls = null;\n        }\n        function PersistentStorage(namespace) {\n            this.prefix = [ \"__\", namespace, \"__\" ].join(\"\");\n            this.ttlKey = \"__ttl__\";\n            this.keyMatcher = new RegExp(\"^\" + _.escapeRegExChars(this.prefix));\n        }\n        if (ls && window.JSON) {\n            methods = {\n                _prefix: function(key) {\n                    return this.prefix + key;\n                },\n                _ttlKey: function(key) {\n                    return this._prefix(key) + this.ttlKey;\n                },\n                get: function(key) {\n                    if (this.isExpired(key)) {\n                        this.remove(key);\n                    }\n                    return decode(ls.getItem(this._prefix(key)));\n                },\n                set: function(key, val, ttl) {\n                    if (_.isNumber(ttl)) {\n                        ls.setItem(this._ttlKey(key), encode(now() + ttl));\n                    } else {\n                        ls.removeItem(this._ttlKey(key));\n                    }\n                    return ls.setItem(this._prefix(key), encode(val));\n                },\n                remove: function(key) {\n                    ls.removeItem(this._ttlKey(key));\n                    ls.removeItem(this._prefix(key));\n                    return this;\n                },\n                clear: function() {\n                    var i, key, keys = [], len = ls.length;\n                    for (i = 0; i < len; i++) {\n                        if ((key = ls.key(i)).match(this.keyMatcher)) {\n                            keys.push(key.replace(this.keyMatcher, \"\"));\n                        }\n                    }\n                    for (i = keys.length; i--; ) {\n                        this.remove(keys[i]);\n                    }\n                    return this;\n                },\n                isExpired: function(key) {\n                    var ttl = decode(ls.getItem(this._ttlKey(key)));\n                    return _.isNumber(ttl) && now() > ttl ? true : false;\n                }\n            };\n        } else {\n            methods = {\n                get: _.noop,\n                set: _.noop,\n                remove: _.noop,\n                clear: _.noop,\n                isExpired: _.noop\n            };\n        }\n        _.mixin(PersistentStorage.prototype, methods);\n        return PersistentStorage;\n        function now() {\n            return new Date().getTime();\n        }\n        function encode(val) {\n            return JSON.stringify(_.isUndefined(val) ? null : val);\n        }\n        function decode(val) {\n            return JSON.parse(val);\n        }\n    }();\n    var Transport = function() {\n        \"use strict\";\n        var pendingRequestsCount = 0, pendingRequests = {}, maxPendingRequests = 6, sharedCache = new LruCache(10);\n        function Transport(o) {\n            o = o || {};\n            this.cancelled = false;\n            this.lastUrl = null;\n            this._send = o.transport ? callbackToDeferred(o.transport) : $.ajax;\n            this._get = o.rateLimiter ? o.rateLimiter(this._get) : this._get;\n            this._cache = o.cache === false ? new LruCache(0) : sharedCache;\n        }\n        Transport.setMaxPendingRequests = function setMaxPendingRequests(num) {\n            maxPendingRequests = num;\n        };\n        Transport.resetCache = function resetCache() {\n            sharedCache.reset();\n        };\n        _.mixin(Transport.prototype, {\n            _get: function(url, o, cb) {\n                var that = this, jqXhr;\n                if (this.cancelled || url !== this.lastUrl) {\n                    return;\n                }\n                if (jqXhr = pendingRequests[url]) {\n                    jqXhr.done(done).fail(fail);\n                } else if (pendingRequestsCount < maxPendingRequests) {\n                    pendingRequestsCount++;\n                    pendingRequests[url] = this._send(url, o).done(done).fail(fail).always(always);\n                } else {\n                    this.onDeckRequestArgs = [].slice.call(arguments, 0);\n                }\n                function done(resp) {\n                    cb && cb(null, resp);\n                    that._cache.set(url, resp);\n                }\n                function fail() {\n                    cb && cb(true);\n                }\n                function always() {\n                    pendingRequestsCount--;\n                    delete pendingRequests[url];\n                    if (that.onDeckRequestArgs) {\n                        that._get.apply(that, that.onDeckRequestArgs);\n                        that.onDeckRequestArgs = null;\n                    }\n                }\n            },\n            get: function(url, o, cb) {\n                var resp;\n                if (_.isFunction(o)) {\n                    cb = o;\n                    o = {};\n                }\n                this.cancelled = false;\n                this.lastUrl = url;\n                if (resp = this._cache.get(url)) {\n                    _.defer(function() {\n                        cb && cb(null, resp);\n                    });\n                } else {\n                    this._get(url, o, cb);\n                }\n                return !!resp;\n            },\n            cancel: function() {\n                this.cancelled = true;\n            }\n        });\n        return Transport;\n        function callbackToDeferred(fn) {\n            return function customSendWrapper(url, o) {\n                var deferred = $.Deferred();\n                fn(url, o, onSuccess, onError);\n                return deferred;\n                function onSuccess(resp) {\n                    _.defer(function() {\n                        deferred.resolve(resp);\n                    });\n                }\n                function onError(err) {\n                    _.defer(function() {\n                        deferred.reject(err);\n                    });\n                }\n            };\n        }\n    }();\n    var SearchIndex = function() {\n        \"use strict\";\n        function SearchIndex(o) {\n            o = o || {};\n            if (!o.datumTokenizer || !o.queryTokenizer) {\n                $.error(\"datumTokenizer and queryTokenizer are both required\");\n            }\n            this.datumTokenizer = o.datumTokenizer;\n            this.queryTokenizer = o.queryTokenizer;\n            this.reset();\n        }\n        _.mixin(SearchIndex.prototype, {\n            bootstrap: function bootstrap(o) {\n                this.datums = o.datums;\n                this.trie = o.trie;\n            },\n            add: function(data) {\n                var that = this;\n                data = _.isArray(data) ? data : [ data ];\n                _.each(data, function(datum) {\n                    var id, tokens;\n                    id = that.datums.push(datum) - 1;\n                    tokens = normalizeTokens(that.datumTokenizer(datum));\n                    _.each(tokens, function(token) {\n                        var node, chars, ch;\n                        node = that.trie;\n                        chars = token.split(\"\");\n                        while (ch = chars.shift()) {\n                            node = node.children[ch] || (node.children[ch] = newNode());\n                            node.ids.push(id);\n                        }\n                    });\n                });\n            },\n            get: function get(query) {\n                var that = this, tokens, matches;\n                tokens = normalizeTokens(this.queryTokenizer(query));\n                _.each(tokens, function(token) {\n                    var node, chars, ch, ids;\n                    if (matches && matches.length === 0) {\n                        return false;\n                    }\n                    node = that.trie;\n                    chars = token.split(\"\");\n                    while (node && (ch = chars.shift())) {\n                        node = node.children[ch];\n                    }\n                    if (node && chars.length === 0) {\n                        ids = node.ids.slice(0);\n                        matches = matches ? getIntersection(matches, ids) : ids;\n                    } else {\n                        matches = [];\n                        return false;\n                    }\n                });\n                return matches ? _.map(unique(matches), function(id) {\n                    return that.datums[id];\n                }) : [];\n            },\n            reset: function reset() {\n                this.datums = [];\n                this.trie = newNode();\n            },\n            serialize: function serialize() {\n                return {\n                    datums: this.datums,\n                    trie: this.trie\n                };\n            }\n        });\n        return SearchIndex;\n        function normalizeTokens(tokens) {\n            tokens = _.filter(tokens, function(token) {\n                return !!token;\n            });\n            tokens = _.map(tokens, function(token) {\n                return token.toLowerCase();\n            });\n            return tokens;\n        }\n        function newNode() {\n            return {\n                ids: [],\n                children: {}\n            };\n        }\n        function unique(array) {\n            var seen = {}, uniques = [];\n            for (var i = 0, len = array.length; i < len; i++) {\n                if (!seen[array[i]]) {\n                    seen[array[i]] = true;\n                    uniques.push(array[i]);\n                }\n            }\n            return uniques;\n        }\n        function getIntersection(arrayA, arrayB) {\n            var ai = 0, bi = 0, intersection = [];\n            arrayA = arrayA.sort(compare);\n            arrayB = arrayB.sort(compare);\n            var lenArrayA = arrayA.length, lenArrayB = arrayB.length;\n            while (ai < lenArrayA && bi < lenArrayB) {\n                if (arrayA[ai] < arrayB[bi]) {\n                    ai++;\n                } else if (arrayA[ai] > arrayB[bi]) {\n                    bi++;\n                } else {\n                    intersection.push(arrayA[ai]);\n                    ai++;\n                    bi++;\n                }\n            }\n            return intersection;\n            function compare(a, b) {\n                return a - b;\n            }\n        }\n    }();\n    var oParser = function() {\n        \"use strict\";\n        return {\n            local: getLocal,\n            prefetch: getPrefetch,\n            remote: getRemote\n        };\n        function getLocal(o) {\n            return o.local || null;\n        }\n        function getPrefetch(o) {\n            var prefetch, defaults;\n            defaults = {\n                url: null,\n                thumbprint: \"\",\n                ttl: 24 * 60 * 60 * 1e3,\n                filter: null,\n                ajax: {}\n            };\n            if (prefetch = o.prefetch || null) {\n                prefetch = _.isString(prefetch) ? {\n                    url: prefetch\n                } : prefetch;\n                prefetch = _.mixin(defaults, prefetch);\n                prefetch.thumbprint = VERSION + prefetch.thumbprint;\n                prefetch.ajax.type = prefetch.ajax.type || \"GET\";\n                prefetch.ajax.dataType = prefetch.ajax.dataType || \"json\";\n                !prefetch.url && $.error(\"prefetch requires url to be set\");\n            }\n            return prefetch;\n        }\n        function getRemote(o) {\n            var remote, defaults;\n            defaults = {\n                url: null,\n                cache: true,\n                wildcard: \"%QUERY\",\n                replace: null,\n                rateLimitBy: \"debounce\",\n                rateLimitWait: 300,\n                send: null,\n                filter: null,\n                ajax: {}\n            };\n            if (remote = o.remote || null) {\n                remote = _.isString(remote) ? {\n                    url: remote\n                } : remote;\n                remote = _.mixin(defaults, remote);\n                remote.rateLimiter = /^throttle$/i.test(remote.rateLimitBy) ? byThrottle(remote.rateLimitWait) : byDebounce(remote.rateLimitWait);\n                remote.ajax.type = remote.ajax.type || \"GET\";\n                remote.ajax.dataType = remote.ajax.dataType || \"json\";\n                delete remote.rateLimitBy;\n                delete remote.rateLimitWait;\n                !remote.url && $.error(\"remote requires url to be set\");\n            }\n            return remote;\n            function byDebounce(wait) {\n                return function(fn) {\n                    return _.debounce(fn, wait);\n                };\n            }\n            function byThrottle(wait) {\n                return function(fn) {\n                    return _.throttle(fn, wait);\n                };\n            }\n        }\n    }();\n    (function(root) {\n        \"use strict\";\n        var old, keys;\n        old = root.Bloodhound;\n        keys = {\n            data: \"data\",\n            protocol: \"protocol\",\n            thumbprint: \"thumbprint\"\n        };\n        root.Bloodhound = Bloodhound;\n        function Bloodhound(o) {\n            if (!o || !o.local && !o.prefetch && !o.remote) {\n                $.error(\"one of local, prefetch, or remote is required\");\n            }\n            this.limit = o.limit || 5;\n            this.sorter = getSorter(o.sorter);\n            this.dupDetector = o.dupDetector || ignoreDuplicates;\n            this.local = oParser.local(o);\n            this.prefetch = oParser.prefetch(o);\n            this.remote = oParser.remote(o);\n            this.cacheKey = this.prefetch ? this.prefetch.cacheKey || this.prefetch.url : null;\n            this.index = new SearchIndex({\n                datumTokenizer: o.datumTokenizer,\n                queryTokenizer: o.queryTokenizer\n            });\n            this.storage = this.cacheKey ? new PersistentStorage(this.cacheKey) : null;\n        }\n        Bloodhound.noConflict = function noConflict() {\n            root.Bloodhound = old;\n            return Bloodhound;\n        };\n        Bloodhound.tokenizers = tokenizers;\n        _.mixin(Bloodhound.prototype, {\n            _loadPrefetch: function loadPrefetch(o) {\n                var that = this, serialized, deferred;\n                if (serialized = this._readFromStorage(o.thumbprint)) {\n                    this.index.bootstrap(serialized);\n                    deferred = $.Deferred().resolve();\n                } else {\n                    deferred = $.ajax(o.url, o.ajax).done(handlePrefetchResponse);\n                }\n                return deferred;\n                function handlePrefetchResponse(resp) {\n                    that.clear();\n                    that.add(o.filter ? o.filter(resp) : resp);\n                    that._saveToStorage(that.index.serialize(), o.thumbprint, o.ttl);\n                }\n            },\n            _getFromRemote: function getFromRemote(query, cb) {\n                var that = this, url, uriEncodedQuery;\n                if (!this.transport) {\n                    return;\n                }\n                query = query || \"\";\n                uriEncodedQuery = encodeURIComponent(query);\n                url = this.remote.replace ? this.remote.replace(this.remote.url, query) : this.remote.url.replace(this.remote.wildcard, uriEncodedQuery);\n                return this.transport.get(url, this.remote.ajax, handleRemoteResponse);\n                function handleRemoteResponse(err, resp) {\n                    err ? cb([]) : cb(that.remote.filter ? that.remote.filter(resp) : resp);\n                }\n            },\n            _cancelLastRemoteRequest: function cancelLastRemoteRequest() {\n                this.transport && this.transport.cancel();\n            },\n            _saveToStorage: function saveToStorage(data, thumbprint, ttl) {\n                if (this.storage) {\n                    this.storage.set(keys.data, data, ttl);\n                    this.storage.set(keys.protocol, location.protocol, ttl);\n                    this.storage.set(keys.thumbprint, thumbprint, ttl);\n                }\n            },\n            _readFromStorage: function readFromStorage(thumbprint) {\n                var stored = {}, isExpired;\n                if (this.storage) {\n                    stored.data = this.storage.get(keys.data);\n                    stored.protocol = this.storage.get(keys.protocol);\n                    stored.thumbprint = this.storage.get(keys.thumbprint);\n                }\n                isExpired = stored.thumbprint !== thumbprint || stored.protocol !== location.protocol;\n                return stored.data && !isExpired ? stored.data : null;\n            },\n            _initialize: function initialize() {\n                var that = this, local = this.local, deferred;\n                deferred = this.prefetch ? this._loadPrefetch(this.prefetch) : $.Deferred().resolve();\n                local && deferred.done(addLocalToIndex);\n                this.transport = this.remote ? new Transport(this.remote) : null;\n                return this.initPromise = deferred.promise();\n                function addLocalToIndex() {\n                    that.add(_.isFunction(local) ? local() : local);\n                }\n            },\n            initialize: function initialize(force) {\n                return !this.initPromise || force ? this._initialize() : this.initPromise;\n            },\n            add: function add(data) {\n                this.index.add(data);\n            },\n            get: function get(query, cb) {\n                var that = this, matches = [], cacheHit = false;\n                matches = this.index.get(query);\n                matches = this.sorter(matches).slice(0, this.limit);\n                matches.length < this.limit ? cacheHit = this._getFromRemote(query, returnRemoteMatches) : this._cancelLastRemoteRequest();\n                if (!cacheHit) {\n                    (matches.length > 0 || !this.transport) && cb && cb(matches);\n                }\n                function returnRemoteMatches(remoteMatches) {\n                    var matchesWithBackfill = matches.slice(0);\n                    _.each(remoteMatches, function(remoteMatch) {\n                        var isDuplicate;\n                        isDuplicate = _.some(matchesWithBackfill, function(match) {\n                            return that.dupDetector(remoteMatch, match);\n                        });\n                        !isDuplicate && matchesWithBackfill.push(remoteMatch);\n                        return matchesWithBackfill.length < that.limit;\n                    });\n                    cb && cb(that.sorter(matchesWithBackfill));\n                }\n            },\n            clear: function clear() {\n                this.index.reset();\n            },\n            clearPrefetchCache: function clearPrefetchCache() {\n                this.storage && this.storage.clear();\n            },\n            clearRemoteCache: function clearRemoteCache() {\n                this.transport && Transport.resetCache();\n            },\n            ttAdapter: function ttAdapter() {\n                return _.bind(this.get, this);\n            }\n        });\n        return Bloodhound;\n        function getSorter(sortFn) {\n            return _.isFunction(sortFn) ? sort : noSort;\n            function sort(array) {\n                return array.sort(sortFn);\n            }\n            function noSort(array) {\n                return array;\n            }\n        }\n        function ignoreDuplicates() {\n            return false;\n        }\n    })(this);\n    var html = function() {\n        return {\n            wrapper: '<span class=\"twitter-typeahead\"></span>',\n            dropdown: '<span class=\"tt-dropdown-menu\"></span>',\n            dataset: '<div class=\"tt-dataset-%CLASS%\"></div>',\n            suggestions: '<span class=\"tt-suggestions\"></span>',\n            suggestion: '<div class=\"tt-suggestion\"></div>'\n        };\n    }();\n    var css = function() {\n        \"use strict\";\n        var css = {\n            wrapper: {\n                position: \"relative\",\n                display: \"inline-block\"\n            },\n            hint: {\n                position: \"absolute\",\n                top: \"0\",\n                left: \"0\",\n                borderColor: \"transparent\",\n                boxShadow: \"none\",\n                opacity: \"1\"\n            },\n            input: {\n                position: \"relative\",\n                verticalAlign: \"top\",\n                backgroundColor: \"transparent\"\n            },\n            inputWithNoHint: {\n                position: \"relative\",\n                verticalAlign: \"top\"\n            },\n            dropdown: {\n                position: \"absolute\",\n                top: \"100%\",\n                left: \"0\",\n                zIndex: \"100\",\n                display: \"none\"\n            },\n            suggestions: {\n                display: \"block\"\n            },\n            suggestion: {\n                whiteSpace: \"nowrap\",\n                cursor: \"pointer\"\n            },\n            suggestionChild: {\n                whiteSpace: \"normal\"\n            },\n            ltr: {\n                left: \"0\",\n                right: \"auto\"\n            },\n            rtl: {\n                left: \"auto\",\n                right: \" 0\"\n            }\n        };\n        if (_.isMsie()) {\n            _.mixin(css.input, {\n                backgroundImage: \"url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)\"\n            });\n        }\n        if (_.isMsie() && _.isMsie() <= 7) {\n            _.mixin(css.input, {\n                marginTop: \"-1px\"\n            });\n        }\n        return css;\n    }();\n    var EventBus = function() {\n        \"use strict\";\n        var namespace = \"typeahead:\";\n        function EventBus(o) {\n            if (!o || !o.el) {\n                $.error(\"EventBus initialized without el\");\n            }\n            this.$el = $(o.el);\n        }\n        _.mixin(EventBus.prototype, {\n            trigger: function(type) {\n                var args = [].slice.call(arguments, 1);\n                this.$el.trigger(namespace + type, args);\n            }\n        });\n        return EventBus;\n    }();\n    var EventEmitter = function() {\n        \"use strict\";\n        var splitter = /\\s+/, nextTick = getNextTick();\n        return {\n            onSync: onSync,\n            onAsync: onAsync,\n            off: off,\n            trigger: trigger\n        };\n        function on(method, types, cb, context) {\n            var type;\n            if (!cb) {\n                return this;\n            }\n            types = types.split(splitter);\n            cb = context ? bindContext(cb, context) : cb;\n            this._callbacks = this._callbacks || {};\n            while (type = types.shift()) {\n                this._callbacks[type] = this._callbacks[type] || {\n                    sync: [],\n                    async: []\n                };\n                this._callbacks[type][method].push(cb);\n            }\n            return this;\n        }\n        function onAsync(types, cb, context) {\n            return on.call(this, \"async\", types, cb, context);\n        }\n        function onSync(types, cb, context) {\n            return on.call(this, \"sync\", types, cb, context);\n        }\n        function off(types) {\n            var type;\n            if (!this._callbacks) {\n                return this;\n            }\n            types = types.split(splitter);\n            while (type = types.shift()) {\n                delete this._callbacks[type];\n            }\n            return this;\n        }\n        function trigger(types) {\n            var type, callbacks, args, syncFlush, asyncFlush;\n            if (!this._callbacks) {\n                return this;\n            }\n            types = types.split(splitter);\n            args = [].slice.call(arguments, 1);\n            while ((type = types.shift()) && (callbacks = this._callbacks[type])) {\n                syncFlush = getFlush(callbacks.sync, this, [ type ].concat(args));\n                asyncFlush = getFlush(callbacks.async, this, [ type ].concat(args));\n                syncFlush() && nextTick(asyncFlush);\n            }\n            return this;\n        }\n        function getFlush(callbacks, context, args) {\n            return flush;\n            function flush() {\n                var cancelled;\n                for (var i = 0, len = callbacks.length; !cancelled && i < len; i += 1) {\n                    cancelled = callbacks[i].apply(context, args) === false;\n                }\n                return !cancelled;\n            }\n        }\n        function getNextTick() {\n            var nextTickFn;\n            if (window.setImmediate) {\n                nextTickFn = function nextTickSetImmediate(fn) {\n                    setImmediate(function() {\n                        fn();\n                    });\n                };\n            } else {\n                nextTickFn = function nextTickSetTimeout(fn) {\n                    setTimeout(function() {\n                        fn();\n                    }, 0);\n                };\n            }\n            return nextTickFn;\n        }\n        function bindContext(fn, context) {\n            return fn.bind ? fn.bind(context) : function() {\n                fn.apply(context, [].slice.call(arguments, 0));\n            };\n        }\n    }();\n    var highlight = function(doc) {\n        \"use strict\";\n        var defaults = {\n            node: null,\n            pattern: null,\n            tagName: \"strong\",\n            className: null,\n            wordsOnly: false,\n            caseSensitive: false\n        };\n        return function hightlight(o) {\n            var regex;\n            o = _.mixin({}, defaults, o);\n            if (!o.node || !o.pattern) {\n                return;\n            }\n            o.pattern = _.isArray(o.pattern) ? o.pattern : [ o.pattern ];\n            regex = getRegex(o.pattern, o.caseSensitive, o.wordsOnly);\n            traverse(o.node, hightlightTextNode);\n            function hightlightTextNode(textNode) {\n                var match, patternNode, wrapperNode;\n                if (match = regex.exec(textNode.data)) {\n                    wrapperNode = doc.createElement(o.tagName);\n                    o.className && (wrapperNode.className = o.className);\n                    patternNode = textNode.splitText(match.index);\n                    patternNode.splitText(match[0].length);\n                    wrapperNode.appendChild(patternNode.cloneNode(true));\n                    textNode.parentNode.replaceChild(wrapperNode, patternNode);\n                }\n                return !!match;\n            }\n            function traverse(el, hightlightTextNode) {\n                var childNode, TEXT_NODE_TYPE = 3;\n                for (var i = 0; i < el.childNodes.length; i++) {\n                    childNode = el.childNodes[i];\n                    if (childNode.nodeType === TEXT_NODE_TYPE) {\n                        i += hightlightTextNode(childNode) ? 1 : 0;\n                    } else {\n                        traverse(childNode, hightlightTextNode);\n                    }\n                }\n            }\n        };\n        function getRegex(patterns, caseSensitive, wordsOnly) {\n            var escapedPatterns = [], regexStr;\n            for (var i = 0, len = patterns.length; i < len; i++) {\n                escapedPatterns.push(_.escapeRegExChars(patterns[i]));\n            }\n            regexStr = wordsOnly ? \"\\\\b(\" + escapedPatterns.join(\"|\") + \")\\\\b\" : \"(\" + escapedPatterns.join(\"|\") + \")\";\n            return caseSensitive ? new RegExp(regexStr) : new RegExp(regexStr, \"i\");\n        }\n    }(window.document);\n    var Input = function() {\n        \"use strict\";\n        var specialKeyCodeMap;\n        specialKeyCodeMap = {\n            9: \"tab\",\n            27: \"esc\",\n            37: \"left\",\n            39: \"right\",\n            13: \"enter\",\n            38: \"up\",\n            40: \"down\"\n        };\n        function Input(o) {\n            var that = this, onBlur, onFocus, onKeydown, onInput;\n            o = o || {};\n            if (!o.input) {\n                $.error(\"input is missing\");\n            }\n            onBlur = _.bind(this._onBlur, this);\n            onFocus = _.bind(this._onFocus, this);\n            onKeydown = _.bind(this._onKeydown, this);\n            onInput = _.bind(this._onInput, this);\n            this.$hint = $(o.hint);\n            this.$input = $(o.input).on(\"blur.tt\", onBlur).on(\"focus.tt\", onFocus).on(\"keydown.tt\", onKeydown);\n            if (this.$hint.length === 0) {\n                this.setHint = this.getHint = this.clearHint = this.clearHintIfInvalid = _.noop;\n            }\n            if (!_.isMsie()) {\n                this.$input.on(\"input.tt\", onInput);\n            } else {\n                this.$input.on(\"keydown.tt keypress.tt cut.tt paste.tt\", function($e) {\n                    if (specialKeyCodeMap[$e.which || $e.keyCode]) {\n                        return;\n                    }\n                    _.defer(_.bind(that._onInput, that, $e));\n                });\n            }\n            this.query = this.$input.val();\n            this.$overflowHelper = buildOverflowHelper(this.$input);\n        }\n        Input.normalizeQuery = function(str) {\n            return (str || \"\").replace(/^\\s*/g, \"\").replace(/\\s{2,}/g, \" \");\n        };\n        _.mixin(Input.prototype, EventEmitter, {\n            _onBlur: function onBlur() {\n                this.resetInputValue();\n                this.trigger(\"blurred\");\n            },\n            _onFocus: function onFocus() {\n                this.trigger(\"focused\");\n            },\n            _onKeydown: function onKeydown($e) {\n                var keyName = specialKeyCodeMap[$e.which || $e.keyCode];\n                this._managePreventDefault(keyName, $e);\n                if (keyName && this._shouldTrigger(keyName, $e)) {\n                    this.trigger(keyName + \"Keyed\", $e);\n                }\n            },\n            _onInput: function onInput() {\n                this._checkInputValue();\n            },\n            _managePreventDefault: function managePreventDefault(keyName, $e) {\n                var preventDefault, hintValue, inputValue;\n                switch (keyName) {\n                  case \"tab\":\n                    hintValue = this.getHint();\n                    inputValue = this.getInputValue();\n                    preventDefault = hintValue && hintValue !== inputValue && !withModifier($e);\n                    break;\n\n                  case \"up\":\n                  case \"down\":\n                    preventDefault = !withModifier($e);\n                    break;\n\n                  default:\n                    preventDefault = false;\n                }\n                preventDefault && $e.preventDefault();\n            },\n            _shouldTrigger: function shouldTrigger(keyName, $e) {\n                var trigger;\n                switch (keyName) {\n                  case \"tab\":\n                    trigger = !withModifier($e);\n                    break;\n\n                  default:\n                    trigger = true;\n                }\n                return trigger;\n            },\n            _checkInputValue: function checkInputValue() {\n                var inputValue, areEquivalent, hasDifferentWhitespace;\n                inputValue = this.getInputValue();\n                areEquivalent = areQueriesEquivalent(inputValue, this.query);\n                hasDifferentWhitespace = areEquivalent ? this.query.length !== inputValue.length : false;\n                this.query = inputValue;\n                if (!areEquivalent) {\n                    this.trigger(\"queryChanged\", this.query);\n                } else if (hasDifferentWhitespace) {\n                    this.trigger(\"whitespaceChanged\", this.query);\n                }\n            },\n            focus: function focus() {\n                this.$input.focus();\n            },\n            blur: function blur() {\n                this.$input.blur();\n            },\n            getQuery: function getQuery() {\n                return this.query;\n            },\n            setQuery: function setQuery(query) {\n                this.query = query;\n            },\n            getInputValue: function getInputValue() {\n                return this.$input.val();\n            },\n            setInputValue: function setInputValue(value, silent) {\n                this.$input.val(value);\n                silent ? this.clearHint() : this._checkInputValue();\n            },\n            resetInputValue: function resetInputValue() {\n                this.setInputValue(this.query, true);\n            },\n            getHint: function getHint() {\n                return this.$hint.val();\n            },\n            setHint: function setHint(value) {\n                this.$hint.val(value);\n            },\n            clearHint: function clearHint() {\n                this.setHint(\"\");\n            },\n            clearHintIfInvalid: function clearHintIfInvalid() {\n                var val, hint, valIsPrefixOfHint, isValid;\n                val = this.getInputValue();\n                hint = this.getHint();\n                valIsPrefixOfHint = val !== hint && hint.indexOf(val) === 0;\n                isValid = val !== \"\" && valIsPrefixOfHint && !this.hasOverflow();\n                !isValid && this.clearHint();\n            },\n            getLanguageDirection: function getLanguageDirection() {\n                return (this.$input.css(\"direction\") || \"ltr\").toLowerCase();\n            },\n            hasOverflow: function hasOverflow() {\n                var constraint = this.$input.width() - 2;\n                this.$overflowHelper.text(this.getInputValue());\n                return this.$overflowHelper.width() >= constraint;\n            },\n            isCursorAtEnd: function() {\n                var valueLength, selectionStart, range;\n                valueLength = this.$input.val().length;\n                selectionStart = this.$input[0].selectionStart;\n                if (_.isNumber(selectionStart)) {\n                    return selectionStart === valueLength;\n                } else if (document.selection) {\n                    range = document.selection.createRange();\n                    range.moveStart(\"character\", -valueLength);\n                    return valueLength === range.text.length;\n                }\n                return true;\n            },\n            destroy: function destroy() {\n                this.$hint.off(\".tt\");\n                this.$input.off(\".tt\");\n                this.$hint = this.$input = this.$overflowHelper = null;\n            }\n        });\n        return Input;\n        function buildOverflowHelper($input) {\n            return $('<pre aria-hidden=\"true\"></pre>').css({\n                position: \"absolute\",\n                visibility: \"hidden\",\n                whiteSpace: \"pre\",\n                fontFamily: $input.css(\"font-family\"),\n                fontSize: $input.css(\"font-size\"),\n                fontStyle: $input.css(\"font-style\"),\n                fontVariant: $input.css(\"font-variant\"),\n                fontWeight: $input.css(\"font-weight\"),\n                wordSpacing: $input.css(\"word-spacing\"),\n                letterSpacing: $input.css(\"letter-spacing\"),\n                textIndent: $input.css(\"text-indent\"),\n                textRendering: $input.css(\"text-rendering\"),\n                textTransform: $input.css(\"text-transform\")\n            }).insertAfter($input);\n        }\n        function areQueriesEquivalent(a, b) {\n            return Input.normalizeQuery(a) === Input.normalizeQuery(b);\n        }\n        function withModifier($e) {\n            return $e.altKey || $e.ctrlKey || $e.metaKey || $e.shiftKey;\n        }\n    }();\n    var Dataset = function() {\n        \"use strict\";\n        var datasetKey = \"ttDataset\", valueKey = \"ttValue\", datumKey = \"ttDatum\";\n        function Dataset(o) {\n            o = o || {};\n            o.templates = o.templates || {};\n            if (!o.source) {\n                $.error(\"missing source\");\n            }\n            if (o.name && !isValidName(o.name)) {\n                $.error(\"invalid dataset name: \" + o.name);\n            }\n            this.query = null;\n            this.highlight = !!o.highlight;\n            this.name = o.name || _.getUniqueId();\n            this.source = o.source;\n            this.displayFn = getDisplayFn(o.display || o.displayKey);\n            this.templates = getTemplates(o.templates, this.displayFn);\n            this.$el = $(html.dataset.replace(\"%CLASS%\", this.name));\n        }\n        Dataset.extractDatasetName = function extractDatasetName(el) {\n            return $(el).data(datasetKey);\n        };\n        Dataset.extractValue = function extractDatum(el) {\n            return $(el).data(valueKey);\n        };\n        Dataset.extractDatum = function extractDatum(el) {\n            return $(el).data(datumKey);\n        };\n        _.mixin(Dataset.prototype, EventEmitter, {\n            _render: function render(query, suggestions) {\n                if (!this.$el) {\n                    return;\n                }\n                var that = this, hasSuggestions;\n                this.$el.empty();\n                hasSuggestions = suggestions && suggestions.length;\n                if (!hasSuggestions && this.templates.empty) {\n                    this.$el.html(getEmptyHtml()).prepend(that.templates.header ? getHeaderHtml() : null).append(that.templates.footer ? getFooterHtml() : null);\n                } else if (hasSuggestions) {\n                    this.$el.html(getSuggestionsHtml()).prepend(that.templates.header ? getHeaderHtml() : null).append(that.templates.footer ? getFooterHtml() : null);\n                }\n                this.trigger(\"rendered\");\n                function getEmptyHtml() {\n                    return that.templates.empty({\n                        query: query,\n                        isEmpty: true\n                    });\n                }\n                function getSuggestionsHtml() {\n                    var $suggestions, nodes;\n                    $suggestions = $(html.suggestions).css(css.suggestions);\n                    nodes = _.map(suggestions, getSuggestionNode);\n                    $suggestions.append.apply($suggestions, nodes);\n                    that.highlight && highlight({\n                        className: \"tt-highlight\",\n                        node: $suggestions[0],\n                        pattern: query\n                    });\n                    return $suggestions;\n                    function getSuggestionNode(suggestion) {\n                        var $el;\n                        $el = $(html.suggestion).append(that.templates.suggestion(suggestion)).data(datasetKey, that.name).data(valueKey, that.displayFn(suggestion)).data(datumKey, suggestion);\n                        $el.children().each(function() {\n                            $(this).css(css.suggestionChild);\n                        });\n                        return $el;\n                    }\n                }\n                function getHeaderHtml() {\n                    return that.templates.header({\n                        query: query,\n                        isEmpty: !hasSuggestions\n                    });\n                }\n                function getFooterHtml() {\n                    return that.templates.footer({\n                        query: query,\n                        isEmpty: !hasSuggestions\n                    });\n                }\n            },\n            getRoot: function getRoot() {\n                return this.$el;\n            },\n            update: function update(query) {\n                var that = this;\n                this.query = query;\n                this.canceled = false;\n                this.source(query, render);\n                function render(suggestions) {\n                    if (!that.canceled && query === that.query) {\n                        that._render(query, suggestions);\n                    }\n                }\n            },\n            cancel: function cancel() {\n                this.canceled = true;\n            },\n            clear: function clear() {\n                this.cancel();\n                this.$el.empty();\n                this.trigger(\"rendered\");\n            },\n            isEmpty: function isEmpty() {\n                return this.$el.is(\":empty\");\n            },\n            destroy: function destroy() {\n                this.$el = null;\n            }\n        });\n        return Dataset;\n        function getDisplayFn(display) {\n            display = display || \"value\";\n            return _.isFunction(display) ? display : displayFn;\n            function displayFn(obj) {\n                return obj[display];\n            }\n        }\n        function getTemplates(templates, displayFn) {\n            return {\n                empty: templates.empty && _.templatify(templates.empty),\n                header: templates.header && _.templatify(templates.header),\n                footer: templates.footer && _.templatify(templates.footer),\n                suggestion: templates.suggestion || suggestionTemplate\n            };\n            function suggestionTemplate(context) {\n                return \"<p>\" + displayFn(context) + \"</p>\";\n            }\n        }\n        function isValidName(str) {\n            return /^[_a-zA-Z0-9-]+$/.test(str);\n        }\n    }();\n    var Dropdown = function() {\n        \"use strict\";\n        function Dropdown(o) {\n            var that = this, onSuggestionClick, onSuggestionMouseEnter, onSuggestionMouseLeave;\n            o = o || {};\n            if (!o.menu) {\n                $.error(\"menu is required\");\n            }\n            this.isOpen = false;\n            this.isEmpty = true;\n            this.datasets = _.map(o.datasets, initializeDataset);\n            onSuggestionClick = _.bind(this._onSuggestionClick, this);\n            onSuggestionMouseEnter = _.bind(this._onSuggestionMouseEnter, this);\n            onSuggestionMouseLeave = _.bind(this._onSuggestionMouseLeave, this);\n            this.$menu = $(o.menu).on(\"click.tt\", \".tt-suggestion\", onSuggestionClick).on(\"mouseenter.tt\", \".tt-suggestion\", onSuggestionMouseEnter).on(\"mouseleave.tt\", \".tt-suggestion\", onSuggestionMouseLeave);\n            _.each(this.datasets, function(dataset) {\n                that.$menu.append(dataset.getRoot());\n                dataset.onSync(\"rendered\", that._onRendered, that);\n            });\n        }\n        _.mixin(Dropdown.prototype, EventEmitter, {\n            _onSuggestionClick: function onSuggestionClick($e) {\n                this.trigger(\"suggestionClicked\", $($e.currentTarget));\n            },\n            _onSuggestionMouseEnter: function onSuggestionMouseEnter($e) {\n                this._removeCursor();\n                this._setCursor($($e.currentTarget), true);\n            },\n            _onSuggestionMouseLeave: function onSuggestionMouseLeave() {\n                this._removeCursor();\n            },\n            _onRendered: function onRendered() {\n                this.isEmpty = _.every(this.datasets, isDatasetEmpty);\n                this.isEmpty ? this._hide() : this.isOpen && this._show();\n                this.trigger(\"datasetRendered\");\n                function isDatasetEmpty(dataset) {\n                    return dataset.isEmpty();\n                }\n            },\n            _hide: function() {\n                this.$menu.hide();\n            },\n            _show: function() {\n                this.$menu.css(\"display\", \"block\");\n            },\n            _getSuggestions: function getSuggestions() {\n                return this.$menu.find(\".tt-suggestion\");\n            },\n            _getCursor: function getCursor() {\n                return this.$menu.find(\".tt-cursor\").first();\n            },\n            _setCursor: function setCursor($el, silent) {\n                $el.first().addClass(\"tt-cursor\");\n                !silent && this.trigger(\"cursorMoved\");\n            },\n            _removeCursor: function removeCursor() {\n                this._getCursor().removeClass(\"tt-cursor\");\n            },\n            _moveCursor: function moveCursor(increment) {\n                var $suggestions, $oldCursor, newCursorIndex, $newCursor;\n                if (!this.isOpen) {\n                    return;\n                }\n                $oldCursor = this._getCursor();\n                $suggestions = this._getSuggestions();\n                this._removeCursor();\n                newCursorIndex = $suggestions.index($oldCursor) + increment;\n                newCursorIndex = (newCursorIndex + 1) % ($suggestions.length + 1) - 1;\n                if (newCursorIndex === -1) {\n                    this.trigger(\"cursorRemoved\");\n                    return;\n                } else if (newCursorIndex < -1) {\n                    newCursorIndex = $suggestions.length - 1;\n                }\n                this._setCursor($newCursor = $suggestions.eq(newCursorIndex));\n                this._ensureVisible($newCursor);\n            },\n            _ensureVisible: function ensureVisible($el) {\n                var elTop, elBottom, menuScrollTop, menuHeight;\n                elTop = $el.position().top;\n                elBottom = elTop + $el.outerHeight(true);\n                menuScrollTop = this.$menu.scrollTop();\n                menuHeight = this.$menu.height() + parseInt(this.$menu.css(\"paddingTop\"), 10) + parseInt(this.$menu.css(\"paddingBottom\"), 10);\n                if (elTop < 0) {\n                    this.$menu.scrollTop(menuScrollTop + elTop);\n                } else if (menuHeight < elBottom) {\n                    this.$menu.scrollTop(menuScrollTop + (elBottom - menuHeight));\n                }\n            },\n            close: function close() {\n                if (this.isOpen) {\n                    this.isOpen = false;\n                    this._removeCursor();\n                    this._hide();\n                    this.trigger(\"closed\");\n                }\n            },\n            open: function open() {\n                if (!this.isOpen) {\n                    this.isOpen = true;\n                    !this.isEmpty && this._show();\n                    this.trigger(\"opened\");\n                }\n            },\n            setLanguageDirection: function setLanguageDirection(dir) {\n                this.$menu.css(dir === \"ltr\" ? css.ltr : css.rtl);\n            },\n            moveCursorUp: function moveCursorUp() {\n                this._moveCursor(-1);\n            },\n            moveCursorDown: function moveCursorDown() {\n                this._moveCursor(+1);\n            },\n            getDatumForSuggestion: function getDatumForSuggestion($el) {\n                var datum = null;\n                if ($el.length) {\n                    datum = {\n                        raw: Dataset.extractDatum($el),\n                        value: Dataset.extractValue($el),\n                        datasetName: Dataset.extractDatasetName($el)\n                    };\n                }\n                return datum;\n            },\n            getDatumForCursor: function getDatumForCursor() {\n                return this.getDatumForSuggestion(this._getCursor().first());\n            },\n            getDatumForTopSuggestion: function getDatumForTopSuggestion() {\n                return this.getDatumForSuggestion(this._getSuggestions().first());\n            },\n            update: function update(query) {\n                _.each(this.datasets, updateDataset);\n                function updateDataset(dataset) {\n                    dataset.update(query);\n                }\n            },\n            empty: function empty() {\n                _.each(this.datasets, clearDataset);\n                this.isEmpty = true;\n                function clearDataset(dataset) {\n                    dataset.clear();\n                }\n            },\n            isVisible: function isVisible() {\n                return this.isOpen && !this.isEmpty;\n            },\n            destroy: function destroy() {\n                this.$menu.off(\".tt\");\n                this.$menu = null;\n                _.each(this.datasets, destroyDataset);\n                function destroyDataset(dataset) {\n                    dataset.destroy();\n                }\n            }\n        });\n        return Dropdown;\n        function initializeDataset(oDataset) {\n            return new Dataset(oDataset);\n        }\n    }();\n    var Typeahead = function() {\n        \"use strict\";\n        var attrsKey = \"ttAttrs\";\n        function Typeahead(o) {\n            var $menu, $input, $hint;\n            o = o || {};\n            if (!o.input) {\n                $.error(\"missing input\");\n            }\n            this.isActivated = false;\n            this.autoselect = !!o.autoselect;\n            this.minLength = _.isNumber(o.minLength) ? o.minLength : 1;\n            this.$node = buildDom(o.input, o.withHint);\n            $menu = this.$node.find(\".tt-dropdown-menu\");\n            $input = this.$node.find(\".tt-input\");\n            $hint = this.$node.find(\".tt-hint\");\n            $input.on(\"blur.tt\", function($e) {\n                var active, isActive, hasActive;\n                active = document.activeElement;\n                isActive = $menu.is(active);\n                hasActive = $menu.has(active).length > 0;\n                if (_.isMsie() && (isActive || hasActive)) {\n                    $e.preventDefault();\n                    $e.stopImmediatePropagation();\n                    _.defer(function() {\n                        $input.focus();\n                    });\n                }\n            });\n            $menu.on(\"mousedown.tt\", function($e) {\n                $e.preventDefault();\n            });\n            this.eventBus = o.eventBus || new EventBus({\n                el: $input\n            });\n            this.dropdown = new Dropdown({\n                menu: $menu,\n                datasets: o.datasets\n            }).onSync(\"suggestionClicked\", this._onSuggestionClicked, this).onSync(\"cursorMoved\", this._onCursorMoved, this).onSync(\"cursorRemoved\", this._onCursorRemoved, this).onSync(\"opened\", this._onOpened, this).onSync(\"closed\", this._onClosed, this).onAsync(\"datasetRendered\", this._onDatasetRendered, this);\n            this.input = new Input({\n                input: $input,\n                hint: $hint\n            }).onSync(\"focused\", this._onFocused, this).onSync(\"blurred\", this._onBlurred, this).onSync(\"enterKeyed\", this._onEnterKeyed, this).onSync(\"tabKeyed\", this._onTabKeyed, this).onSync(\"escKeyed\", this._onEscKeyed, this).onSync(\"upKeyed\", this._onUpKeyed, this).onSync(\"downKeyed\", this._onDownKeyed, this).onSync(\"leftKeyed\", this._onLeftKeyed, this).onSync(\"rightKeyed\", this._onRightKeyed, this).onSync(\"queryChanged\", this._onQueryChanged, this).onSync(\"whitespaceChanged\", this._onWhitespaceChanged, this);\n            this._setLanguageDirection();\n        }\n        _.mixin(Typeahead.prototype, {\n            _onSuggestionClicked: function onSuggestionClicked(type, $el) {\n                var datum;\n                if (datum = this.dropdown.getDatumForSuggestion($el)) {\n                    this._select(datum);\n                }\n            },\n            _onCursorMoved: function onCursorMoved() {\n                var datum = this.dropdown.getDatumForCursor();\n                this.input.setInputValue(datum.value, true);\n                this.eventBus.trigger(\"cursorchanged\", datum.raw, datum.datasetName);\n            },\n            _onCursorRemoved: function onCursorRemoved() {\n                this.input.resetInputValue();\n                this._updateHint();\n            },\n            _onDatasetRendered: function onDatasetRendered() {\n                this._updateHint();\n            },\n            _onOpened: function onOpened() {\n                this._updateHint();\n                this.eventBus.trigger(\"opened\");\n            },\n            _onClosed: function onClosed() {\n                this.input.clearHint();\n                this.eventBus.trigger(\"closed\");\n            },\n            _onFocused: function onFocused() {\n                this.isActivated = true;\n                this.dropdown.open();\n            },\n            _onBlurred: function onBlurred() {\n                this.isActivated = false;\n                this.dropdown.empty();\n                this.dropdown.close();\n            },\n            _onEnterKeyed: function onEnterKeyed(type, $e) {\n                var cursorDatum, topSuggestionDatum;\n                cursorDatum = this.dropdown.getDatumForCursor();\n                topSuggestionDatum = this.dropdown.getDatumForTopSuggestion();\n                if (cursorDatum) {\n                    this._select(cursorDatum);\n                    $e.preventDefault();\n                } else if (this.autoselect && topSuggestionDatum) {\n                    this._select(topSuggestionDatum);\n                    $e.preventDefault();\n                }\n            },\n            _onTabKeyed: function onTabKeyed(type, $e) {\n                var datum;\n                if (datum = this.dropdown.getDatumForCursor()) {\n                    this._select(datum);\n                    $e.preventDefault();\n                } else {\n                    this._autocomplete(true);\n                }\n            },\n            _onEscKeyed: function onEscKeyed() {\n                this.dropdown.close();\n                this.input.resetInputValue();\n            },\n            _onUpKeyed: function onUpKeyed() {\n                var query = this.input.getQuery();\n                this.dropdown.isEmpty && query.length >= this.minLength ? this.dropdown.update(query) : this.dropdown.moveCursorUp();\n                this.dropdown.open();\n            },\n            _onDownKeyed: function onDownKeyed() {\n                var query = this.input.getQuery();\n                this.dropdown.isEmpty && query.length >= this.minLength ? this.dropdown.update(query) : this.dropdown.moveCursorDown();\n                this.dropdown.open();\n            },\n            _onLeftKeyed: function onLeftKeyed() {\n                this.dir === \"rtl\" && this._autocomplete();\n            },\n            _onRightKeyed: function onRightKeyed() {\n                this.dir === \"ltr\" && this._autocomplete();\n            },\n            _onQueryChanged: function onQueryChanged(e, query) {\n                this.input.clearHintIfInvalid();\n                query.length >= this.minLength ? this.dropdown.update(query) : this.dropdown.empty();\n                this.dropdown.open();\n                this._setLanguageDirection();\n            },\n            _onWhitespaceChanged: function onWhitespaceChanged() {\n                this._updateHint();\n                this.dropdown.open();\n            },\n            _setLanguageDirection: function setLanguageDirection() {\n                var dir;\n                if (this.dir !== (dir = this.input.getLanguageDirection())) {\n                    this.dir = dir;\n                    this.$node.css(\"direction\", dir);\n                    this.dropdown.setLanguageDirection(dir);\n                }\n            },\n            _updateHint: function updateHint() {\n                var datum, val, query, escapedQuery, frontMatchRegEx, match;\n                datum = this.dropdown.getDatumForTopSuggestion();\n                if (datum && this.dropdown.isVisible() && !this.input.hasOverflow()) {\n                    val = this.input.getInputValue();\n                    query = Input.normalizeQuery(val);\n                    escapedQuery = _.escapeRegExChars(query);\n                    frontMatchRegEx = new RegExp(\"^(?:\" + escapedQuery + \")(.+$)\", \"i\");\n                    match = frontMatchRegEx.exec(datum.value);\n                    match ? this.input.setHint(val + match[1]) : this.input.clearHint();\n                } else {\n                    this.input.clearHint();\n                }\n            },\n            _autocomplete: function autocomplete(laxCursor) {\n                var hint, query, isCursorAtEnd, datum;\n                hint = this.input.getHint();\n                query = this.input.getQuery();\n                isCursorAtEnd = laxCursor || this.input.isCursorAtEnd();\n                if (hint && query !== hint && isCursorAtEnd) {\n                    datum = this.dropdown.getDatumForTopSuggestion();\n                    datum && this.input.setInputValue(datum.value);\n                    this.eventBus.trigger(\"autocompleted\", datum.raw, datum.datasetName);\n                }\n            },\n            _select: function select(datum) {\n                this.input.setQuery(datum.value);\n                this.input.setInputValue(datum.value, true);\n                this._setLanguageDirection();\n                this.eventBus.trigger(\"selected\", datum.raw, datum.datasetName);\n                this.dropdown.close();\n                _.defer(_.bind(this.dropdown.empty, this.dropdown));\n            },\n            open: function open() {\n                this.dropdown.open();\n            },\n            close: function close() {\n                this.dropdown.close();\n            },\n            setVal: function setVal(val) {\n                val = _.toStr(val);\n                if (this.isActivated) {\n                    this.input.setInputValue(val);\n                } else {\n                    this.input.setQuery(val);\n                    this.input.setInputValue(val, true);\n                }\n                this._setLanguageDirection();\n            },\n            getVal: function getVal() {\n                return this.input.getQuery();\n            },\n            destroy: function destroy() {\n                this.input.destroy();\n                this.dropdown.destroy();\n                destroyDomStructure(this.$node);\n                this.$node = null;\n            }\n        });\n        return Typeahead;\n        function buildDom(input, withHint) {\n            var $input, $wrapper, $dropdown, $hint;\n            $input = $(input);\n            $wrapper = $(html.wrapper).css(css.wrapper);\n            $dropdown = $(html.dropdown).css(css.dropdown);\n            $hint = $input.clone().css(css.hint).css(getBackgroundStyles($input));\n            $hint.val(\"\").removeData().addClass(\"tt-hint\").removeAttr(\"id name placeholder required\").prop(\"readonly\", true).attr({\n                autocomplete: \"off\",\n                spellcheck: \"false\",\n                tabindex: -1\n            });\n            $input.data(attrsKey, {\n                dir: $input.attr(\"dir\"),\n                autocomplete: $input.attr(\"autocomplete\"),\n                spellcheck: $input.attr(\"spellcheck\"),\n                style: $input.attr(\"style\")\n            });\n            $input.addClass(\"tt-input\").attr({\n                autocomplete: \"off\",\n                spellcheck: false\n            }).css(withHint ? css.input : css.inputWithNoHint);\n            try {\n                !$input.attr(\"dir\") && $input.attr(\"dir\", \"auto\");\n            } catch (e) {}\n            return $input.wrap($wrapper).parent().prepend(withHint ? $hint : null).append($dropdown);\n        }\n        function getBackgroundStyles($el) {\n            return {\n                backgroundAttachment: $el.css(\"background-attachment\"),\n                backgroundClip: $el.css(\"background-clip\"),\n                backgroundColor: $el.css(\"background-color\"),\n                backgroundImage: $el.css(\"background-image\"),\n                backgroundOrigin: $el.css(\"background-origin\"),\n                backgroundPosition: $el.css(\"background-position\"),\n                backgroundRepeat: $el.css(\"background-repeat\"),\n                backgroundSize: $el.css(\"background-size\")\n            };\n        }\n        function destroyDomStructure($node) {\n            var $input = $node.find(\".tt-input\");\n            _.each($input.data(attrsKey), function(val, key) {\n                _.isUndefined(val) ? $input.removeAttr(key) : $input.attr(key, val);\n            });\n            $input.detach().removeData(attrsKey).removeClass(\"tt-input\").insertAfter($node);\n            $node.remove();\n        }\n    }();\n    (function() {\n        \"use strict\";\n        var old, typeaheadKey, methods;\n        old = $.fn.typeahead;\n        typeaheadKey = \"ttTypeahead\";\n        methods = {\n            initialize: function initialize(o, datasets) {\n                datasets = _.isArray(datasets) ? datasets : [].slice.call(arguments, 1);\n                o = o || {};\n                return this.each(attach);\n                function attach() {\n                    var $input = $(this), eventBus, typeahead;\n                    _.each(datasets, function(d) {\n                        d.highlight = !!o.highlight;\n                    });\n                    typeahead = new Typeahead({\n                        input: $input,\n                        eventBus: eventBus = new EventBus({\n                            el: $input\n                        }),\n                        withHint: _.isUndefined(o.hint) ? true : !!o.hint,\n                        minLength: o.minLength,\n                        autoselect: o.autoselect,\n                        datasets: datasets\n                    });\n                    $input.data(typeaheadKey, typeahead);\n                }\n            },\n            open: function open() {\n                return this.each(openTypeahead);\n                function openTypeahead() {\n                    var $input = $(this), typeahead;\n                    if (typeahead = $input.data(typeaheadKey)) {\n                        typeahead.open();\n                    }\n                }\n            },\n            close: function close() {\n                return this.each(closeTypeahead);\n                function closeTypeahead() {\n                    var $input = $(this), typeahead;\n                    if (typeahead = $input.data(typeaheadKey)) {\n                        typeahead.close();\n                    }\n                }\n            },\n            val: function val(newVal) {\n                return !arguments.length ? getVal(this.first()) : this.each(setVal);\n                function setVal() {\n                    var $input = $(this), typeahead;\n                    if (typeahead = $input.data(typeaheadKey)) {\n                        typeahead.setVal(newVal);\n                    }\n                }\n                function getVal($input) {\n                    var typeahead, query;\n                    if (typeahead = $input.data(typeaheadKey)) {\n                        query = typeahead.getVal();\n                    }\n                    return query;\n                }\n            },\n            destroy: function destroy() {\n                return this.each(unattach);\n                function unattach() {\n                    var $input = $(this), typeahead;\n                    if (typeahead = $input.data(typeaheadKey)) {\n                        typeahead.destroy();\n                        $input.removeData(typeaheadKey);\n                    }\n                }\n            }\n        };\n        $.fn.typeahead = function(method) {\n            var tts;\n            if (methods[method] && method !== \"initialize\") {\n                tts = this.filter(function() {\n                    return !!$(this).data(typeaheadKey);\n                });\n                return methods[method].apply(tts, [].slice.call(arguments, 1));\n            } else {\n                return methods.initialize.apply(this, arguments);\n            }\n        };\n        $.fn.typeahead.noConflict = function noConflict() {\n            $.fn.typeahead = old;\n            return this;\n        };\n    })();\n})(window.jQuery);\n/*\nCopyright 2012 Igor Vaynberg\n\nVersion: 3.5.1 Timestamp: Tue Jul 22 18:58:56 EDT 2014\n\nThis software is licensed under the Apache License, Version 2.0 (the \"Apache License\") or the GNU\nGeneral Public License version 2 (the \"GPL License\"). You may choose either license to govern your\nuse of this software only upon the condition that you accept all of the terms of either the Apache\nLicense or the GPL License.\n\nYou may obtain a copy of the Apache License and the GPL License at:\n\n    http://www.apache.org/licenses/LICENSE-2.0\n    http://www.gnu.org/licenses/gpl-2.0.html\n\nUnless required by applicable law or agreed to in writing, software distributed under the\nApache License or the GPL License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR\nCONDITIONS OF ANY KIND, either express or implied. See the Apache License and the GPL License for\nthe specific language governing permissions and limitations under the Apache License and the GPL License.\n*/\n(function ($) {\n    if(typeof $.fn.each2 == \"undefined\") {\n        $.extend($.fn, {\n            /*\n            * 4-10 times faster .each replacement\n            * use it carefully, as it overrides jQuery context of element on each iteration\n            */\n            each2 : function (c) {\n                var j = $([0]), i = -1, l = this.length;\n                while (\n                    ++i < l\n                    && (j.context = j[0] = this[i])\n                    && c.call(j[0], i, j) !== false //\"this\"=DOM, i=index, j=jQuery object\n                );\n                return this;\n            }\n        });\n    }\n})(jQuery);\n\n(function ($, undefined) {\n    \"use strict\";\n    /*global document, window, jQuery, console */\n\n    if (window.Select2 !== undefined) {\n        return;\n    }\n\n    var KEY, AbstractSelect2, SingleSelect2, MultiSelect2, nextUid, sizer,\n        lastMousePosition={x:0,y:0}, $document, scrollBarDimensions,\n\n    KEY = {\n        TAB: 9,\n        ENTER: 13,\n        ESC: 27,\n        SPACE: 32,\n        LEFT: 37,\n        UP: 38,\n        RIGHT: 39,\n        DOWN: 40,\n        SHIFT: 16,\n        CTRL: 17,\n        ALT: 18,\n        PAGE_UP: 33,\n        PAGE_DOWN: 34,\n        HOME: 36,\n        END: 35,\n        BACKSPACE: 8,\n        DELETE: 46,\n        isArrow: function (k) {\n            k = k.which ? k.which : k;\n            switch (k) {\n            case KEY.LEFT:\n            case KEY.RIGHT:\n            case KEY.UP:\n            case KEY.DOWN:\n                return true;\n            }\n            return false;\n        },\n        isControl: function (e) {\n            var k = e.which;\n            switch (k) {\n            case KEY.SHIFT:\n            case KEY.CTRL:\n            case KEY.ALT:\n                return true;\n            }\n\n            if (e.metaKey) return true;\n\n            return false;\n        },\n        isFunctionKey: function (k) {\n            k = k.which ? k.which : k;\n            return k >= 112 && k <= 123;\n        }\n    },\n    MEASURE_SCROLLBAR_TEMPLATE = \"<div class='select2-measure-scrollbar'></div>\",\n\n    DIACRITICS = {\"\\u24B6\":\"A\",\"\\uFF21\":\"A\",\"\\u00C0\":\"A\",\"\\u00C1\":\"A\",\"\\u00C2\":\"A\",\"\\u1EA6\":\"A\",\"\\u1EA4\":\"A\",\"\\u1EAA\":\"A\",\"\\u1EA8\":\"A\",\"\\u00C3\":\"A\",\"\\u0100\":\"A\",\"\\u0102\":\"A\",\"\\u1EB0\":\"A\",\"\\u1EAE\":\"A\",\"\\u1EB4\":\"A\",\"\\u1EB2\":\"A\",\"\\u0226\":\"A\",\"\\u01E0\":\"A\",\"\\u00C4\":\"A\",\"\\u01DE\":\"A\",\"\\u1EA2\":\"A\",\"\\u00C5\":\"A\",\"\\u01FA\":\"A\",\"\\u01CD\":\"A\",\"\\u0200\":\"A\",\"\\u0202\":\"A\",\"\\u1EA0\":\"A\",\"\\u1EAC\":\"A\",\"\\u1EB6\":\"A\",\"\\u1E00\":\"A\",\"\\u0104\":\"A\",\"\\u023A\":\"A\",\"\\u2C6F\":\"A\",\"\\uA732\":\"AA\",\"\\u00C6\":\"AE\",\"\\u01FC\":\"AE\",\"\\u01E2\":\"AE\",\"\\uA734\":\"AO\",\"\\uA736\":\"AU\",\"\\uA738\":\"AV\",\"\\uA73A\":\"AV\",\"\\uA73C\":\"AY\",\"\\u24B7\":\"B\",\"\\uFF22\":\"B\",\"\\u1E02\":\"B\",\"\\u1E04\":\"B\",\"\\u1E06\":\"B\",\"\\u0243\":\"B\",\"\\u0182\":\"B\",\"\\u0181\":\"B\",\"\\u24B8\":\"C\",\"\\uFF23\":\"C\",\"\\u0106\":\"C\",\"\\u0108\":\"C\",\"\\u010A\":\"C\",\"\\u010C\":\"C\",\"\\u00C7\":\"C\",\"\\u1E08\":\"C\",\"\\u0187\":\"C\",\"\\u023B\":\"C\",\"\\uA73E\":\"C\",\"\\u24B9\":\"D\",\"\\uFF24\":\"D\",\"\\u1E0A\":\"D\",\"\\u010E\":\"D\",\"\\u1E0C\":\"D\",\"\\u1E10\":\"D\",\"\\u1E12\":\"D\",\"\\u1E0E\":\"D\",\"\\u0110\":\"D\",\"\\u018B\":\"D\",\"\\u018A\":\"D\",\"\\u0189\":\"D\",\"\\uA779\":\"D\",\"\\u01F1\":\"DZ\",\"\\u01C4\":\"DZ\",\"\\u01F2\":\"Dz\",\"\\u01C5\":\"Dz\",\"\\u24BA\":\"E\",\"\\uFF25\":\"E\",\"\\u00C8\":\"E\",\"\\u00C9\":\"E\",\"\\u00CA\":\"E\",\"\\u1EC0\":\"E\",\"\\u1EBE\":\"E\",\"\\u1EC4\":\"E\",\"\\u1EC2\":\"E\",\"\\u1EBC\":\"E\",\"\\u0112\":\"E\",\"\\u1E14\":\"E\",\"\\u1E16\":\"E\",\"\\u0114\":\"E\",\"\\u0116\":\"E\",\"\\u00CB\":\"E\",\"\\u1EBA\":\"E\",\"\\u011A\":\"E\",\"\\u0204\":\"E\",\"\\u0206\":\"E\",\"\\u1EB8\":\"E\",\"\\u1EC6\":\"E\",\"\\u0228\":\"E\",\"\\u1E1C\":\"E\",\"\\u0118\":\"E\",\"\\u1E18\":\"E\",\"\\u1E1A\":\"E\",\"\\u0190\":\"E\",\"\\u018E\":\"E\",\"\\u24BB\":\"F\",\"\\uFF26\":\"F\",\"\\u1E1E\":\"F\",\"\\u0191\":\"F\",\"\\uA77B\":\"F\",\"\\u24BC\":\"G\",\"\\uFF27\":\"G\",\"\\u01F4\":\"G\",\"\\u011C\":\"G\",\"\\u1E20\":\"G\",\"\\u011E\":\"G\",\"\\u0120\":\"G\",\"\\u01E6\":\"G\",\"\\u0122\":\"G\",\"\\u01E4\":\"G\",\"\\u0193\":\"G\",\"\\uA7A0\":\"G\",\"\\uA77D\":\"G\",\"\\uA77E\":\"G\",\"\\u24BD\":\"H\",\"\\uFF28\":\"H\",\"\\u0124\":\"H\",\"\\u1E22\":\"H\",\"\\u1E26\":\"H\",\"\\u021E\":\"H\",\"\\u1E24\":\"H\",\"\\u1E28\":\"H\",\"\\u1E2A\":\"H\",\"\\u0126\":\"H\",\"\\u2C67\":\"H\",\"\\u2C75\":\"H\",\"\\uA78D\":\"H\",\"\\u24BE\":\"I\",\"\\uFF29\":\"I\",\"\\u00CC\":\"I\",\"\\u00CD\":\"I\",\"\\u00CE\":\"I\",\"\\u0128\":\"I\",\"\\u012A\":\"I\",\"\\u012C\":\"I\",\"\\u0130\":\"I\",\"\\u00CF\":\"I\",\"\\u1E2E\":\"I\",\"\\u1EC8\":\"I\",\"\\u01CF\":\"I\",\"\\u0208\":\"I\",\"\\u020A\":\"I\",\"\\u1ECA\":\"I\",\"\\u012E\":\"I\",\"\\u1E2C\":\"I\",\"\\u0197\":\"I\",\"\\u24BF\":\"J\",\"\\uFF2A\":\"J\",\"\\u0134\":\"J\",\"\\u0248\":\"J\",\"\\u24C0\":\"K\",\"\\uFF2B\":\"K\",\"\\u1E30\":\"K\",\"\\u01E8\":\"K\",\"\\u1E32\":\"K\",\"\\u0136\":\"K\",\"\\u1E34\":\"K\",\"\\u0198\":\"K\",\"\\u2C69\":\"K\",\"\\uA740\":\"K\",\"\\uA742\":\"K\",\"\\uA744\":\"K\",\"\\uA7A2\":\"K\",\"\\u24C1\":\"L\",\"\\uFF2C\":\"L\",\"\\u013F\":\"L\",\"\\u0139\":\"L\",\"\\u013D\":\"L\",\"\\u1E36\":\"L\",\"\\u1E38\":\"L\",\"\\u013B\":\"L\",\"\\u1E3C\":\"L\",\"\\u1E3A\":\"L\",\"\\u0141\":\"L\",\"\\u023D\":\"L\",\"\\u2C62\":\"L\",\"\\u2C60\":\"L\",\"\\uA748\":\"L\",\"\\uA746\":\"L\",\"\\uA780\":\"L\",\"\\u01C7\":\"LJ\",\"\\u01C8\":\"Lj\",\"\\u24C2\":\"M\",\"\\uFF2D\":\"M\",\"\\u1E3E\":\"M\",\"\\u1E40\":\"M\",\"\\u1E42\":\"M\",\"\\u2C6E\":\"M\",\"\\u019C\":\"M\",\"\\u24C3\":\"N\",\"\\uFF2E\":\"N\",\"\\u01F8\":\"N\",\"\\u0143\":\"N\",\"\\u00D1\":\"N\",\"\\u1E44\":\"N\",\"\\u0147\":\"N\",\"\\u1E46\":\"N\",\"\\u0145\":\"N\",\"\\u1E4A\":\"N\",\"\\u1E48\":\"N\",\"\\u0220\":\"N\",\"\\u019D\":\"N\",\"\\uA790\":\"N\",\"\\uA7A4\":\"N\",\"\\u01CA\":\"NJ\",\"\\u01CB\":\"Nj\",\"\\u24C4\":\"O\",\"\\uFF2F\":\"O\",\"\\u00D2\":\"O\",\"\\u00D3\":\"O\",\"\\u00D4\":\"O\",\"\\u1ED2\":\"O\",\"\\u1ED0\":\"O\",\"\\u1ED6\":\"O\",\"\\u1ED4\":\"O\",\"\\u00D5\":\"O\",\"\\u1E4C\":\"O\",\"\\u022C\":\"O\",\"\\u1E4E\":\"O\",\"\\u014C\":\"O\",\"\\u1E50\":\"O\",\"\\u1E52\":\"O\",\"\\u014E\":\"O\",\"\\u022E\":\"O\",\"\\u0230\":\"O\",\"\\u00D6\":\"O\",\"\\u022A\":\"O\",\"\\u1ECE\":\"O\",\"\\u0150\":\"O\",\"\\u01D1\":\"O\",\"\\u020C\":\"O\",\"\\u020E\":\"O\",\"\\u01A0\":\"O\",\"\\u1EDC\":\"O\",\"\\u1EDA\":\"O\",\"\\u1EE0\":\"O\",\"\\u1EDE\":\"O\",\"\\u1EE2\":\"O\",\"\\u1ECC\":\"O\",\"\\u1ED8\":\"O\",\"\\u01EA\":\"O\",\"\\u01EC\":\"O\",\"\\u00D8\":\"O\",\"\\u01FE\":\"O\",\"\\u0186\":\"O\",\"\\u019F\":\"O\",\"\\uA74A\":\"O\",\"\\uA74C\":\"O\",\"\\u01A2\":\"OI\",\"\\uA74E\":\"OO\",\"\\u0222\":\"OU\",\"\\u24C5\":\"P\",\"\\uFF30\":\"P\",\"\\u1E54\":\"P\",\"\\u1E56\":\"P\",\"\\u01A4\":\"P\",\"\\u2C63\":\"P\",\"\\uA750\":\"P\",\"\\uA752\":\"P\",\"\\uA754\":\"P\",\"\\u24C6\":\"Q\",\"\\uFF31\":\"Q\",\"\\uA756\":\"Q\",\"\\uA758\":\"Q\",\"\\u024A\":\"Q\",\"\\u24C7\":\"R\",\"\\uFF32\":\"R\",\"\\u0154\":\"R\",\"\\u1E58\":\"R\",\"\\u0158\":\"R\",\"\\u0210\":\"R\",\"\\u0212\":\"R\",\"\\u1E5A\":\"R\",\"\\u1E5C\":\"R\",\"\\u0156\":\"R\",\"\\u1E5E\":\"R\",\"\\u024C\":\"R\",\"\\u2C64\":\"R\",\"\\uA75A\":\"R\",\"\\uA7A6\":\"R\",\"\\uA782\":\"R\",\"\\u24C8\":\"S\",\"\\uFF33\":\"S\",\"\\u1E9E\":\"S\",\"\\u015A\":\"S\",\"\\u1E64\":\"S\",\"\\u015C\":\"S\",\"\\u1E60\":\"S\",\"\\u0160\":\"S\",\"\\u1E66\":\"S\",\"\\u1E62\":\"S\",\"\\u1E68\":\"S\",\"\\u0218\":\"S\",\"\\u015E\":\"S\",\"\\u2C7E\":\"S\",\"\\uA7A8\":\"S\",\"\\uA784\":\"S\",\"\\u24C9\":\"T\",\"\\uFF34\":\"T\",\"\\u1E6A\":\"T\",\"\\u0164\":\"T\",\"\\u1E6C\":\"T\",\"\\u021A\":\"T\",\"\\u0162\":\"T\",\"\\u1E70\":\"T\",\"\\u1E6E\":\"T\",\"\\u0166\":\"T\",\"\\u01AC\":\"T\",\"\\u01AE\":\"T\",\"\\u023E\":\"T\",\"\\uA786\":\"T\",\"\\uA728\":\"TZ\",\"\\u24CA\":\"U\",\"\\uFF35\":\"U\",\"\\u00D9\":\"U\",\"\\u00DA\":\"U\",\"\\u00DB\":\"U\",\"\\u0168\":\"U\",\"\\u1E78\":\"U\",\"\\u016A\":\"U\",\"\\u1E7A\":\"U\",\"\\u016C\":\"U\",\"\\u00DC\":\"U\",\"\\u01DB\":\"U\",\"\\u01D7\":\"U\",\"\\u01D5\":\"U\",\"\\u01D9\":\"U\",\"\\u1EE6\":\"U\",\"\\u016E\":\"U\",\"\\u0170\":\"U\",\"\\u01D3\":\"U\",\"\\u0214\":\"U\",\"\\u0216\":\"U\",\"\\u01AF\":\"U\",\"\\u1EEA\":\"U\",\"\\u1EE8\":\"U\",\"\\u1EEE\":\"U\",\"\\u1EEC\":\"U\",\"\\u1EF0\":\"U\",\"\\u1EE4\":\"U\",\"\\u1E72\":\"U\",\"\\u0172\":\"U\",\"\\u1E76\":\"U\",\"\\u1E74\":\"U\",\"\\u0244\":\"U\",\"\\u24CB\":\"V\",\"\\uFF36\":\"V\",\"\\u1E7C\":\"V\",\"\\u1E7E\":\"V\",\"\\u01B2\":\"V\",\"\\uA75E\":\"V\",\"\\u0245\":\"V\",\"\\uA760\":\"VY\",\"\\u24CC\":\"W\",\"\\uFF37\":\"W\",\"\\u1E80\":\"W\",\"\\u1E82\":\"W\",\"\\u0174\":\"W\",\"\\u1E86\":\"W\",\"\\u1E84\":\"W\",\"\\u1E88\":\"W\",\"\\u2C72\":\"W\",\"\\u24CD\":\"X\",\"\\uFF38\":\"X\",\"\\u1E8A\":\"X\",\"\\u1E8C\":\"X\",\"\\u24CE\":\"Y\",\"\\uFF39\":\"Y\",\"\\u1EF2\":\"Y\",\"\\u00DD\":\"Y\",\"\\u0176\":\"Y\",\"\\u1EF8\":\"Y\",\"\\u0232\":\"Y\",\"\\u1E8E\":\"Y\",\"\\u0178\":\"Y\",\"\\u1EF6\":\"Y\",\"\\u1EF4\":\"Y\",\"\\u01B3\":\"Y\",\"\\u024E\":\"Y\",\"\\u1EFE\":\"Y\",\"\\u24CF\":\"Z\",\"\\uFF3A\":\"Z\",\"\\u0179\":\"Z\",\"\\u1E90\":\"Z\",\"\\u017B\":\"Z\",\"\\u017D\":\"Z\",\"\\u1E92\":\"Z\",\"\\u1E94\":\"Z\",\"\\u01B5\":\"Z\",\"\\u0224\":\"Z\",\"\\u2C7F\":\"Z\",\"\\u2C6B\":\"Z\",\"\\uA762\":\"Z\",\"\\u24D0\":\"a\",\"\\uFF41\":\"a\",\"\\u1E9A\":\"a\",\"\\u00E0\":\"a\",\"\\u00E1\":\"a\",\"\\u00E2\":\"a\",\"\\u1EA7\":\"a\",\"\\u1EA5\":\"a\",\"\\u1EAB\":\"a\",\"\\u1EA9\":\"a\",\"\\u00E3\":\"a\",\"\\u0101\":\"a\",\"\\u0103\":\"a\",\"\\u1EB1\":\"a\",\"\\u1EAF\":\"a\",\"\\u1EB5\":\"a\",\"\\u1EB3\":\"a\",\"\\u0227\":\"a\",\"\\u01E1\":\"a\",\"\\u00E4\":\"a\",\"\\u01DF\":\"a\",\"\\u1EA3\":\"a\",\"\\u00E5\":\"a\",\"\\u01FB\":\"a\",\"\\u01CE\":\"a\",\"\\u0201\":\"a\",\"\\u0203\":\"a\",\"\\u1EA1\":\"a\",\"\\u1EAD\":\"a\",\"\\u1EB7\":\"a\",\"\\u1E01\":\"a\",\"\\u0105\":\"a\",\"\\u2C65\":\"a\",\"\\u0250\":\"a\",\"\\uA733\":\"aa\",\"\\u00E6\":\"ae\",\"\\u01FD\":\"ae\",\"\\u01E3\":\"ae\",\"\\uA735\":\"ao\",\"\\uA737\":\"au\",\"\\uA739\":\"av\",\"\\uA73B\":\"av\",\"\\uA73D\":\"ay\",\"\\u24D1\":\"b\",\"\\uFF42\":\"b\",\"\\u1E03\":\"b\",\"\\u1E05\":\"b\",\"\\u1E07\":\"b\",\"\\u0180\":\"b\",\"\\u0183\":\"b\",\"\\u0253\":\"b\",\"\\u24D2\":\"c\",\"\\uFF43\":\"c\",\"\\u0107\":\"c\",\"\\u0109\":\"c\",\"\\u010B\":\"c\",\"\\u010D\":\"c\",\"\\u00E7\":\"c\",\"\\u1E09\":\"c\",\"\\u0188\":\"c\",\"\\u023C\":\"c\",\"\\uA73F\":\"c\",\"\\u2184\":\"c\",\"\\u24D3\":\"d\",\"\\uFF44\":\"d\",\"\\u1E0B\":\"d\",\"\\u010F\":\"d\",\"\\u1E0D\":\"d\",\"\\u1E11\":\"d\",\"\\u1E13\":\"d\",\"\\u1E0F\":\"d\",\"\\u0111\":\"d\",\"\\u018C\":\"d\",\"\\u0256\":\"d\",\"\\u0257\":\"d\",\"\\uA77A\":\"d\",\"\\u01F3\":\"dz\",\"\\u01C6\":\"dz\",\"\\u24D4\":\"e\",\"\\uFF45\":\"e\",\"\\u00E8\":\"e\",\"\\u00E9\":\"e\",\"\\u00EA\":\"e\",\"\\u1EC1\":\"e\",\"\\u1EBF\":\"e\",\"\\u1EC5\":\"e\",\"\\u1EC3\":\"e\",\"\\u1EBD\":\"e\",\"\\u0113\":\"e\",\"\\u1E15\":\"e\",\"\\u1E17\":\"e\",\"\\u0115\":\"e\",\"\\u0117\":\"e\",\"\\u00EB\":\"e\",\"\\u1EBB\":\"e\",\"\\u011B\":\"e\",\"\\u0205\":\"e\",\"\\u0207\":\"e\",\"\\u1EB9\":\"e\",\"\\u1EC7\":\"e\",\"\\u0229\":\"e\",\"\\u1E1D\":\"e\",\"\\u0119\":\"e\",\"\\u1E19\":\"e\",\"\\u1E1B\":\"e\",\"\\u0247\":\"e\",\"\\u025B\":\"e\",\"\\u01DD\":\"e\",\"\\u24D5\":\"f\",\"\\uFF46\":\"f\",\"\\u1E1F\":\"f\",\"\\u0192\":\"f\",\"\\uA77C\":\"f\",\"\\u24D6\":\"g\",\"\\uFF47\":\"g\",\"\\u01F5\":\"g\",\"\\u011D\":\"g\",\"\\u1E21\":\"g\",\"\\u011F\":\"g\",\"\\u0121\":\"g\",\"\\u01E7\":\"g\",\"\\u0123\":\"g\",\"\\u01E5\":\"g\",\"\\u0260\":\"g\",\"\\uA7A1\":\"g\",\"\\u1D79\":\"g\",\"\\uA77F\":\"g\",\"\\u24D7\":\"h\",\"\\uFF48\":\"h\",\"\\u0125\":\"h\",\"\\u1E23\":\"h\",\"\\u1E27\":\"h\",\"\\u021F\":\"h\",\"\\u1E25\":\"h\",\"\\u1E29\":\"h\",\"\\u1E2B\":\"h\",\"\\u1E96\":\"h\",\"\\u0127\":\"h\",\"\\u2C68\":\"h\",\"\\u2C76\":\"h\",\"\\u0265\":\"h\",\"\\u0195\":\"hv\",\"\\u24D8\":\"i\",\"\\uFF49\":\"i\",\"\\u00EC\":\"i\",\"\\u00ED\":\"i\",\"\\u00EE\":\"i\",\"\\u0129\":\"i\",\"\\u012B\":\"i\",\"\\u012D\":\"i\",\"\\u00EF\":\"i\",\"\\u1E2F\":\"i\",\"\\u1EC9\":\"i\",\"\\u01D0\":\"i\",\"\\u0209\":\"i\",\"\\u020B\":\"i\",\"\\u1ECB\":\"i\",\"\\u012F\":\"i\",\"\\u1E2D\":\"i\",\"\\u0268\":\"i\",\"\\u0131\":\"i\",\"\\u24D9\":\"j\",\"\\uFF4A\":\"j\",\"\\u0135\":\"j\",\"\\u01F0\":\"j\",\"\\u0249\":\"j\",\"\\u24DA\":\"k\",\"\\uFF4B\":\"k\",\"\\u1E31\":\"k\",\"\\u01E9\":\"k\",\"\\u1E33\":\"k\",\"\\u0137\":\"k\",\"\\u1E35\":\"k\",\"\\u0199\":\"k\",\"\\u2C6A\":\"k\",\"\\uA741\":\"k\",\"\\uA743\":\"k\",\"\\uA745\":\"k\",\"\\uA7A3\":\"k\",\"\\u24DB\":\"l\",\"\\uFF4C\":\"l\",\"\\u0140\":\"l\",\"\\u013A\":\"l\",\"\\u013E\":\"l\",\"\\u1E37\":\"l\",\"\\u1E39\":\"l\",\"\\u013C\":\"l\",\"\\u1E3D\":\"l\",\"\\u1E3B\":\"l\",\"\\u017F\":\"l\",\"\\u0142\":\"l\",\"\\u019A\":\"l\",\"\\u026B\":\"l\",\"\\u2C61\":\"l\",\"\\uA749\":\"l\",\"\\uA781\":\"l\",\"\\uA747\":\"l\",\"\\u01C9\":\"lj\",\"\\u24DC\":\"m\",\"\\uFF4D\":\"m\",\"\\u1E3F\":\"m\",\"\\u1E41\":\"m\",\"\\u1E43\":\"m\",\"\\u0271\":\"m\",\"\\u026F\":\"m\",\"\\u24DD\":\"n\",\"\\uFF4E\":\"n\",\"\\u01F9\":\"n\",\"\\u0144\":\"n\",\"\\u00F1\":\"n\",\"\\u1E45\":\"n\",\"\\u0148\":\"n\",\"\\u1E47\":\"n\",\"\\u0146\":\"n\",\"\\u1E4B\":\"n\",\"\\u1E49\":\"n\",\"\\u019E\":\"n\",\"\\u0272\":\"n\",\"\\u0149\":\"n\",\"\\uA791\":\"n\",\"\\uA7A5\":\"n\",\"\\u01CC\":\"nj\",\"\\u24DE\":\"o\",\"\\uFF4F\":\"o\",\"\\u00F2\":\"o\",\"\\u00F3\":\"o\",\"\\u00F4\":\"o\",\"\\u1ED3\":\"o\",\"\\u1ED1\":\"o\",\"\\u1ED7\":\"o\",\"\\u1ED5\":\"o\",\"\\u00F5\":\"o\",\"\\u1E4D\":\"o\",\"\\u022D\":\"o\",\"\\u1E4F\":\"o\",\"\\u014D\":\"o\",\"\\u1E51\":\"o\",\"\\u1E53\":\"o\",\"\\u014F\":\"o\",\"\\u022F\":\"o\",\"\\u0231\":\"o\",\"\\u00F6\":\"o\",\"\\u022B\":\"o\",\"\\u1ECF\":\"o\",\"\\u0151\":\"o\",\"\\u01D2\":\"o\",\"\\u020D\":\"o\",\"\\u020F\":\"o\",\"\\u01A1\":\"o\",\"\\u1EDD\":\"o\",\"\\u1EDB\":\"o\",\"\\u1EE1\":\"o\",\"\\u1EDF\":\"o\",\"\\u1EE3\":\"o\",\"\\u1ECD\":\"o\",\"\\u1ED9\":\"o\",\"\\u01EB\":\"o\",\"\\u01ED\":\"o\",\"\\u00F8\":\"o\",\"\\u01FF\":\"o\",\"\\u0254\":\"o\",\"\\uA74B\":\"o\",\"\\uA74D\":\"o\",\"\\u0275\":\"o\",\"\\u01A3\":\"oi\",\"\\u0223\":\"ou\",\"\\uA74F\":\"oo\",\"\\u24DF\":\"p\",\"\\uFF50\":\"p\",\"\\u1E55\":\"p\",\"\\u1E57\":\"p\",\"\\u01A5\":\"p\",\"\\u1D7D\":\"p\",\"\\uA751\":\"p\",\"\\uA753\":\"p\",\"\\uA755\":\"p\",\"\\u24E0\":\"q\",\"\\uFF51\":\"q\",\"\\u024B\":\"q\",\"\\uA757\":\"q\",\"\\uA759\":\"q\",\"\\u24E1\":\"r\",\"\\uFF52\":\"r\",\"\\u0155\":\"r\",\"\\u1E59\":\"r\",\"\\u0159\":\"r\",\"\\u0211\":\"r\",\"\\u0213\":\"r\",\"\\u1E5B\":\"r\",\"\\u1E5D\":\"r\",\"\\u0157\":\"r\",\"\\u1E5F\":\"r\",\"\\u024D\":\"r\",\"\\u027D\":\"r\",\"\\uA75B\":\"r\",\"\\uA7A7\":\"r\",\"\\uA783\":\"r\",\"\\u24E2\":\"s\",\"\\uFF53\":\"s\",\"\\u00DF\":\"s\",\"\\u015B\":\"s\",\"\\u1E65\":\"s\",\"\\u015D\":\"s\",\"\\u1E61\":\"s\",\"\\u0161\":\"s\",\"\\u1E67\":\"s\",\"\\u1E63\":\"s\",\"\\u1E69\":\"s\",\"\\u0219\":\"s\",\"\\u015F\":\"s\",\"\\u023F\":\"s\",\"\\uA7A9\":\"s\",\"\\uA785\":\"s\",\"\\u1E9B\":\"s\",\"\\u24E3\":\"t\",\"\\uFF54\":\"t\",\"\\u1E6B\":\"t\",\"\\u1E97\":\"t\",\"\\u0165\":\"t\",\"\\u1E6D\":\"t\",\"\\u021B\":\"t\",\"\\u0163\":\"t\",\"\\u1E71\":\"t\",\"\\u1E6F\":\"t\",\"\\u0167\":\"t\",\"\\u01AD\":\"t\",\"\\u0288\":\"t\",\"\\u2C66\":\"t\",\"\\uA787\":\"t\",\"\\uA729\":\"tz\",\"\\u24E4\":\"u\",\"\\uFF55\":\"u\",\"\\u00F9\":\"u\",\"\\u00FA\":\"u\",\"\\u00FB\":\"u\",\"\\u0169\":\"u\",\"\\u1E79\":\"u\",\"\\u016B\":\"u\",\"\\u1E7B\":\"u\",\"\\u016D\":\"u\",\"\\u00FC\":\"u\",\"\\u01DC\":\"u\",\"\\u01D8\":\"u\",\"\\u01D6\":\"u\",\"\\u01DA\":\"u\",\"\\u1EE7\":\"u\",\"\\u016F\":\"u\",\"\\u0171\":\"u\",\"\\u01D4\":\"u\",\"\\u0215\":\"u\",\"\\u0217\":\"u\",\"\\u01B0\":\"u\",\"\\u1EEB\":\"u\",\"\\u1EE9\":\"u\",\"\\u1EEF\":\"u\",\"\\u1EED\":\"u\",\"\\u1EF1\":\"u\",\"\\u1EE5\":\"u\",\"\\u1E73\":\"u\",\"\\u0173\":\"u\",\"\\u1E77\":\"u\",\"\\u1E75\":\"u\",\"\\u0289\":\"u\",\"\\u24E5\":\"v\",\"\\uFF56\":\"v\",\"\\u1E7D\":\"v\",\"\\u1E7F\":\"v\",\"\\u028B\":\"v\",\"\\uA75F\":\"v\",\"\\u028C\":\"v\",\"\\uA761\":\"vy\",\"\\u24E6\":\"w\",\"\\uFF57\":\"w\",\"\\u1E81\":\"w\",\"\\u1E83\":\"w\",\"\\u0175\":\"w\",\"\\u1E87\":\"w\",\"\\u1E85\":\"w\",\"\\u1E98\":\"w\",\"\\u1E89\":\"w\",\"\\u2C73\":\"w\",\"\\u24E7\":\"x\",\"\\uFF58\":\"x\",\"\\u1E8B\":\"x\",\"\\u1E8D\":\"x\",\"\\u24E8\":\"y\",\"\\uFF59\":\"y\",\"\\u1EF3\":\"y\",\"\\u00FD\":\"y\",\"\\u0177\":\"y\",\"\\u1EF9\":\"y\",\"\\u0233\":\"y\",\"\\u1E8F\":\"y\",\"\\u00FF\":\"y\",\"\\u1EF7\":\"y\",\"\\u1E99\":\"y\",\"\\u1EF5\":\"y\",\"\\u01B4\":\"y\",\"\\u024F\":\"y\",\"\\u1EFF\":\"y\",\"\\u24E9\":\"z\",\"\\uFF5A\":\"z\",\"\\u017A\":\"z\",\"\\u1E91\":\"z\",\"\\u017C\":\"z\",\"\\u017E\":\"z\",\"\\u1E93\":\"z\",\"\\u1E95\":\"z\",\"\\u01B6\":\"z\",\"\\u0225\":\"z\",\"\\u0240\":\"z\",\"\\u2C6C\":\"z\",\"\\uA763\":\"z\",\"\\u0386\":\"\\u0391\",\"\\u0388\":\"\\u0395\",\"\\u0389\":\"\\u0397\",\"\\u038A\":\"\\u0399\",\"\\u03AA\":\"\\u0399\",\"\\u038C\":\"\\u039F\",\"\\u038E\":\"\\u03A5\",\"\\u03AB\":\"\\u03A5\",\"\\u038F\":\"\\u03A9\",\"\\u03AC\":\"\\u03B1\",\"\\u03AD\":\"\\u03B5\",\"\\u03AE\":\"\\u03B7\",\"\\u03AF\":\"\\u03B9\",\"\\u03CA\":\"\\u03B9\",\"\\u0390\":\"\\u03B9\",\"\\u03CC\":\"\\u03BF\",\"\\u03CD\":\"\\u03C5\",\"\\u03CB\":\"\\u03C5\",\"\\u03B0\":\"\\u03C5\",\"\\u03C9\":\"\\u03C9\",\"\\u03C2\":\"\\u03C3\"};\n\n    $document = $(document);\n\n    nextUid=(function() { var counter=1; return function() { return counter++; }; }());\n\n\n    function reinsertElement(element) {\n        var placeholder = $(document.createTextNode(''));\n\n        element.before(placeholder);\n        placeholder.before(element);\n        placeholder.remove();\n    }\n\n    function stripDiacritics(str) {\n        // Used 'uni range + named function' from http://jsperf.com/diacritics/18\n        function match(a) {\n            return DIACRITICS[a] || a;\n        }\n\n        return str.replace(/[^\\u0000-\\u007E]/g, match);\n    }\n\n    function indexOf(value, array) {\n        var i = 0, l = array.length;\n        for (; i < l; i = i + 1) {\n            if (equal(value, array[i])) return i;\n        }\n        return -1;\n    }\n\n    function measureScrollbar () {\n        var $template = $( MEASURE_SCROLLBAR_TEMPLATE );\n        $template.appendTo('body');\n\n        var dim = {\n            width: $template.width() - $template[0].clientWidth,\n            height: $template.height() - $template[0].clientHeight\n        };\n        $template.remove();\n\n        return dim;\n    }\n\n    /**\n     * Compares equality of a and b\n     * @param a\n     * @param b\n     */\n    function equal(a, b) {\n        if (a === b) return true;\n        if (a === undefined || b === undefined) return false;\n        if (a === null || b === null) return false;\n        // Check whether 'a' or 'b' is a string (primitive or object).\n        // The concatenation of an empty string (+'') converts its argument to a string's primitive.\n        if (a.constructor === String) return a+'' === b+''; // a+'' - in case 'a' is a String object\n        if (b.constructor === String) return b+'' === a+''; // b+'' - in case 'b' is a String object\n        return false;\n    }\n\n    /**\n     * Splits the string into an array of values, trimming each value. An empty array is returned for nulls or empty\n     * strings\n     * @param string\n     * @param separator\n     */\n    function splitVal(string, separator) {\n        var val, i, l;\n        if (string === null || string.length < 1) return [];\n        val = string.split(separator);\n        for (i = 0, l = val.length; i < l; i = i + 1) val[i] = $.trim(val[i]);\n        return val;\n    }\n\n    function getSideBorderPadding(element) {\n        return element.outerWidth(false) - element.width();\n    }\n\n    function installKeyUpChangeEvent(element) {\n        var key=\"keyup-change-value\";\n        element.on(\"keydown\", function () {\n            if ($.data(element, key) === undefined) {\n                $.data(element, key, element.val());\n            }\n        });\n        element.on(\"keyup\", function () {\n            var val= $.data(element, key);\n            if (val !== undefined && element.val() !== val) {\n                $.removeData(element, key);\n                element.trigger(\"keyup-change\");\n            }\n        });\n    }\n\n\n    /**\n     * filters mouse events so an event is fired only if the mouse moved.\n     *\n     * filters out mouse events that occur when mouse is stationary but\n     * the elements under the pointer are scrolled.\n     */\n    function installFilteredMouseMove(element) {\n        element.on(\"mousemove\", function (e) {\n            var lastpos = lastMousePosition;\n            if (lastpos === undefined || lastpos.x !== e.pageX || lastpos.y !== e.pageY) {\n                $(e.target).trigger(\"mousemove-filtered\", e);\n            }\n        });\n    }\n\n    /**\n     * Debounces a function. Returns a function that calls the original fn function only if no invocations have been made\n     * within the last quietMillis milliseconds.\n     *\n     * @param quietMillis number of milliseconds to wait before invoking fn\n     * @param fn function to be debounced\n     * @param ctx object to be used as this reference within fn\n     * @return debounced version of fn\n     */\n    function debounce(quietMillis, fn, ctx) {\n        ctx = ctx || undefined;\n        var timeout;\n        return function () {\n            var args = arguments;\n            window.clearTimeout(timeout);\n            timeout = window.setTimeout(function() {\n                fn.apply(ctx, args);\n            }, quietMillis);\n        };\n    }\n\n    function installDebouncedScroll(threshold, element) {\n        var notify = debounce(threshold, function (e) { element.trigger(\"scroll-debounced\", e);});\n        element.on(\"scroll\", function (e) {\n            if (indexOf(e.target, element.get()) >= 0) notify(e);\n        });\n    }\n\n    function focus($el) {\n        if ($el[0] === document.activeElement) return;\n\n        /* set the focus in a 0 timeout - that way the focus is set after the processing\n            of the current event has finished - which seems like the only reliable way\n            to set focus */\n        window.setTimeout(function() {\n            var el=$el[0], pos=$el.val().length, range;\n\n            $el.focus();\n\n            /* make sure el received focus so we do not error out when trying to manipulate the caret.\n                sometimes modals or others listeners may steal it after its set */\n            var isVisible = (el.offsetWidth > 0 || el.offsetHeight > 0);\n            if (isVisible && el === document.activeElement) {\n\n                /* after the focus is set move the caret to the end, necessary when we val()\n                    just before setting focus */\n                if(el.setSelectionRange)\n                {\n                    el.setSelectionRange(pos, pos);\n                }\n                else if (el.createTextRange) {\n                    range = el.createTextRange();\n                    range.collapse(false);\n                    range.select();\n                }\n            }\n        }, 0);\n    }\n\n    function getCursorInfo(el) {\n        el = $(el)[0];\n        var offset = 0;\n        var length = 0;\n        if ('selectionStart' in el) {\n            offset = el.selectionStart;\n            length = el.selectionEnd - offset;\n        } else if ('selection' in document) {\n            el.focus();\n            var sel = document.selection.createRange();\n            length = document.selection.createRange().text.length;\n            sel.moveStart('character', -el.value.length);\n            offset = sel.text.length - length;\n        }\n        return { offset: offset, length: length };\n    }\n\n    function killEvent(event) {\n        event.preventDefault();\n        event.stopPropagation();\n    }\n    function killEventImmediately(event) {\n        event.preventDefault();\n        event.stopImmediatePropagation();\n    }\n\n    function measureTextWidth(e) {\n        if (!sizer){\n            var style = e[0].currentStyle || window.getComputedStyle(e[0], null);\n            sizer = $(document.createElement(\"div\")).css({\n                position: \"absolute\",\n                left: \"-10000px\",\n                top: \"-10000px\",\n                display: \"none\",\n                fontSize: style.fontSize,\n                fontFamily: style.fontFamily,\n                fontStyle: style.fontStyle,\n                fontWeight: style.fontWeight,\n                letterSpacing: style.letterSpacing,\n                textTransform: style.textTransform,\n                whiteSpace: \"nowrap\"\n            });\n            sizer.attr(\"class\",\"select2-sizer\");\n            $(\"body\").append(sizer);\n        }\n        sizer.text(e.val());\n        return sizer.width();\n    }\n\n    function syncCssClasses(dest, src, adapter) {\n        var classes, replacements = [], adapted;\n\n        classes = $.trim(dest.attr(\"class\"));\n\n        if (classes) {\n            classes = '' + classes; // for IE which returns object\n\n            $(classes.split(/\\s+/)).each2(function() {\n                if (this.indexOf(\"select2-\") === 0) {\n                    replacements.push(this);\n                }\n            });\n        }\n\n        classes = $.trim(src.attr(\"class\"));\n\n        if (classes) {\n            classes = '' + classes; // for IE which returns object\n\n            $(classes.split(/\\s+/)).each2(function() {\n                if (this.indexOf(\"select2-\") !== 0) {\n                    adapted = adapter(this);\n\n                    if (adapted) {\n                        replacements.push(adapted);\n                    }\n                }\n            });\n        }\n\n        dest.attr(\"class\", replacements.join(\" \"));\n    }\n\n\n    function markMatch(text, term, markup, escapeMarkup) {\n        var match=stripDiacritics(text.toUpperCase()).indexOf(stripDiacritics(term.toUpperCase())),\n            tl=term.length;\n\n        if (match<0) {\n            markup.push(escapeMarkup(text));\n            return;\n        }\n\n        markup.push(escapeMarkup(text.substring(0, match)));\n        markup.push(\"<span class='select2-match'>\");\n        markup.push(escapeMarkup(text.substring(match, match + tl)));\n        markup.push(\"</span>\");\n        markup.push(escapeMarkup(text.substring(match + tl, text.length)));\n    }\n\n    function defaultEscapeMarkup(markup) {\n        var replace_map = {\n            '\\\\': '&#92;',\n            '&': '&amp;',\n            '<': '&lt;',\n            '>': '&gt;',\n            '\"': '&quot;',\n            \"'\": '&#39;',\n            \"/\": '&#47;'\n        };\n\n        return String(markup).replace(/[&<>\"'\\/\\\\]/g, function (match) {\n            return replace_map[match];\n        });\n    }\n\n    /**\n     * Produces an ajax-based query function\n     *\n     * @param options object containing configuration parameters\n     * @param options.params parameter map for the transport ajax call, can contain such options as cache, jsonpCallback, etc. see $.ajax\n     * @param options.transport function that will be used to execute the ajax request. must be compatible with parameters supported by $.ajax\n     * @param options.url url for the data\n     * @param options.data a function(searchTerm, pageNumber, context) that should return an object containing query string parameters for the above url.\n     * @param options.dataType request data type: ajax, jsonp, other datatypes supported by jQuery's $.ajax function or the transport function if specified\n     * @param options.quietMillis (optional) milliseconds to wait before making the ajaxRequest, helps debounce the ajax function if invoked too often\n     * @param options.results a function(remoteData, pageNumber, query) that converts data returned form the remote request to the format expected by Select2.\n     *      The expected format is an object containing the following keys:\n     *      results array of objects that will be used as choices\n     *      more (optional) boolean indicating whether there are more results available\n     *      Example: {results:[{id:1, text:'Red'},{id:2, text:'Blue'}], more:true}\n     */\n    function ajax(options) {\n        var timeout, // current scheduled but not yet executed request\n            handler = null,\n            quietMillis = options.quietMillis || 100,\n            ajaxUrl = options.url,\n            self = this;\n\n        return function (query) {\n            window.clearTimeout(timeout);\n            timeout = window.setTimeout(function () {\n                var data = options.data, // ajax data function\n                    url = ajaxUrl, // ajax url string or function\n                    transport = options.transport || $.fn.select2.ajaxDefaults.transport,\n                    // deprecated - to be removed in 4.0  - use params instead\n                    deprecated = {\n                        type: options.type || 'GET', // set type of request (GET or POST)\n                        cache: options.cache || false,\n                        jsonpCallback: options.jsonpCallback||undefined,\n                        dataType: options.dataType||\"json\"\n                    },\n                    params = $.extend({}, $.fn.select2.ajaxDefaults.params, deprecated);\n\n                data = data ? data.call(self, query.term, query.page, query.context) : null;\n                url = (typeof url === 'function') ? url.call(self, query.term, query.page, query.context) : url;\n\n                if (handler && typeof handler.abort === \"function\") { handler.abort(); }\n\n                if (options.params) {\n                    if ($.isFunction(options.params)) {\n                        $.extend(params, options.params.call(self));\n                    } else {\n                        $.extend(params, options.params);\n                    }\n                }\n\n                $.extend(params, {\n                    url: url,\n                    dataType: options.dataType,\n                    data: data,\n                    success: function (data) {\n                        // TODO - replace query.page with query so users have access to term, page, etc.\n                        // added query as third paramter to keep backwards compatibility\n                        var results = options.results(data, query.page, query);\n                        query.callback(results);\n                    },\n                    error: function(jqXHR, textStatus, errorThrown){\n                        var results = {\n                            hasError: true,\n                            jqXHR: jqXHR,\n                            textStatus: textStatus,\n                            errorThrown: errorThrown,\n                        };\n\n                        query.callback(results);\n                    }\n                });\n                handler = transport.call(self, params);\n            }, quietMillis);\n        };\n    }\n\n    /**\n     * Produces a query function that works with a local array\n     *\n     * @param options object containing configuration parameters. The options parameter can either be an array or an\n     * object.\n     *\n     * If the array form is used it is assumed that it contains objects with 'id' and 'text' keys.\n     *\n     * If the object form is used it is assumed that it contains 'data' and 'text' keys. The 'data' key should contain\n     * an array of objects that will be used as choices. These objects must contain at least an 'id' key. The 'text'\n     * key can either be a String in which case it is expected that each element in the 'data' array has a key with the\n     * value of 'text' which will be used to match choices. Alternatively, text can be a function(item) that can extract\n     * the text.\n     */\n    function local(options) {\n        var data = options, // data elements\n            dataText,\n            tmp,\n            text = function (item) { return \"\"+item.text; }; // function used to retrieve the text portion of a data item that is matched against the search\n\n         if ($.isArray(data)) {\n            tmp = data;\n            data = { results: tmp };\n        }\n\n         if ($.isFunction(data) === false) {\n            tmp = data;\n            data = function() { return tmp; };\n        }\n\n        var dataItem = data();\n        if (dataItem.text) {\n            text = dataItem.text;\n            // if text is not a function we assume it to be a key name\n            if (!$.isFunction(text)) {\n                dataText = dataItem.text; // we need to store this in a separate variable because in the next step data gets reset and data.text is no longer available\n                text = function (item) { return item[dataText]; };\n            }\n        }\n\n        return function (query) {\n            var t = query.term, filtered = { results: [] }, process;\n            if (t === \"\") {\n                query.callback(data());\n                return;\n            }\n\n            process = function(datum, collection) {\n                var group, attr;\n                datum = datum[0];\n                if (datum.children) {\n                    group = {};\n                    for (attr in datum) {\n                        if (datum.hasOwnProperty(attr)) group[attr]=datum[attr];\n                    }\n                    group.children=[];\n                    $(datum.children).each2(function(i, childDatum) { process(childDatum, group.children); });\n                    if (group.children.length || query.matcher(t, text(group), datum)) {\n                        collection.push(group);\n                    }\n                } else {\n                    if (query.matcher(t, text(datum), datum)) {\n                        collection.push(datum);\n                    }\n                }\n            };\n\n            $(data().results).each2(function(i, datum) { process(datum, filtered.results); });\n            query.callback(filtered);\n        };\n    }\n\n    // TODO javadoc\n    function tags(data) {\n        var isFunc = $.isFunction(data);\n        return function (query) {\n            var t = query.term, filtered = {results: []};\n            var result = isFunc ? data(query) : data;\n            if ($.isArray(result)) {\n                $(result).each(function () {\n                    var isObject = this.text !== undefined,\n                        text = isObject ? this.text : this;\n                    if (t === \"\" || query.matcher(t, text)) {\n                        filtered.results.push(isObject ? this : {id: this, text: this});\n                    }\n                });\n                query.callback(filtered);\n            }\n        };\n    }\n\n    /**\n     * Checks if the formatter function should be used.\n     *\n     * Throws an error if it is not a function. Returns true if it should be used,\n     * false if no formatting should be performed.\n     *\n     * @param formatter\n     */\n    function checkFormatter(formatter, formatterName) {\n        if ($.isFunction(formatter)) return true;\n        if (!formatter) return false;\n        if (typeof(formatter) === 'string') return true;\n        throw new Error(formatterName +\" must be a string, function, or falsy value\");\n    }\n\n  /**\n   * Returns a given value\n   * If given a function, returns its output\n   *\n   * @param val string|function\n   * @param context value of \"this\" to be passed to function\n   * @returns {*}\n   */\n    function evaluate(val, context) {\n        if ($.isFunction(val)) {\n            var args = Array.prototype.slice.call(arguments, 2);\n            return val.apply(context, args);\n        }\n        return val;\n    }\n\n    function countResults(results) {\n        var count = 0;\n        $.each(results, function(i, item) {\n            if (item.children) {\n                count += countResults(item.children);\n            } else {\n                count++;\n            }\n        });\n        return count;\n    }\n\n    /**\n     * Default tokenizer. This function uses breaks the input on substring match of any string from the\n     * opts.tokenSeparators array and uses opts.createSearchChoice to create the choice object. Both of those\n     * two options have to be defined in order for the tokenizer to work.\n     *\n     * @param input text user has typed so far or pasted into the search field\n     * @param selection currently selected choices\n     * @param selectCallback function(choice) callback tho add the choice to selection\n     * @param opts select2's opts\n     * @return undefined/null to leave the current input unchanged, or a string to change the input to the returned value\n     */\n    function defaultTokenizer(input, selection, selectCallback, opts) {\n        var original = input, // store the original so we can compare and know if we need to tell the search to update its text\n            dupe = false, // check for whether a token we extracted represents a duplicate selected choice\n            token, // token\n            index, // position at which the separator was found\n            i, l, // looping variables\n            separator; // the matched separator\n\n        if (!opts.createSearchChoice || !opts.tokenSeparators || opts.tokenSeparators.length < 1) return undefined;\n\n        while (true) {\n            index = -1;\n\n            for (i = 0, l = opts.tokenSeparators.length; i < l; i++) {\n                separator = opts.tokenSeparators[i];\n                index = input.indexOf(separator);\n                if (index >= 0) break;\n            }\n\n            if (index < 0) break; // did not find any token separator in the input string, bail\n\n            token = input.substring(0, index);\n            input = input.substring(index + separator.length);\n\n            if (token.length > 0) {\n                token = opts.createSearchChoice.call(this, token, selection);\n                if (token !== undefined && token !== null && opts.id(token) !== undefined && opts.id(token) !== null) {\n                    dupe = false;\n                    for (i = 0, l = selection.length; i < l; i++) {\n                        if (equal(opts.id(token), opts.id(selection[i]))) {\n                            dupe = true; break;\n                        }\n                    }\n\n                    if (!dupe) selectCallback(token);\n                }\n            }\n        }\n\n        if (original!==input) return input;\n    }\n\n    function cleanupJQueryElements() {\n        var self = this;\n\n        $.each(arguments, function (i, element) {\n            self[element].remove();\n            self[element] = null;\n        });\n    }\n\n    /**\n     * Creates a new class\n     *\n     * @param superClass\n     * @param methods\n     */\n    function clazz(SuperClass, methods) {\n        var constructor = function () {};\n        constructor.prototype = new SuperClass;\n        constructor.prototype.constructor = constructor;\n        constructor.prototype.parent = SuperClass.prototype;\n        constructor.prototype = $.extend(constructor.prototype, methods);\n        return constructor;\n    }\n\n    AbstractSelect2 = clazz(Object, {\n\n        // abstract\n        bind: function (func) {\n            var self = this;\n            return function () {\n                func.apply(self, arguments);\n            };\n        },\n\n        // abstract\n        init: function (opts) {\n            var results, search, resultsSelector = \".select2-results\";\n\n            // prepare options\n            this.opts = opts = this.prepareOpts(opts);\n\n            this.id=opts.id;\n\n            // destroy if called on an existing component\n            if (opts.element.data(\"select2\") !== undefined &&\n                opts.element.data(\"select2\") !== null) {\n                opts.element.data(\"select2\").destroy();\n            }\n\n            this.container = this.createContainer();\n\n            this.liveRegion = $(\"<span>\", {\n                    role: \"status\",\n                    \"aria-live\": \"polite\"\n                })\n                .addClass(\"select2-hidden-accessible\")\n                .appendTo(document.body);\n\n            this.containerId=\"s2id_\"+(opts.element.attr(\"id\") || \"autogen\"+nextUid());\n            this.containerEventName= this.containerId\n                .replace(/([.])/g, '_')\n                .replace(/([;&,\\-\\.\\+\\*\\~':\"\\!\\^#$%@\\[\\]\\(\\)=>\\|])/g, '\\\\$1');\n            this.container.attr(\"id\", this.containerId);\n\n            this.container.attr(\"title\", opts.element.attr(\"title\"));\n\n            this.body = $(\"body\");\n\n            syncCssClasses(this.container, this.opts.element, this.opts.adaptContainerCssClass);\n\n            this.container.attr(\"style\", opts.element.attr(\"style\"));\n            this.container.css(evaluate(opts.containerCss, this.opts.element));\n            this.container.addClass(evaluate(opts.containerCssClass, this.opts.element));\n\n            this.elementTabIndex = this.opts.element.attr(\"tabindex\");\n\n            // swap container for the element\n            this.opts.element\n                .data(\"select2\", this)\n                .attr(\"tabindex\", \"-1\")\n                .before(this.container)\n                .on(\"click.select2\", killEvent); // do not leak click events\n\n            this.container.data(\"select2\", this);\n\n            this.dropdown = this.container.find(\".select2-drop\");\n\n            syncCssClasses(this.dropdown, this.opts.element, this.opts.adaptDropdownCssClass);\n\n            this.dropdown.addClass(evaluate(opts.dropdownCssClass, this.opts.element));\n            this.dropdown.data(\"select2\", this);\n            this.dropdown.on(\"click\", killEvent);\n\n            this.results = results = this.container.find(resultsSelector);\n            this.search = search = this.container.find(\"input.select2-input\");\n\n            this.queryCount = 0;\n            this.resultsPage = 0;\n            this.context = null;\n\n            // initialize the container\n            this.initContainer();\n\n            this.container.on(\"click\", killEvent);\n\n            installFilteredMouseMove(this.results);\n\n            this.dropdown.on(\"mousemove-filtered\", resultsSelector, this.bind(this.highlightUnderEvent));\n            this.dropdown.on(\"touchstart touchmove touchend\", resultsSelector, this.bind(function (event) {\n                this._touchEvent = true;\n                this.highlightUnderEvent(event);\n            }));\n            this.dropdown.on(\"touchmove\", resultsSelector, this.bind(this.touchMoved));\n            this.dropdown.on(\"touchstart touchend\", resultsSelector, this.bind(this.clearTouchMoved));\n\n            // Waiting for a click event on touch devices to select option and hide dropdown\n            // otherwise click will be triggered on an underlying element\n            this.dropdown.on('click', this.bind(function (event) {\n                if (this._touchEvent) {\n                    this._touchEvent = false;\n                    this.selectHighlighted();\n                }\n            }));\n\n            installDebouncedScroll(80, this.results);\n            this.dropdown.on(\"scroll-debounced\", resultsSelector, this.bind(this.loadMoreIfNeeded));\n\n            // do not propagate change event from the search field out of the component\n            $(this.container).on(\"change\", \".select2-input\", function(e) {e.stopPropagation();});\n            $(this.dropdown).on(\"change\", \".select2-input\", function(e) {e.stopPropagation();});\n\n            // if jquery.mousewheel plugin is installed we can prevent out-of-bounds scrolling of results via mousewheel\n            if ($.fn.mousewheel) {\n                results.mousewheel(function (e, delta, deltaX, deltaY) {\n                    var top = results.scrollTop();\n                    if (deltaY > 0 && top - deltaY <= 0) {\n                        results.scrollTop(0);\n                        killEvent(e);\n                    } else if (deltaY < 0 && results.get(0).scrollHeight - results.scrollTop() + deltaY <= results.height()) {\n                        results.scrollTop(results.get(0).scrollHeight - results.height());\n                        killEvent(e);\n                    }\n                });\n            }\n\n            installKeyUpChangeEvent(search);\n            search.on(\"keyup-change input paste\", this.bind(this.updateResults));\n            search.on(\"focus\", function () { search.addClass(\"select2-focused\"); });\n            search.on(\"blur\", function () { search.removeClass(\"select2-focused\");});\n\n            this.dropdown.on(\"mouseup\", resultsSelector, this.bind(function (e) {\n                if ($(e.target).closest(\".select2-result-selectable\").length > 0) {\n                    this.highlightUnderEvent(e);\n                    this.selectHighlighted(e);\n                }\n            }));\n\n            // trap all mouse events from leaving the dropdown. sometimes there may be a modal that is listening\n            // for mouse events outside of itself so it can close itself. since the dropdown is now outside the select2's\n            // dom it will trigger the popup close, which is not what we want\n            // focusin can cause focus wars between modals and select2 since the dropdown is outside the modal.\n            this.dropdown.on(\"click mouseup mousedown touchstart touchend focusin\", function (e) { e.stopPropagation(); });\n\n            this.nextSearchTerm = undefined;\n\n            if ($.isFunction(this.opts.initSelection)) {\n                // initialize selection based on the current value of the source element\n                this.initSelection();\n\n                // if the user has provided a function that can set selection based on the value of the source element\n                // we monitor the change event on the element and trigger it, allowing for two way synchronization\n                this.monitorSource();\n            }\n\n            if (opts.maximumInputLength !== null) {\n                this.search.attr(\"maxlength\", opts.maximumInputLength);\n            }\n\n            var disabled = opts.element.prop(\"disabled\");\n            if (disabled === undefined) disabled = false;\n            this.enable(!disabled);\n\n            var readonly = opts.element.prop(\"readonly\");\n            if (readonly === undefined) readonly = false;\n            this.readonly(readonly);\n\n            // Calculate size of scrollbar\n            scrollBarDimensions = scrollBarDimensions || measureScrollbar();\n\n            this.autofocus = opts.element.prop(\"autofocus\");\n            opts.element.prop(\"autofocus\", false);\n            if (this.autofocus) this.focus();\n\n            this.search.attr(\"placeholder\", opts.searchInputPlaceholder);\n        },\n\n        // abstract\n        destroy: function () {\n            var element=this.opts.element, select2 = element.data(\"select2\"), self = this;\n\n            this.close();\n\n            if (element.length && element[0].detachEvent) {\n                element.each(function () {\n                    this.detachEvent(\"onpropertychange\", self._sync);\n                });\n            }\n            if (this.propertyObserver) {\n                this.propertyObserver.disconnect();\n                this.propertyObserver = null;\n            }\n            this._sync = null;\n\n            if (select2 !== undefined) {\n                select2.container.remove();\n                select2.liveRegion.remove();\n                select2.dropdown.remove();\n                element\n                    .removeClass(\"select2-offscreen\")\n                    .removeData(\"select2\")\n                    .off(\".select2\")\n                    .prop(\"autofocus\", this.autofocus || false);\n                if (this.elementTabIndex) {\n                    element.attr({tabindex: this.elementTabIndex});\n                } else {\n                    element.removeAttr(\"tabindex\");\n                }\n                element.show();\n            }\n\n            cleanupJQueryElements.call(this,\n                \"container\",\n                \"liveRegion\",\n                \"dropdown\",\n                \"results\",\n                \"search\"\n            );\n        },\n\n        // abstract\n        optionToData: function(element) {\n            if (element.is(\"option\")) {\n                return {\n                    id:element.prop(\"value\"),\n                    text:element.text(),\n                    element: element.get(),\n                    css: element.attr(\"class\"),\n                    disabled: element.prop(\"disabled\"),\n                    locked: equal(element.attr(\"locked\"), \"locked\") || equal(element.data(\"locked\"), true)\n                };\n            } else if (element.is(\"optgroup\")) {\n                return {\n                    text:element.attr(\"label\"),\n                    children:[],\n                    element: element.get(),\n                    css: element.attr(\"class\")\n                };\n            }\n        },\n\n        // abstract\n        prepareOpts: function (opts) {\n            var element, select, idKey, ajaxUrl, self = this;\n\n            element = opts.element;\n\n            if (element.get(0).tagName.toLowerCase() === \"select\") {\n                this.select = select = opts.element;\n            }\n\n            if (select) {\n                // these options are not allowed when attached to a select because they are picked up off the element itself\n                $.each([\"id\", \"multiple\", \"ajax\", \"query\", \"createSearchChoice\", \"initSelection\", \"data\", \"tags\"], function () {\n                    if (this in opts) {\n                        throw new Error(\"Option '\" + this + \"' is not allowed for Select2 when attached to a <select> element.\");\n                    }\n                });\n            }\n\n            opts = $.extend({}, {\n                populateResults: function(container, results, query) {\n                    var populate, id=this.opts.id, liveRegion=this.liveRegion;\n\n                    populate=function(results, container, depth) {\n\n                        var i, l, result, selectable, disabled, compound, node, label, innerContainer, formatted;\n\n                        results = opts.sortResults(results, container, query);\n\n                        // collect the created nodes for bulk append\n                        var nodes = [];\n                        for (i = 0, l = results.length; i < l; i = i + 1) {\n\n                            result=results[i];\n\n                            disabled = (result.disabled === true);\n                            selectable = (!disabled) && (id(result) !== undefined);\n\n                            compound=result.children && result.children.length > 0;\n\n                            node=$(\"<li></li>\");\n                            node.addClass(\"select2-results-dept-\"+depth);\n                            node.addClass(\"select2-result\");\n                            node.addClass(selectable ? \"select2-result-selectable\" : \"select2-result-unselectable\");\n                            if (disabled) { node.addClass(\"select2-disabled\"); }\n                            if (compound) { node.addClass(\"select2-result-with-children\"); }\n                            node.addClass(self.opts.formatResultCssClass(result));\n                            node.attr(\"role\", \"presentation\");\n\n                            label=$(document.createElement(\"div\"));\n                            label.addClass(\"select2-result-label\");\n                            label.attr(\"id\", \"select2-result-label-\" + nextUid());\n                            label.attr(\"role\", \"option\");\n\n                            formatted=opts.formatResult(result, label, query, self.opts.escapeMarkup);\n                            if (formatted!==undefined) {\n                                label.html(formatted);\n                                node.append(label);\n                            }\n\n\n                            if (compound) {\n\n                                innerContainer=$(\"<ul></ul>\");\n                                innerContainer.addClass(\"select2-result-sub\");\n                                populate(result.children, innerContainer, depth+1);\n                                node.append(innerContainer);\n                            }\n\n                            node.data(\"select2-data\", result);\n                            nodes.push(node[0]);\n                        }\n\n                        // bulk append the created nodes\n                        container.append(nodes);\n                        liveRegion.text(opts.formatMatches(results.length));\n                    };\n\n                    populate(results, container, 0);\n                }\n            }, $.fn.select2.defaults, opts);\n\n            if (typeof(opts.id) !== \"function\") {\n                idKey = opts.id;\n                opts.id = function (e) { return e[idKey]; };\n            }\n\n            if ($.isArray(opts.element.data(\"select2Tags\"))) {\n                if (\"tags\" in opts) {\n                    throw \"tags specified as both an attribute 'data-select2-tags' and in options of Select2 \" + opts.element.attr(\"id\");\n                }\n                opts.tags=opts.element.data(\"select2Tags\");\n            }\n\n            if (select) {\n                opts.query = this.bind(function (query) {\n                    var data = { results: [], more: false },\n                        term = query.term,\n                        children, placeholderOption, process;\n\n                    process=function(element, collection) {\n                        var group;\n                        if (element.is(\"option\")) {\n                            if (query.matcher(term, element.text(), element)) {\n                                collection.push(self.optionToData(element));\n                            }\n                        } else if (element.is(\"optgroup\")) {\n                            group=self.optionToData(element);\n                            element.children().each2(function(i, elm) { process(elm, group.children); });\n                            if (group.children.length>0) {\n                                collection.push(group);\n                            }\n                        }\n                    };\n\n                    children=element.children();\n\n                    // ignore the placeholder option if there is one\n                    if (this.getPlaceholder() !== undefined && children.length > 0) {\n                        placeholderOption = this.getPlaceholderOption();\n                        if (placeholderOption) {\n                            children=children.not(placeholderOption);\n                        }\n                    }\n\n                    children.each2(function(i, elm) { process(elm, data.results); });\n\n                    query.callback(data);\n                });\n                // this is needed because inside val() we construct choices from options and their id is hardcoded\n                opts.id=function(e) { return e.id; };\n            } else {\n                if (!(\"query\" in opts)) {\n\n                    if (\"ajax\" in opts) {\n                        ajaxUrl = opts.element.data(\"ajax-url\");\n                        if (ajaxUrl && ajaxUrl.length > 0) {\n                            opts.ajax.url = ajaxUrl;\n                        }\n                        opts.query = ajax.call(opts.element, opts.ajax);\n                    } else if (\"data\" in opts) {\n                        opts.query = local(opts.data);\n                    } else if (\"tags\" in opts) {\n                        opts.query = tags(opts.tags);\n                        if (opts.createSearchChoice === undefined) {\n                            opts.createSearchChoice = function (term) { return {id: $.trim(term), text: $.trim(term)}; };\n                        }\n                        if (opts.initSelection === undefined) {\n                            opts.initSelection = function (element, callback) {\n                                var data = [];\n                                $(splitVal(element.val(), opts.separator)).each(function () {\n                                    var obj = { id: this, text: this },\n                                        tags = opts.tags;\n                                    if ($.isFunction(tags)) tags=tags();\n                                    $(tags).each(function() { if (equal(this.id, obj.id)) { obj = this; return false; } });\n                                    data.push(obj);\n                                });\n\n                                callback(data);\n                            };\n                        }\n                    }\n                }\n            }\n            if (typeof(opts.query) !== \"function\") {\n                throw \"query function not defined for Select2 \" + opts.element.attr(\"id\");\n            }\n\n            if (opts.createSearchChoicePosition === 'top') {\n                opts.createSearchChoicePosition = function(list, item) { list.unshift(item); };\n            }\n            else if (opts.createSearchChoicePosition === 'bottom') {\n                opts.createSearchChoicePosition = function(list, item) { list.push(item); };\n            }\n            else if (typeof(opts.createSearchChoicePosition) !== \"function\")  {\n                throw \"invalid createSearchChoicePosition option must be 'top', 'bottom' or a custom function\";\n            }\n\n            return opts;\n        },\n\n        /**\n         * Monitor the original element for changes and update select2 accordingly\n         */\n        // abstract\n        monitorSource: function () {\n            var el = this.opts.element, observer, self = this;\n\n            el.on(\"change.select2\", this.bind(function (e) {\n                if (this.opts.element.data(\"select2-change-triggered\") !== true) {\n                    this.initSelection();\n                }\n            }));\n\n            this._sync = this.bind(function () {\n\n                // sync enabled state\n                var disabled = el.prop(\"disabled\");\n                if (disabled === undefined) disabled = false;\n                this.enable(!disabled);\n\n                var readonly = el.prop(\"readonly\");\n                if (readonly === undefined) readonly = false;\n                this.readonly(readonly);\n\n                syncCssClasses(this.container, this.opts.element, this.opts.adaptContainerCssClass);\n                this.container.addClass(evaluate(this.opts.containerCssClass, this.opts.element));\n\n                syncCssClasses(this.dropdown, this.opts.element, this.opts.adaptDropdownCssClass);\n                this.dropdown.addClass(evaluate(this.opts.dropdownCssClass, this.opts.element));\n\n            });\n\n            // IE8-10 (IE9/10 won't fire propertyChange via attachEventListener)\n            if (el.length && el[0].attachEvent) {\n                el.each(function() {\n                    this.attachEvent(\"onpropertychange\", self._sync);\n                });\n            }\n\n            // safari, chrome, firefox, IE11\n            observer = window.MutationObserver || window.WebKitMutationObserver|| window.MozMutationObserver;\n            if (observer !== undefined) {\n                if (this.propertyObserver) { delete this.propertyObserver; this.propertyObserver = null; }\n                this.propertyObserver = new observer(function (mutations) {\n                    $.each(mutations, self._sync);\n                });\n                this.propertyObserver.observe(el.get(0), { attributes:true, subtree:false });\n            }\n        },\n\n        // abstract\n        triggerSelect: function(data) {\n            var evt = $.Event(\"select2-selecting\", { val: this.id(data), object: data, choice: data });\n            this.opts.element.trigger(evt);\n            return !evt.isDefaultPrevented();\n        },\n\n        /**\n         * Triggers the change event on the source element\n         */\n        // abstract\n        triggerChange: function (details) {\n\n            details = details || {};\n            details= $.extend({}, details, { type: \"change\", val: this.val() });\n            // prevents recursive triggering\n            this.opts.element.data(\"select2-change-triggered\", true);\n            this.opts.element.trigger(details);\n            this.opts.element.data(\"select2-change-triggered\", false);\n\n            // some validation frameworks ignore the change event and listen instead to keyup, click for selects\n            // so here we trigger the click event manually\n            this.opts.element.click();\n\n            // ValidationEngine ignores the change event and listens instead to blur\n            // so here we trigger the blur event manually if so desired\n            if (this.opts.blurOnChange)\n                this.opts.element.blur();\n        },\n\n        //abstract\n        isInterfaceEnabled: function()\n        {\n            return this.enabledInterface === true;\n        },\n\n        // abstract\n        enableInterface: function() {\n            var enabled = this._enabled && !this._readonly,\n                disabled = !enabled;\n\n            if (enabled === this.enabledInterface) return false;\n\n            this.container.toggleClass(\"select2-container-disabled\", disabled);\n            this.close();\n            this.enabledInterface = enabled;\n\n            return true;\n        },\n\n        // abstract\n        enable: function(enabled) {\n            if (enabled === undefined) enabled = true;\n            if (this._enabled === enabled) return;\n            this._enabled = enabled;\n\n            this.opts.element.prop(\"disabled\", !enabled);\n            this.enableInterface();\n        },\n\n        // abstract\n        disable: function() {\n            this.enable(false);\n        },\n\n        // abstract\n        readonly: function(enabled) {\n            if (enabled === undefined) enabled = false;\n            if (this._readonly === enabled) return;\n            this._readonly = enabled;\n\n            this.opts.element.prop(\"readonly\", enabled);\n            this.enableInterface();\n        },\n\n        // abstract\n        opened: function () {\n            return (this.container) ? this.container.hasClass(\"select2-dropdown-open\") : false;\n        },\n\n        // abstract\n        positionDropdown: function() {\n            var $dropdown = this.dropdown,\n                offset = this.container.offset(),\n                height = this.container.outerHeight(false),\n                width = this.container.outerWidth(false),\n                dropHeight = $dropdown.outerHeight(false),\n                $window = $(window),\n                windowWidth = $window.width(),\n                windowHeight = $window.height(),\n                viewPortRight = $window.scrollLeft() + windowWidth,\n                viewportBottom = $window.scrollTop() + windowHeight,\n                dropTop = offset.top + height,\n                dropLeft = offset.left,\n                enoughRoomBelow = dropTop + dropHeight <= viewportBottom,\n                enoughRoomAbove = (offset.top - dropHeight) >= $window.scrollTop(),\n                dropWidth = $dropdown.outerWidth(false),\n                enoughRoomOnRight = dropLeft + dropWidth <= viewPortRight,\n                aboveNow = $dropdown.hasClass(\"select2-drop-above\"),\n                bodyOffset,\n                above,\n                changeDirection,\n                css,\n                resultsListNode;\n\n            // always prefer the current above/below alignment, unless there is not enough room\n            if (aboveNow) {\n                above = true;\n                if (!enoughRoomAbove && enoughRoomBelow) {\n                    changeDirection = true;\n                    above = false;\n                }\n            } else {\n                above = false;\n                if (!enoughRoomBelow && enoughRoomAbove) {\n                    changeDirection = true;\n                    above = true;\n                }\n            }\n\n            //if we are changing direction we need to get positions when dropdown is hidden;\n            if (changeDirection) {\n                $dropdown.hide();\n                offset = this.container.offset();\n                height = this.container.outerHeight(false);\n                width = this.container.outerWidth(false);\n                dropHeight = $dropdown.outerHeight(false);\n                viewPortRight = $window.scrollLeft() + windowWidth;\n                viewportBottom = $window.scrollTop() + windowHeight;\n                dropTop = offset.top + height;\n                dropLeft = offset.left;\n                dropWidth = $dropdown.outerWidth(false);\n                enoughRoomOnRight = dropLeft + dropWidth <= viewPortRight;\n                $dropdown.show();\n\n                // fix so the cursor does not move to the left within the search-textbox in IE\n                this.focusSearch();\n            }\n\n            if (this.opts.dropdownAutoWidth) {\n                resultsListNode = $('.select2-results', $dropdown)[0];\n                $dropdown.addClass('select2-drop-auto-width');\n                $dropdown.css('width', '');\n                // Add scrollbar width to dropdown if vertical scrollbar is present\n                dropWidth = $dropdown.outerWidth(false) + (resultsListNode.scrollHeight === resultsListNode.clientHeight ? 0 : scrollBarDimensions.width);\n                dropWidth > width ? width = dropWidth : dropWidth = width;\n                dropHeight = $dropdown.outerHeight(false);\n                enoughRoomOnRight = dropLeft + dropWidth <= viewPortRight;\n            }\n            else {\n                this.container.removeClass('select2-drop-auto-width');\n            }\n\n            //console.log(\"below/ droptop:\", dropTop, \"dropHeight\", dropHeight, \"sum\", (dropTop+dropHeight)+\" viewport bottom\", viewportBottom, \"enough?\", enoughRoomBelow);\n            //console.log(\"above/ offset.top\", offset.top, \"dropHeight\", dropHeight, \"top\", (offset.top-dropHeight), \"scrollTop\", this.body.scrollTop(), \"enough?\", enoughRoomAbove);\n\n            // fix positioning when body has an offset and is not position: static\n            if (this.body.css('position') !== 'static') {\n                bodyOffset = this.body.offset();\n                dropTop -= bodyOffset.top;\n                dropLeft -= bodyOffset.left;\n            }\n\n            if (!enoughRoomOnRight) {\n                dropLeft = offset.left + this.container.outerWidth(false) - dropWidth;\n            }\n\n            css =  {\n                left: dropLeft,\n                width: width\n            };\n\n            if (above) {\n                css.top = offset.top - dropHeight;\n                css.bottom = 'auto';\n                this.container.addClass(\"select2-drop-above\");\n                $dropdown.addClass(\"select2-drop-above\");\n            }\n            else {\n                css.top = dropTop;\n                css.bottom = 'auto';\n                this.container.removeClass(\"select2-drop-above\");\n                $dropdown.removeClass(\"select2-drop-above\");\n            }\n            css = $.extend(css, evaluate(this.opts.dropdownCss, this.opts.element));\n\n            $dropdown.css(css);\n        },\n\n        // abstract\n        shouldOpen: function() {\n            var event;\n\n            if (this.opened()) return false;\n\n            if (this._enabled === false || this._readonly === true) return false;\n\n            event = $.Event(\"select2-opening\");\n            this.opts.element.trigger(event);\n            return !event.isDefaultPrevented();\n        },\n\n        // abstract\n        clearDropdownAlignmentPreference: function() {\n            // clear the classes used to figure out the preference of where the dropdown should be opened\n            this.container.removeClass(\"select2-drop-above\");\n            this.dropdown.removeClass(\"select2-drop-above\");\n        },\n\n        /**\n         * Opens the dropdown\n         *\n         * @return {Boolean} whether or not dropdown was opened. This method will return false if, for example,\n         * the dropdown is already open, or if the 'open' event listener on the element called preventDefault().\n         */\n        // abstract\n        open: function () {\n\n            if (!this.shouldOpen()) return false;\n\n            this.opening();\n\n            // Only bind the document mousemove when the dropdown is visible\n            $document.on(\"mousemove.select2Event\", function (e) {\n                lastMousePosition.x = e.pageX;\n                lastMousePosition.y = e.pageY;\n            });\n\n            return true;\n        },\n\n        /**\n         * Performs the opening of the dropdown\n         */\n        // abstract\n        opening: function() {\n            var cid = this.containerEventName,\n                scroll = \"scroll.\" + cid,\n                resize = \"resize.\"+cid,\n                orient = \"orientationchange.\"+cid,\n                mask;\n\n            this.container.addClass(\"select2-dropdown-open\").addClass(\"select2-container-active\");\n\n            this.clearDropdownAlignmentPreference();\n\n            if(this.dropdown[0] !== this.body.children().last()[0]) {\n                this.dropdown.detach().appendTo(this.body);\n            }\n\n            // create the dropdown mask if doesn't already exist\n            mask = $(\"#select2-drop-mask\");\n            if (mask.length == 0) {\n                mask = $(document.createElement(\"div\"));\n                mask.attr(\"id\",\"select2-drop-mask\").attr(\"class\",\"select2-drop-mask\");\n                mask.hide();\n                mask.appendTo(this.body);\n                mask.on(\"mousedown touchstart click\", function (e) {\n                    // Prevent IE from generating a click event on the body\n                    reinsertElement(mask);\n\n                    var dropdown = $(\"#select2-drop\"), self;\n                    if (dropdown.length > 0) {\n                        self=dropdown.data(\"select2\");\n                        if (self.opts.selectOnBlur) {\n                            self.selectHighlighted({noFocus: true});\n                        }\n                        self.close();\n                        e.preventDefault();\n                        e.stopPropagation();\n                    }\n                });\n            }\n\n            // ensure the mask is always right before the dropdown\n            if (this.dropdown.prev()[0] !== mask[0]) {\n                this.dropdown.before(mask);\n            }\n\n            // move the global id to the correct dropdown\n            $(\"#select2-drop\").removeAttr(\"id\");\n            this.dropdown.attr(\"id\", \"select2-drop\");\n\n            // show the elements\n            mask.show();\n\n            this.positionDropdown();\n            this.dropdown.show();\n            this.positionDropdown();\n\n            this.dropdown.addClass(\"select2-drop-active\");\n\n            // attach listeners to events that can change the position of the container and thus require\n            // the position of the dropdown to be updated as well so it does not come unglued from the container\n            var that = this;\n            this.container.parents().add(window).each(function () {\n                $(this).on(resize+\" \"+scroll+\" \"+orient, function (e) {\n                    if (that.opened()) that.positionDropdown();\n                });\n            });\n\n\n        },\n\n        // abstract\n        close: function () {\n            if (!this.opened()) return;\n\n            var cid = this.containerEventName,\n                scroll = \"scroll.\" + cid,\n                resize = \"resize.\"+cid,\n                orient = \"orientationchange.\"+cid;\n\n            // unbind event listeners\n            this.container.parents().add(window).each(function () { $(this).off(scroll).off(resize).off(orient); });\n\n            this.clearDropdownAlignmentPreference();\n\n            $(\"#select2-drop-mask\").hide();\n            this.dropdown.removeAttr(\"id\"); // only the active dropdown has the select2-drop id\n            this.dropdown.hide();\n            this.container.removeClass(\"select2-dropdown-open\").removeClass(\"select2-container-active\");\n            this.results.empty();\n\n            // Now that the dropdown is closed, unbind the global document mousemove event\n            $document.off(\"mousemove.select2Event\");\n\n            this.clearSearch();\n            this.search.removeClass(\"select2-active\");\n            this.opts.element.trigger($.Event(\"select2-close\"));\n        },\n\n        /**\n         * Opens control, sets input value, and updates results.\n         */\n        // abstract\n        externalSearch: function (term) {\n            this.open();\n            this.search.val(term);\n            this.updateResults(false);\n        },\n\n        // abstract\n        clearSearch: function () {\n\n        },\n\n        //abstract\n        getMaximumSelectionSize: function() {\n            return evaluate(this.opts.maximumSelectionSize, this.opts.element);\n        },\n\n        // abstract\n        ensureHighlightVisible: function () {\n            var results = this.results, children, index, child, hb, rb, y, more, topOffset;\n\n            index = this.highlight();\n\n            if (index < 0) return;\n\n            if (index == 0) {\n\n                // if the first element is highlighted scroll all the way to the top,\n                // that way any unselectable headers above it will also be scrolled\n                // into view\n\n                results.scrollTop(0);\n                return;\n            }\n\n            children = this.findHighlightableChoices().find('.select2-result-label');\n\n            child = $(children[index]);\n\n            topOffset = (child.offset() || {}).top || 0;\n\n            hb = topOffset + child.outerHeight(true);\n\n            // if this is the last child lets also make sure select2-more-results is visible\n            if (index === children.length - 1) {\n                more = results.find(\"li.select2-more-results\");\n                if (more.length > 0) {\n                    hb = more.offset().top + more.outerHeight(true);\n                }\n            }\n\n            rb = results.offset().top + results.outerHeight(true);\n            if (hb > rb) {\n                results.scrollTop(results.scrollTop() + (hb - rb));\n            }\n            y = topOffset - results.offset().top;\n\n            // make sure the top of the element is visible\n            if (y < 0 && child.css('display') != 'none' ) {\n                results.scrollTop(results.scrollTop() + y); // y is negative\n            }\n        },\n\n        // abstract\n        findHighlightableChoices: function() {\n            return this.results.find(\".select2-result-selectable:not(.select2-disabled):not(.select2-selected)\");\n        },\n\n        // abstract\n        moveHighlight: function (delta) {\n            var choices = this.findHighlightableChoices(),\n                index = this.highlight();\n\n            while (index > -1 && index < choices.length) {\n                index += delta;\n                var choice = $(choices[index]);\n                if (choice.hasClass(\"select2-result-selectable\") && !choice.hasClass(\"select2-disabled\") && !choice.hasClass(\"select2-selected\")) {\n                    this.highlight(index);\n                    break;\n                }\n            }\n        },\n\n        // abstract\n        highlight: function (index) {\n            var choices = this.findHighlightableChoices(),\n                choice,\n                data;\n\n            if (arguments.length === 0) {\n                return indexOf(choices.filter(\".select2-highlighted\")[0], choices.get());\n            }\n\n            if (index >= choices.length) index = choices.length - 1;\n            if (index < 0) index = 0;\n\n            this.removeHighlight();\n\n            choice = $(choices[index]);\n            choice.addClass(\"select2-highlighted\");\n\n            // ensure assistive technology can determine the active choice\n            this.search.attr(\"aria-activedescendant\", choice.find(\".select2-result-label\").attr(\"id\"));\n\n            this.ensureHighlightVisible();\n\n            this.liveRegion.text(choice.text());\n\n            data = choice.data(\"select2-data\");\n            if (data) {\n                this.opts.element.trigger({ type: \"select2-highlight\", val: this.id(data), choice: data });\n            }\n        },\n\n        removeHighlight: function() {\n            this.results.find(\".select2-highlighted\").removeClass(\"select2-highlighted\");\n        },\n\n        touchMoved: function() {\n            this._touchMoved = true;\n        },\n\n        clearTouchMoved: function() {\n          this._touchMoved = false;\n        },\n\n        // abstract\n        countSelectableResults: function() {\n            return this.findHighlightableChoices().length;\n        },\n\n        // abstract\n        highlightUnderEvent: function (event) {\n            var el = $(event.target).closest(\".select2-result-selectable\");\n            if (el.length > 0 && !el.is(\".select2-highlighted\")) {\n                var choices = this.findHighlightableChoices();\n                this.highlight(choices.index(el));\n            } else if (el.length == 0) {\n                // if we are over an unselectable item remove all highlights\n                this.removeHighlight();\n            }\n        },\n\n        // abstract\n        loadMoreIfNeeded: function () {\n            var results = this.results,\n                more = results.find(\"li.select2-more-results\"),\n                below, // pixels the element is below the scroll fold, below==0 is when the element is starting to be visible\n                page = this.resultsPage + 1,\n                self=this,\n                term=this.search.val(),\n                context=this.context;\n\n            if (more.length === 0) return;\n            below = more.offset().top - results.offset().top - results.height();\n\n            if (below <= this.opts.loadMorePadding) {\n                more.addClass(\"select2-active\");\n                this.opts.query({\n                        element: this.opts.element,\n                        term: term,\n                        page: page,\n                        context: context,\n                        matcher: this.opts.matcher,\n                        callback: this.bind(function (data) {\n\n                    // ignore a response if the select2 has been closed before it was received\n                    if (!self.opened()) return;\n\n\n                    self.opts.populateResults.call(this, results, data.results, {term: term, page: page, context:context});\n                    self.postprocessResults(data, false, false);\n\n                    if (data.more===true) {\n                        more.detach().appendTo(results).text(evaluate(self.opts.formatLoadMore, self.opts.element, page+1));\n                        window.setTimeout(function() { self.loadMoreIfNeeded(); }, 10);\n                    } else {\n                        more.remove();\n                    }\n                    self.positionDropdown();\n                    self.resultsPage = page;\n                    self.context = data.context;\n                    this.opts.element.trigger({ type: \"select2-loaded\", items: data });\n                })});\n            }\n        },\n\n        /**\n         * Default tokenizer function which does nothing\n         */\n        tokenize: function() {\n\n        },\n\n        /**\n         * @param initial whether or not this is the call to this method right after the dropdown has been opened\n         */\n        // abstract\n        updateResults: function (initial) {\n            var search = this.search,\n                results = this.results,\n                opts = this.opts,\n                data,\n                self = this,\n                input,\n                term = search.val(),\n                lastTerm = $.data(this.container, \"select2-last-term\"),\n                // sequence number used to drop out-of-order responses\n                queryNumber;\n\n            // prevent duplicate queries against the same term\n            if (initial !== true && lastTerm && equal(term, lastTerm)) return;\n\n            $.data(this.container, \"select2-last-term\", term);\n\n            // if the search is currently hidden we do not alter the results\n            if (initial !== true && (this.showSearchInput === false || !this.opened())) {\n                return;\n            }\n\n            function postRender() {\n                search.removeClass(\"select2-active\");\n                self.positionDropdown();\n                if (results.find('.select2-no-results,.select2-selection-limit,.select2-searching').length) {\n                    self.liveRegion.text(results.text());\n                }\n                else {\n                    self.liveRegion.text(self.opts.formatMatches(results.find('.select2-result-selectable').length));\n                }\n            }\n\n            function render(html) {\n                results.html(html);\n                postRender();\n            }\n\n            queryNumber = ++this.queryCount;\n\n            var maxSelSize = this.getMaximumSelectionSize();\n            if (maxSelSize >=1) {\n                data = this.data();\n                if ($.isArray(data) && data.length >= maxSelSize && checkFormatter(opts.formatSelectionTooBig, \"formatSelectionTooBig\")) {\n                    render(\"<li class='select2-selection-limit'>\" + evaluate(opts.formatSelectionTooBig, opts.element, maxSelSize) + \"</li>\");\n                    return;\n                }\n            }\n\n            if (search.val().length < opts.minimumInputLength) {\n                if (checkFormatter(opts.formatInputTooShort, \"formatInputTooShort\")) {\n                    render(\"<li class='select2-no-results'>\" + evaluate(opts.formatInputTooShort, opts.element, search.val(), opts.minimumInputLength) + \"</li>\");\n                } else {\n                    render(\"\");\n                }\n                if (initial && this.showSearch) this.showSearch(true);\n                return;\n            }\n\n            if (opts.maximumInputLength && search.val().length > opts.maximumInputLength) {\n                if (checkFormatter(opts.formatInputTooLong, \"formatInputTooLong\")) {\n                    render(\"<li class='select2-no-results'>\" + evaluate(opts.formatInputTooLong, opts.element, search.val(), opts.maximumInputLength) + \"</li>\");\n                } else {\n                    render(\"\");\n                }\n                return;\n            }\n\n            if (opts.formatSearching && this.findHighlightableChoices().length === 0) {\n                render(\"<li class='select2-searching'>\" + evaluate(opts.formatSearching, opts.element) + \"</li>\");\n            }\n\n            search.addClass(\"select2-active\");\n\n            this.removeHighlight();\n\n            // give the tokenizer a chance to pre-process the input\n            input = this.tokenize();\n            if (input != undefined && input != null) {\n                search.val(input);\n            }\n\n            this.resultsPage = 1;\n\n            opts.query({\n                element: opts.element,\n                    term: search.val(),\n                    page: this.resultsPage,\n                    context: null,\n                    matcher: opts.matcher,\n                    callback: this.bind(function (data) {\n                var def; // default choice\n\n                // ignore old responses\n                if (queryNumber != this.queryCount) {\n                  return;\n                }\n\n                // ignore a response if the select2 has been closed before it was received\n                if (!this.opened()) {\n                    this.search.removeClass(\"select2-active\");\n                    return;\n                }\n\n                // handle ajax error\n                if(data.hasError !== undefined && checkFormatter(opts.formatAjaxError, \"formatAjaxError\")) {\n                    render(\"<li class='select2-ajax-error'>\" + evaluate(opts.formatAjaxError, opts.element, data.jqXHR, data.textStatus, data.errorThrown) + \"</li>\");\n                    return;\n                }\n\n                // save context, if any\n                this.context = (data.context===undefined) ? null : data.context;\n                // create a default choice and prepend it to the list\n                if (this.opts.createSearchChoice && search.val() !== \"\") {\n                    def = this.opts.createSearchChoice.call(self, search.val(), data.results);\n                    if (def !== undefined && def !== null && self.id(def) !== undefined && self.id(def) !== null) {\n                        if ($(data.results).filter(\n                            function () {\n                                return equal(self.id(this), self.id(def));\n                            }).length === 0) {\n                            this.opts.createSearchChoicePosition(data.results, def);\n                        }\n                    }\n                }\n\n                if (data.results.length === 0 && checkFormatter(opts.formatNoMatches, \"formatNoMatches\")) {\n                    render(\"<li class='select2-no-results'>\" + evaluate(opts.formatNoMatches, opts.element, search.val()) + \"</li>\");\n                    return;\n                }\n\n                results.empty();\n                self.opts.populateResults.call(this, results, data.results, {term: search.val(), page: this.resultsPage, context:null});\n\n                if (data.more === true && checkFormatter(opts.formatLoadMore, \"formatLoadMore\")) {\n                    results.append(\"<li class='select2-more-results'>\" + opts.escapeMarkup(evaluate(opts.formatLoadMore, opts.element, this.resultsPage)) + \"</li>\");\n                    window.setTimeout(function() { self.loadMoreIfNeeded(); }, 10);\n                }\n\n                this.postprocessResults(data, initial);\n\n                postRender();\n\n                this.opts.element.trigger({ type: \"select2-loaded\", items: data });\n            })});\n        },\n\n        // abstract\n        cancel: function () {\n            this.close();\n        },\n\n        // abstract\n        blur: function () {\n            // if selectOnBlur == true, select the currently highlighted option\n            if (this.opts.selectOnBlur)\n                this.selectHighlighted({noFocus: true});\n\n            this.close();\n            this.container.removeClass(\"select2-container-active\");\n            // synonymous to .is(':focus'), which is available in jquery >= 1.6\n            if (this.search[0] === document.activeElement) { this.search.blur(); }\n            this.clearSearch();\n            this.selection.find(\".select2-search-choice-focus\").removeClass(\"select2-search-choice-focus\");\n        },\n\n        // abstract\n        focusSearch: function () {\n            focus(this.search);\n        },\n\n        // abstract\n        selectHighlighted: function (options) {\n            if (this._touchMoved) {\n              this.clearTouchMoved();\n              return;\n            }\n            var index=this.highlight(),\n                highlighted=this.results.find(\".select2-highlighted\"),\n                data = highlighted.closest('.select2-result').data(\"select2-data\");\n\n            if (data) {\n                this.highlight(index);\n                this.onSelect(data, options);\n            } else if (options && options.noFocus) {\n                this.close();\n            }\n        },\n\n        // abstract\n        getPlaceholder: function () {\n            var placeholderOption;\n            return this.opts.element.attr(\"placeholder\") ||\n                this.opts.element.attr(\"data-placeholder\") || // jquery 1.4 compat\n                this.opts.element.data(\"placeholder\") ||\n                this.opts.placeholder ||\n                ((placeholderOption = this.getPlaceholderOption()) !== undefined ? placeholderOption.text() : undefined);\n        },\n\n        // abstract\n        getPlaceholderOption: function() {\n            if (this.select) {\n                var firstOption = this.select.children('option').first();\n                if (this.opts.placeholderOption !== undefined ) {\n                    //Determine the placeholder option based on the specified placeholderOption setting\n                    return (this.opts.placeholderOption === \"first\" && firstOption) ||\n                           (typeof this.opts.placeholderOption === \"function\" && this.opts.placeholderOption(this.select));\n                } else if ($.trim(firstOption.text()) === \"\" && firstOption.val() === \"\") {\n                    //No explicit placeholder option specified, use the first if it's blank\n                    return firstOption;\n                }\n            }\n        },\n\n        /**\n         * Get the desired width for the container element.  This is\n         * derived first from option `width` passed to select2, then\n         * the inline 'style' on the original element, and finally\n         * falls back to the jQuery calculated element width.\n         */\n        // abstract\n        initContainerWidth: function () {\n            function resolveContainerWidth() {\n                var style, attrs, matches, i, l, attr;\n\n                if (this.opts.width === \"off\") {\n                    return null;\n                } else if (this.opts.width === \"element\"){\n                    return this.opts.element.outerWidth(false) === 0 ? 'auto' : this.opts.element.outerWidth(false) + 'px';\n                } else if (this.opts.width === \"copy\" || this.opts.width === \"resolve\") {\n                    // check if there is inline style on the element that contains width\n                    style = this.opts.element.attr('style');\n                    if (style !== undefined) {\n                        attrs = style.split(';');\n                        for (i = 0, l = attrs.length; i < l; i = i + 1) {\n                            attr = attrs[i].replace(/\\s/g, '');\n                            matches = attr.match(/^width:(([-+]?([0-9]*\\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i);\n                            if (matches !== null && matches.length >= 1)\n                                return matches[1];\n                        }\n                    }\n\n                    if (this.opts.width === \"resolve\") {\n                        // next check if css('width') can resolve a width that is percent based, this is sometimes possible\n                        // when attached to input type=hidden or elements hidden via css\n                        style = this.opts.element.css('width');\n                        if (style.indexOf(\"%\") > 0) return style;\n\n                        // finally, fallback on the calculated width of the element\n                        return (this.opts.element.outerWidth(false) === 0 ? 'auto' : this.opts.element.outerWidth(false) + 'px');\n                    }\n\n                    return null;\n                } else if ($.isFunction(this.opts.width)) {\n                    return this.opts.width();\n                } else {\n                    return this.opts.width;\n               }\n            };\n\n            var width = resolveContainerWidth.call(this);\n            if (width !== null) {\n                this.container.css(\"width\", width);\n            }\n        }\n    });\n\n    SingleSelect2 = clazz(AbstractSelect2, {\n\n        // single\n\n        createContainer: function () {\n            var container = $(document.createElement(\"div\")).attr({\n                \"class\": \"select2-container\"\n            }).html([\n                \"<a href='javascript:void(0)' class='select2-choice' tabindex='-1'>\",\n                \"   <span class='select2-chosen'>&#160;</span><abbr class='select2-search-choice-close'></abbr>\",\n                \"   <span class='select2-arrow' role='presentation'><b role='presentation'></b></span>\",\n                \"</a>\",\n                \"<label for='' class='select2-offscreen'></label>\",\n                \"<input class='select2-focusser select2-offscreen' type='text' aria-haspopup='true' role='button' />\",\n                \"<div class='select2-drop select2-display-none'>\",\n                \"   <div class='select2-search'>\",\n                \"       <label for='' class='select2-offscreen'></label>\",\n                \"       <input type='text' autocomplete='off' autocorrect='off' autocapitalize='off' spellcheck='false' class='select2-input' role='combobox' aria-expanded='true'\",\n                \"       aria-autocomplete='list' />\",\n                \"   </div>\",\n                \"   <ul class='select2-results' role='listbox'>\",\n                \"   </ul>\",\n                \"</div>\"].join(\"\"));\n            return container;\n        },\n\n        // single\n        enableInterface: function() {\n            if (this.parent.enableInterface.apply(this, arguments)) {\n                this.focusser.prop(\"disabled\", !this.isInterfaceEnabled());\n            }\n        },\n\n        // single\n        opening: function () {\n            var el, range, len;\n\n            if (this.opts.minimumResultsForSearch >= 0) {\n                this.showSearch(true);\n            }\n\n            this.parent.opening.apply(this, arguments);\n\n            if (this.showSearchInput !== false) {\n                // IE appends focusser.val() at the end of field :/ so we manually insert it at the beginning using a range\n                // all other browsers handle this just fine\n\n                this.search.val(this.focusser.val());\n            }\n            if (this.opts.shouldFocusInput(this)) {\n                this.search.focus();\n                // move the cursor to the end after focussing, otherwise it will be at the beginning and\n                // new text will appear *before* focusser.val()\n                el = this.search.get(0);\n                if (el.createTextRange) {\n                    range = el.createTextRange();\n                    range.collapse(false);\n                    range.select();\n                } else if (el.setSelectionRange) {\n                    len = this.search.val().length;\n                    el.setSelectionRange(len, len);\n                }\n            }\n\n            // initializes search's value with nextSearchTerm (if defined by user)\n            // ignore nextSearchTerm if the dropdown is opened by the user pressing a letter\n            if(this.search.val() === \"\") {\n                if(this.nextSearchTerm != undefined){\n                    this.search.val(this.nextSearchTerm);\n                    this.search.select();\n                }\n            }\n\n            this.focusser.prop(\"disabled\", true).val(\"\");\n            this.updateResults(true);\n            this.opts.element.trigger($.Event(\"select2-open\"));\n        },\n\n        // single\n        close: function () {\n            if (!this.opened()) return;\n            this.parent.close.apply(this, arguments);\n\n            this.focusser.prop(\"disabled\", false);\n\n            if (this.opts.shouldFocusInput(this)) {\n                this.focusser.focus();\n            }\n        },\n\n        // single\n        focus: function () {\n            if (this.opened()) {\n                this.close();\n            } else {\n                this.focusser.prop(\"disabled\", false);\n                if (this.opts.shouldFocusInput(this)) {\n                    this.focusser.focus();\n                }\n            }\n        },\n\n        // single\n        isFocused: function () {\n            return this.container.hasClass(\"select2-container-active\");\n        },\n\n        // single\n        cancel: function () {\n            this.parent.cancel.apply(this, arguments);\n            this.focusser.prop(\"disabled\", false);\n\n            if (this.opts.shouldFocusInput(this)) {\n                this.focusser.focus();\n            }\n        },\n\n        // single\n        destroy: function() {\n            $(\"label[for='\" + this.focusser.attr('id') + \"']\")\n                .attr('for', this.opts.element.attr(\"id\"));\n            this.parent.destroy.apply(this, arguments);\n\n            cleanupJQueryElements.call(this,\n                \"selection\",\n                \"focusser\"\n            );\n        },\n\n        // single\n        initContainer: function () {\n\n            var selection,\n                container = this.container,\n                dropdown = this.dropdown,\n                idSuffix = nextUid(),\n                elementLabel;\n\n            if (this.opts.minimumResultsForSearch < 0) {\n                this.showSearch(false);\n            } else {\n                this.showSearch(true);\n            }\n\n            this.selection = selection = container.find(\".select2-choice\");\n\n            this.focusser = container.find(\".select2-focusser\");\n\n            // add aria associations\n            selection.find(\".select2-chosen\").attr(\"id\", \"select2-chosen-\"+idSuffix);\n            this.focusser.attr(\"aria-labelledby\", \"select2-chosen-\"+idSuffix);\n            this.results.attr(\"id\", \"select2-results-\"+idSuffix);\n            this.search.attr(\"aria-owns\", \"select2-results-\"+idSuffix);\n\n            // rewrite labels from original element to focusser\n            this.focusser.attr(\"id\", \"s2id_autogen\"+idSuffix);\n\n            elementLabel = $(\"label[for='\" + this.opts.element.attr(\"id\") + \"']\");\n\n            this.focusser.prev()\n                .text(elementLabel.text())\n                .attr('for', this.focusser.attr('id'));\n\n            // Ensure the original element retains an accessible name\n            var originalTitle = this.opts.element.attr(\"title\");\n            this.opts.element.attr(\"title\", (originalTitle || elementLabel.text()));\n\n            this.focusser.attr(\"tabindex\", this.elementTabIndex);\n\n            // write label for search field using the label from the focusser element\n            this.search.attr(\"id\", this.focusser.attr('id') + '_search');\n\n            this.search.prev()\n                .text($(\"label[for='\" + this.focusser.attr('id') + \"']\").text())\n                .attr('for', this.search.attr('id'));\n\n            this.search.on(\"keydown\", this.bind(function (e) {\n                if (!this.isInterfaceEnabled()) return;\n\n                // filter 229 keyCodes (input method editor is processing key input)\n                if (229 == e.keyCode) return;\n\n                if (e.which === KEY.PAGE_UP || e.which === KEY.PAGE_DOWN) {\n                    // prevent the page from scrolling\n                    killEvent(e);\n                    return;\n                }\n\n                switch (e.which) {\n                    case KEY.UP:\n                    case KEY.DOWN:\n                        this.moveHighlight((e.which === KEY.UP) ? -1 : 1);\n                        killEvent(e);\n                        return;\n                    case KEY.ENTER:\n                        this.selectHighlighted();\n                        killEvent(e);\n                        return;\n                    case KEY.TAB:\n                        this.selectHighlighted({noFocus: true});\n                        return;\n                    case KEY.ESC:\n                        this.cancel(e);\n                        killEvent(e);\n                        return;\n                }\n            }));\n\n            this.search.on(\"blur\", this.bind(function(e) {\n                // a workaround for chrome to keep the search field focussed when the scroll bar is used to scroll the dropdown.\n                // without this the search field loses focus which is annoying\n                if (document.activeElement === this.body.get(0)) {\n                    window.setTimeout(this.bind(function() {\n                        if (this.opened()) {\n                            this.search.focus();\n                        }\n                    }), 0);\n                }\n            }));\n\n            this.focusser.on(\"keydown\", this.bind(function (e) {\n                if (!this.isInterfaceEnabled()) return;\n\n                if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e) || e.which === KEY.ESC) {\n                    return;\n                }\n\n                if (this.opts.openOnEnter === false && e.which === KEY.ENTER) {\n                    killEvent(e);\n                    return;\n                }\n\n                if (e.which == KEY.DOWN || e.which == KEY.UP\n                    || (e.which == KEY.ENTER && this.opts.openOnEnter)) {\n\n                    if (e.altKey || e.ctrlKey || e.shiftKey || e.metaKey) return;\n\n                    this.open();\n                    killEvent(e);\n                    return;\n                }\n\n                if (e.which == KEY.DELETE || e.which == KEY.BACKSPACE) {\n                    if (this.opts.allowClear) {\n                        this.clear();\n                    }\n                    killEvent(e);\n                    return;\n                }\n            }));\n\n\n            installKeyUpChangeEvent(this.focusser);\n            this.focusser.on(\"keyup-change input\", this.bind(function(e) {\n                if (this.opts.minimumResultsForSearch >= 0) {\n                    e.stopPropagation();\n                    if (this.opened()) return;\n                    this.open();\n                }\n            }));\n\n            selection.on(\"mousedown touchstart\", \"abbr\", this.bind(function (e) {\n                if (!this.isInterfaceEnabled()) return;\n                this.clear();\n                killEventImmediately(e);\n                this.close();\n                this.selection.focus();\n            }));\n\n            selection.on(\"mousedown touchstart\", this.bind(function (e) {\n                // Prevent IE from generating a click event on the body\n                reinsertElement(selection);\n\n                if (!this.container.hasClass(\"select2-container-active\")) {\n                    this.opts.element.trigger($.Event(\"select2-focus\"));\n                }\n\n                if (this.opened()) {\n                    this.close();\n                } else if (this.isInterfaceEnabled()) {\n                    this.open();\n                }\n\n                killEvent(e);\n            }));\n\n            dropdown.on(\"mousedown touchstart\", this.bind(function() {\n                if (this.opts.shouldFocusInput(this)) {\n                    this.search.focus();\n                }\n            }));\n\n            selection.on(\"focus\", this.bind(function(e) {\n                killEvent(e);\n            }));\n\n            this.focusser.on(\"focus\", this.bind(function(){\n                if (!this.container.hasClass(\"select2-container-active\")) {\n                    this.opts.element.trigger($.Event(\"select2-focus\"));\n                }\n                this.container.addClass(\"select2-container-active\");\n            })).on(\"blur\", this.bind(function() {\n                if (!this.opened()) {\n                    this.container.removeClass(\"select2-container-active\");\n                    this.opts.element.trigger($.Event(\"select2-blur\"));\n                }\n            }));\n            this.search.on(\"focus\", this.bind(function(){\n                if (!this.container.hasClass(\"select2-container-active\")) {\n                    this.opts.element.trigger($.Event(\"select2-focus\"));\n                }\n                this.container.addClass(\"select2-container-active\");\n            }));\n\n            this.initContainerWidth();\n            this.opts.element.addClass(\"select2-offscreen\");\n            this.setPlaceholder();\n\n        },\n\n        // single\n        clear: function(triggerChange) {\n            var data=this.selection.data(\"select2-data\");\n            if (data) { // guard against queued quick consecutive clicks\n                var evt = $.Event(\"select2-clearing\");\n                this.opts.element.trigger(evt);\n                if (evt.isDefaultPrevented()) {\n                    return;\n                }\n                var placeholderOption = this.getPlaceholderOption();\n                this.opts.element.val(placeholderOption ? placeholderOption.val() : \"\");\n                this.selection.find(\".select2-chosen\").empty();\n                this.selection.removeData(\"select2-data\");\n                this.setPlaceholder();\n\n                if (triggerChange !== false){\n                    this.opts.element.trigger({ type: \"select2-removed\", val: this.id(data), choice: data });\n                    this.triggerChange({removed:data});\n                }\n            }\n        },\n\n        /**\n         * Sets selection based on source element's value\n         */\n        // single\n        initSelection: function () {\n            var selected;\n            if (this.isPlaceholderOptionSelected()) {\n                this.updateSelection(null);\n                this.close();\n                this.setPlaceholder();\n            } else {\n                var self = this;\n                this.opts.initSelection.call(null, this.opts.element, function(selected){\n                    if (selected !== undefined && selected !== null) {\n                        self.updateSelection(selected);\n                        self.close();\n                        self.setPlaceholder();\n                        self.nextSearchTerm = self.opts.nextSearchTerm(selected, self.search.val());\n                    }\n                });\n            }\n        },\n\n        isPlaceholderOptionSelected: function() {\n            var placeholderOption;\n            if (this.getPlaceholder() === undefined) return false; // no placeholder specified so no option should be considered\n            return ((placeholderOption = this.getPlaceholderOption()) !== undefined && placeholderOption.prop(\"selected\"))\n                || (this.opts.element.val() === \"\")\n                || (this.opts.element.val() === undefined)\n                || (this.opts.element.val() === null);\n        },\n\n        // single\n        prepareOpts: function () {\n            var opts = this.parent.prepareOpts.apply(this, arguments),\n                self=this;\n\n            if (opts.element.get(0).tagName.toLowerCase() === \"select\") {\n                // install the selection initializer\n                opts.initSelection = function (element, callback) {\n                    var selected = element.find(\"option\").filter(function() { return this.selected && !this.disabled });\n                    // a single select box always has a value, no need to null check 'selected'\n                    callback(self.optionToData(selected));\n                };\n            } else if (\"data\" in opts) {\n                // install default initSelection when applied to hidden input and data is local\n                opts.initSelection = opts.initSelection || function (element, callback) {\n                    var id = element.val();\n                    //search in data by id, storing the actual matching item\n                    var match = null;\n                    opts.query({\n                        matcher: function(term, text, el){\n                            var is_match = equal(id, opts.id(el));\n                            if (is_match) {\n                                match = el;\n                            }\n                            return is_match;\n                        },\n                        callback: !$.isFunction(callback) ? $.noop : function() {\n                            callback(match);\n                        }\n                    });\n                };\n            }\n\n            return opts;\n        },\n\n        // single\n        getPlaceholder: function() {\n            // if a placeholder is specified on a single select without a valid placeholder option ignore it\n            if (this.select) {\n                if (this.getPlaceholderOption() === undefined) {\n                    return undefined;\n                }\n            }\n\n            return this.parent.getPlaceholder.apply(this, arguments);\n        },\n\n        // single\n        setPlaceholder: function () {\n            var placeholder = this.getPlaceholder();\n\n            if (this.isPlaceholderOptionSelected() && placeholder !== undefined) {\n\n                // check for a placeholder option if attached to a select\n                if (this.select && this.getPlaceholderOption() === undefined) return;\n\n                this.selection.find(\".select2-chosen\").html(this.opts.escapeMarkup(placeholder));\n\n                this.selection.addClass(\"select2-default\");\n\n                this.container.removeClass(\"select2-allowclear\");\n            }\n        },\n\n        // single\n        postprocessResults: function (data, initial, noHighlightUpdate) {\n            var selected = 0, self = this, showSearchInput = true;\n\n            // find the selected element in the result list\n\n            this.findHighlightableChoices().each2(function (i, elm) {\n                if (equal(self.id(elm.data(\"select2-data\")), self.opts.element.val())) {\n                    selected = i;\n                    return false;\n                }\n            });\n\n            // and highlight it\n            if (noHighlightUpdate !== false) {\n                if (initial === true && selected >= 0) {\n                    this.highlight(selected);\n                } else {\n                    this.highlight(0);\n                }\n            }\n\n            // hide the search box if this is the first we got the results and there are enough of them for search\n\n            if (initial === true) {\n                var min = this.opts.minimumResultsForSearch;\n                if (min >= 0) {\n                    this.showSearch(countResults(data.results) >= min);\n                }\n            }\n        },\n\n        // single\n        showSearch: function(showSearchInput) {\n            if (this.showSearchInput === showSearchInput) return;\n\n            this.showSearchInput = showSearchInput;\n\n            this.dropdown.find(\".select2-search\").toggleClass(\"select2-search-hidden\", !showSearchInput);\n            this.dropdown.find(\".select2-search\").toggleClass(\"select2-offscreen\", !showSearchInput);\n            //add \"select2-with-searchbox\" to the container if search box is shown\n            $(this.dropdown, this.container).toggleClass(\"select2-with-searchbox\", showSearchInput);\n        },\n\n        // single\n        onSelect: function (data, options) {\n\n            if (!this.triggerSelect(data)) { return; }\n\n            var old = this.opts.element.val(),\n                oldData = this.data();\n\n            this.opts.element.val(this.id(data));\n            this.updateSelection(data);\n\n            this.opts.element.trigger({ type: \"select2-selected\", val: this.id(data), choice: data });\n\n            this.nextSearchTerm = this.opts.nextSearchTerm(data, this.search.val());\n            this.close();\n\n            if ((!options || !options.noFocus) && this.opts.shouldFocusInput(this)) {\n                this.focusser.focus();\n            }\n\n            if (!equal(old, this.id(data))) {\n                this.triggerChange({ added: data, removed: oldData });\n            }\n        },\n\n        // single\n        updateSelection: function (data) {\n\n            var container=this.selection.find(\".select2-chosen\"), formatted, cssClass;\n\n            this.selection.data(\"select2-data\", data);\n\n            container.empty();\n            if (data !== null) {\n                formatted=this.opts.formatSelection(data, container, this.opts.escapeMarkup);\n            }\n            if (formatted !== undefined) {\n                container.append(formatted);\n            }\n            cssClass=this.opts.formatSelectionCssClass(data, container);\n            if (cssClass !== undefined) {\n                container.addClass(cssClass);\n            }\n\n            this.selection.removeClass(\"select2-default\");\n\n            if (this.opts.allowClear && this.getPlaceholder() !== undefined) {\n                this.container.addClass(\"select2-allowclear\");\n            }\n        },\n\n        // single\n        val: function () {\n            var val,\n                triggerChange = false,\n                data = null,\n                self = this,\n                oldData = this.data();\n\n            if (arguments.length === 0) {\n                return this.opts.element.val();\n            }\n\n            val = arguments[0];\n\n            if (arguments.length > 1) {\n                triggerChange = arguments[1];\n            }\n\n            if (this.select) {\n                this.select\n                    .val(val)\n                    .find(\"option\").filter(function() { return this.selected }).each2(function (i, elm) {\n                        data = self.optionToData(elm);\n                        return false;\n                    });\n                this.updateSelection(data);\n                this.setPlaceholder();\n                if (triggerChange) {\n                    this.triggerChange({added: data, removed:oldData});\n                }\n            } else {\n                // val is an id. !val is true for [undefined,null,'',0] - 0 is legal\n                if (!val && val !== 0) {\n                    this.clear(triggerChange);\n                    return;\n                }\n                if (this.opts.initSelection === undefined) {\n                    throw new Error(\"cannot call val() if initSelection() is not defined\");\n                }\n                this.opts.element.val(val);\n                this.opts.initSelection(this.opts.element, function(data){\n                    self.opts.element.val(!data ? \"\" : self.id(data));\n                    self.updateSelection(data);\n                    self.setPlaceholder();\n                    if (triggerChange) {\n                        self.triggerChange({added: data, removed:oldData});\n                    }\n                });\n            }\n        },\n\n        // single\n        clearSearch: function () {\n            this.search.val(\"\");\n            this.focusser.val(\"\");\n        },\n\n        // single\n        data: function(value) {\n            var data,\n                triggerChange = false;\n\n            if (arguments.length === 0) {\n                data = this.selection.data(\"select2-data\");\n                if (data == undefined) data = null;\n                return data;\n            } else {\n                if (arguments.length > 1) {\n                    triggerChange = arguments[1];\n                }\n                if (!value) {\n                    this.clear(triggerChange);\n                } else {\n                    data = this.data();\n                    this.opts.element.val(!value ? \"\" : this.id(value));\n                    this.updateSelection(value);\n                    if (triggerChange) {\n                        this.triggerChange({added: value, removed:data});\n                    }\n                }\n            }\n        }\n    });\n\n    MultiSelect2 = clazz(AbstractSelect2, {\n\n        // multi\n        createContainer: function () {\n            var container = $(document.createElement(\"div\")).attr({\n                \"class\": \"select2-container select2-container-multi\"\n            }).html([\n                \"<ul class='select2-choices'>\",\n                \"  <li class='select2-search-field'>\",\n                \"    <label for='' class='select2-offscreen'></label>\",\n                \"    <input type='text' autocomplete='off' autocorrect='off' autocapitalize='off' spellcheck='false' class='select2-input'>\",\n                \"  </li>\",\n                \"</ul>\",\n                \"<div class='select2-drop select2-drop-multi select2-display-none'>\",\n                \"   <ul class='select2-results'>\",\n                \"   </ul>\",\n                \"</div>\"].join(\"\"));\n            return container;\n        },\n\n        // multi\n        prepareOpts: function () {\n            var opts = this.parent.prepareOpts.apply(this, arguments),\n                self=this;\n\n            // TODO validate placeholder is a string if specified\n\n            if (opts.element.get(0).tagName.toLowerCase() === \"select\") {\n                // install the selection initializer\n                opts.initSelection = function (element, callback) {\n\n                    var data = [];\n\n                    element.find(\"option\").filter(function() { return this.selected && !this.disabled }).each2(function (i, elm) {\n                        data.push(self.optionToData(elm));\n                    });\n                    callback(data);\n                };\n            } else if (\"data\" in opts) {\n                // install default initSelection when applied to hidden input and data is local\n                opts.initSelection = opts.initSelection || function (element, callback) {\n                    var ids = splitVal(element.val(), opts.separator);\n                    //search in data by array of ids, storing matching items in a list\n                    var matches = [];\n                    opts.query({\n                        matcher: function(term, text, el){\n                            var is_match = $.grep(ids, function(id) {\n                                return equal(id, opts.id(el));\n                            }).length;\n                            if (is_match) {\n                                matches.push(el);\n                            }\n                            return is_match;\n                        },\n                        callback: !$.isFunction(callback) ? $.noop : function() {\n                            // reorder matches based on the order they appear in the ids array because right now\n                            // they are in the order in which they appear in data array\n                            var ordered = [];\n                            for (var i = 0; i < ids.length; i++) {\n                                var id = ids[i];\n                                for (var j = 0; j < matches.length; j++) {\n                                    var match = matches[j];\n                                    if (equal(id, opts.id(match))) {\n                                        ordered.push(match);\n                                        matches.splice(j, 1);\n                                        break;\n                                    }\n                                }\n                            }\n                            callback(ordered);\n                        }\n                    });\n                };\n            }\n\n            return opts;\n        },\n\n        // multi\n        selectChoice: function (choice) {\n\n            var selected = this.container.find(\".select2-search-choice-focus\");\n            if (selected.length && choice && choice[0] == selected[0]) {\n\n            } else {\n                if (selected.length) {\n                    this.opts.element.trigger(\"choice-deselected\", selected);\n                }\n                selected.removeClass(\"select2-search-choice-focus\");\n                if (choice && choice.length) {\n                    this.close();\n                    choice.addClass(\"select2-search-choice-focus\");\n                    this.opts.element.trigger(\"choice-selected\", choice);\n                }\n            }\n        },\n\n        // multi\n        destroy: function() {\n            $(\"label[for='\" + this.search.attr('id') + \"']\")\n                .attr('for', this.opts.element.attr(\"id\"));\n            this.parent.destroy.apply(this, arguments);\n\n            cleanupJQueryElements.call(this,\n                \"searchContainer\",\n                \"selection\"\n            );\n        },\n\n        // multi\n        initContainer: function () {\n\n            var selector = \".select2-choices\", selection;\n\n            this.searchContainer = this.container.find(\".select2-search-field\");\n            this.selection = selection = this.container.find(selector);\n\n            var _this = this;\n            this.selection.on(\"click\", \".select2-search-choice:not(.select2-locked)\", function (e) {\n                //killEvent(e);\n                _this.search[0].focus();\n                _this.selectChoice($(this));\n            });\n\n            // rewrite labels from original element to focusser\n            this.search.attr(\"id\", \"s2id_autogen\"+nextUid());\n\n            this.search.prev()\n                .text($(\"label[for='\" + this.opts.element.attr(\"id\") + \"']\").text())\n                .attr('for', this.search.attr('id'));\n\n            this.search.on(\"input paste\", this.bind(function() {\n                if (this.search.attr('placeholder') && this.search.val().length == 0) return;\n                if (!this.isInterfaceEnabled()) return;\n                if (!this.opened()) {\n                    this.open();\n                }\n            }));\n\n            this.search.attr(\"tabindex\", this.elementTabIndex);\n\n            this.keydowns = 0;\n            this.search.on(\"keydown\", this.bind(function (e) {\n                if (!this.isInterfaceEnabled()) return;\n\n                ++this.keydowns;\n                var selected = selection.find(\".select2-search-choice-focus\");\n                var prev = selected.prev(\".select2-search-choice:not(.select2-locked)\");\n                var next = selected.next(\".select2-search-choice:not(.select2-locked)\");\n                var pos = getCursorInfo(this.search);\n\n                if (selected.length &&\n                    (e.which == KEY.LEFT || e.which == KEY.RIGHT || e.which == KEY.BACKSPACE || e.which == KEY.DELETE || e.which == KEY.ENTER)) {\n                    var selectedChoice = selected;\n                    if (e.which == KEY.LEFT && prev.length) {\n                        selectedChoice = prev;\n                    }\n                    else if (e.which == KEY.RIGHT) {\n                        selectedChoice = next.length ? next : null;\n                    }\n                    else if (e.which === KEY.BACKSPACE) {\n                        if (this.unselect(selected.first())) {\n                            this.search.width(10);\n                            selectedChoice = prev.length ? prev : next;\n                        }\n                    } else if (e.which == KEY.DELETE) {\n                        if (this.unselect(selected.first())) {\n                            this.search.width(10);\n                            selectedChoice = next.length ? next : null;\n                        }\n                    } else if (e.which == KEY.ENTER) {\n                        selectedChoice = null;\n                    }\n\n                    this.selectChoice(selectedChoice);\n                    killEvent(e);\n                    if (!selectedChoice || !selectedChoice.length) {\n                        this.open();\n                    }\n                    return;\n                } else if (((e.which === KEY.BACKSPACE && this.keydowns == 1)\n                    || e.which == KEY.LEFT) && (pos.offset == 0 && !pos.length)) {\n\n                    this.selectChoice(selection.find(\".select2-search-choice:not(.select2-locked)\").last());\n                    killEvent(e);\n                    return;\n                } else {\n                    this.selectChoice(null);\n                }\n\n                if (this.opened()) {\n                    switch (e.which) {\n                    case KEY.UP:\n                    case KEY.DOWN:\n                        this.moveHighlight((e.which === KEY.UP) ? -1 : 1);\n                        killEvent(e);\n                        return;\n                    case KEY.ENTER:\n                        this.selectHighlighted();\n                        killEvent(e);\n                        return;\n                    case KEY.TAB:\n                        this.selectHighlighted({noFocus:true});\n                        this.close();\n                        return;\n                    case KEY.ESC:\n                        this.cancel(e);\n                        killEvent(e);\n                        return;\n                    }\n                }\n\n                if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e)\n                 || e.which === KEY.BACKSPACE || e.which === KEY.ESC) {\n                    return;\n                }\n\n                if (e.which === KEY.ENTER) {\n                    if (this.opts.openOnEnter === false) {\n                        return;\n                    } else if (e.altKey || e.ctrlKey || e.shiftKey || e.metaKey) {\n                        return;\n                    }\n                }\n\n                this.open();\n\n                if (e.which === KEY.PAGE_UP || e.which === KEY.PAGE_DOWN) {\n                    // prevent the page from scrolling\n                    killEvent(e);\n                }\n\n                if (e.which === KEY.ENTER) {\n                    // prevent form from being submitted\n                    killEvent(e);\n                }\n\n            }));\n\n            this.search.on(\"keyup\", this.bind(function (e) {\n                this.keydowns = 0;\n                this.resizeSearch();\n            })\n            );\n\n            this.search.on(\"blur\", this.bind(function(e) {\n                this.container.removeClass(\"select2-container-active\");\n                this.search.removeClass(\"select2-focused\");\n                this.selectChoice(null);\n                if (!this.opened()) this.clearSearch();\n                e.stopImmediatePropagation();\n                this.opts.element.trigger($.Event(\"select2-blur\"));\n            }));\n\n            this.container.on(\"click\", selector, this.bind(function (e) {\n                if (!this.isInterfaceEnabled()) return;\n                if ($(e.target).closest(\".select2-search-choice\").length > 0) {\n                    // clicked inside a select2 search choice, do not open\n                    return;\n                }\n                this.selectChoice(null);\n                this.clearPlaceholder();\n                if (!this.container.hasClass(\"select2-container-active\")) {\n                    this.opts.element.trigger($.Event(\"select2-focus\"));\n                }\n                this.open();\n                this.focusSearch();\n                e.preventDefault();\n            }));\n\n            this.container.on(\"focus\", selector, this.bind(function () {\n                if (!this.isInterfaceEnabled()) return;\n                if (!this.container.hasClass(\"select2-container-active\")) {\n                    this.opts.element.trigger($.Event(\"select2-focus\"));\n                }\n                this.container.addClass(\"select2-container-active\");\n                this.dropdown.addClass(\"select2-drop-active\");\n                this.clearPlaceholder();\n            }));\n\n            this.initContainerWidth();\n            this.opts.element.addClass(\"select2-offscreen\");\n\n            // set the placeholder if necessary\n            this.clearSearch();\n        },\n\n        // multi\n        enableInterface: function() {\n            if (this.parent.enableInterface.apply(this, arguments)) {\n                this.search.prop(\"disabled\", !this.isInterfaceEnabled());\n            }\n        },\n\n        // multi\n        initSelection: function () {\n            var data;\n            if (this.opts.element.val() === \"\" && this.opts.element.text() === \"\") {\n                this.updateSelection([]);\n                this.close();\n                // set the placeholder if necessary\n                this.clearSearch();\n            }\n            if (this.select || this.opts.element.val() !== \"\") {\n                var self = this;\n                this.opts.initSelection.call(null, this.opts.element, function(data){\n                    if (data !== undefined && data !== null) {\n                        self.updateSelection(data);\n                        self.close();\n                        // set the placeholder if necessary\n                        self.clearSearch();\n                    }\n                });\n            }\n        },\n\n        // multi\n        clearSearch: function () {\n            var placeholder = this.getPlaceholder(),\n                maxWidth = this.getMaxSearchWidth();\n\n            if (placeholder !== undefined  && this.getVal().length === 0 && this.search.hasClass(\"select2-focused\") === false) {\n                this.search.val(placeholder).addClass(\"select2-default\");\n                // stretch the search box to full width of the container so as much of the placeholder is visible as possible\n                // we could call this.resizeSearch(), but we do not because that requires a sizer and we do not want to create one so early because of a firefox bug, see #944\n                this.search.width(maxWidth > 0 ? maxWidth : this.container.css(\"width\"));\n            } else {\n                this.search.val(\"\").width(10);\n            }\n        },\n\n        // multi\n        clearPlaceholder: function () {\n            if (this.search.hasClass(\"select2-default\")) {\n                this.search.val(\"\").removeClass(\"select2-default\");\n            }\n        },\n\n        // multi\n        opening: function () {\n            this.clearPlaceholder(); // should be done before super so placeholder is not used to search\n            this.resizeSearch();\n\n            this.parent.opening.apply(this, arguments);\n\n            this.focusSearch();\n\n            // initializes search's value with nextSearchTerm (if defined by user)\n            // ignore nextSearchTerm if the dropdown is opened by the user pressing a letter\n            if(this.search.val() === \"\") {\n                if(this.nextSearchTerm != undefined){\n                    this.search.val(this.nextSearchTerm);\n                    this.search.select();\n                }\n            }\n\n            this.updateResults(true);\n            if (this.opts.shouldFocusInput(this)) {\n                this.search.focus();\n            }\n            this.opts.element.trigger($.Event(\"select2-open\"));\n        },\n\n        // multi\n        close: function () {\n            if (!this.opened()) return;\n            this.parent.close.apply(this, arguments);\n        },\n\n        // multi\n        focus: function () {\n            this.close();\n            this.search.focus();\n        },\n\n        // multi\n        isFocused: function () {\n            return this.search.hasClass(\"select2-focused\");\n        },\n\n        // multi\n        updateSelection: function (data) {\n            var ids = [], filtered = [], self = this;\n\n            // filter out duplicates\n            $(data).each(function () {\n                if (indexOf(self.id(this), ids) < 0) {\n                    ids.push(self.id(this));\n                    filtered.push(this);\n                }\n            });\n            data = filtered;\n\n            this.selection.find(\".select2-search-choice\").remove();\n            $(data).each(function () {\n                self.addSelectedChoice(this);\n            });\n            self.postprocessResults();\n        },\n\n        // multi\n        tokenize: function() {\n            var input = this.search.val();\n            input = this.opts.tokenizer.call(this, input, this.data(), this.bind(this.onSelect), this.opts);\n            if (input != null && input != undefined) {\n                this.search.val(input);\n                if (input.length > 0) {\n                    this.open();\n                }\n            }\n\n        },\n\n        // multi\n        onSelect: function (data, options) {\n\n            if (!this.triggerSelect(data) || data.text === \"\") { return; }\n\n            this.addSelectedChoice(data);\n\n            this.opts.element.trigger({ type: \"selected\", val: this.id(data), choice: data });\n\n            // keep track of the search's value before it gets cleared\n            this.nextSearchTerm = this.opts.nextSearchTerm(data, this.search.val());\n\n            this.clearSearch();\n            this.updateResults();\n\n            if (this.select || !this.opts.closeOnSelect) this.postprocessResults(data, false, this.opts.closeOnSelect===true);\n\n            if (this.opts.closeOnSelect) {\n                this.close();\n                this.search.width(10);\n            } else {\n                if (this.countSelectableResults()>0) {\n                    this.search.width(10);\n                    this.resizeSearch();\n                    if (this.getMaximumSelectionSize() > 0 && this.val().length >= this.getMaximumSelectionSize()) {\n                        // if we reached max selection size repaint the results so choices\n                        // are replaced with the max selection reached message\n                        this.updateResults(true);\n                    } else {\n                        // initializes search's value with nextSearchTerm and update search result\n                        if(this.nextSearchTerm != undefined){\n                            this.search.val(this.nextSearchTerm);\n                            this.updateResults();\n                            this.search.select();\n                        }\n                    }\n                    this.positionDropdown();\n                } else {\n                    // if nothing left to select close\n                    this.close();\n                    this.search.width(10);\n                }\n            }\n\n            // since its not possible to select an element that has already been\n            // added we do not need to check if this is a new element before firing change\n            this.triggerChange({ added: data });\n\n            if (!options || !options.noFocus)\n                this.focusSearch();\n        },\n\n        // multi\n        cancel: function () {\n            this.close();\n            this.focusSearch();\n        },\n\n        addSelectedChoice: function (data) {\n            var enableChoice = !data.locked,\n                enabledItem = $(\n                    \"<li class='select2-search-choice'>\" +\n                    \"    <div></div>\" +\n                    \"    <a href='#' class='select2-search-choice-close' tabindex='-1'></a>\" +\n                    \"</li>\"),\n                disabledItem = $(\n                    \"<li class='select2-search-choice select2-locked'>\" +\n                    \"<div></div>\" +\n                    \"</li>\");\n            var choice = enableChoice ? enabledItem : disabledItem,\n                id = this.id(data),\n                val = this.getVal(),\n                formatted,\n                cssClass;\n\n            formatted=this.opts.formatSelection(data, choice.find(\"div\"), this.opts.escapeMarkup);\n            if (formatted != undefined) {\n                choice.find(\"div\").replaceWith(\"<div>\"+formatted+\"</div>\");\n            }\n            cssClass=this.opts.formatSelectionCssClass(data, choice.find(\"div\"));\n            if (cssClass != undefined) {\n                choice.addClass(cssClass);\n            }\n\n            if(enableChoice){\n              choice.find(\".select2-search-choice-close\")\n                  .on(\"mousedown\", killEvent)\n                  .on(\"click dblclick\", this.bind(function (e) {\n                  if (!this.isInterfaceEnabled()) return;\n\n                  this.unselect($(e.target));\n                  this.selection.find(\".select2-search-choice-focus\").removeClass(\"select2-search-choice-focus\");\n                  killEvent(e);\n                  this.close();\n                  this.focusSearch();\n              })).on(\"focus\", this.bind(function () {\n                  if (!this.isInterfaceEnabled()) return;\n                  this.container.addClass(\"select2-container-active\");\n                  this.dropdown.addClass(\"select2-drop-active\");\n              }));\n            }\n\n            choice.data(\"select2-data\", data);\n            choice.insertBefore(this.searchContainer);\n\n            val.push(id);\n            this.setVal(val);\n        },\n\n        // multi\n        unselect: function (selected) {\n            var val = this.getVal(),\n                data,\n                index;\n            selected = selected.closest(\".select2-search-choice\");\n\n            if (selected.length === 0) {\n                throw \"Invalid argument: \" + selected + \". Must be .select2-search-choice\";\n            }\n\n            data = selected.data(\"select2-data\");\n\n            if (!data) {\n                // prevent a race condition when the 'x' is clicked really fast repeatedly the event can be queued\n                // and invoked on an element already removed\n                return;\n            }\n\n            var evt = $.Event(\"select2-removing\");\n            evt.val = this.id(data);\n            evt.choice = data;\n            this.opts.element.trigger(evt);\n\n            if (evt.isDefaultPrevented()) {\n                return false;\n            }\n\n            while((index = indexOf(this.id(data), val)) >= 0) {\n                val.splice(index, 1);\n                this.setVal(val);\n                if (this.select) this.postprocessResults();\n            }\n\n            selected.remove();\n\n            this.opts.element.trigger({ type: \"select2-removed\", val: this.id(data), choice: data });\n            this.triggerChange({ removed: data });\n\n            return true;\n        },\n\n        // multi\n        postprocessResults: function (data, initial, noHighlightUpdate) {\n            var val = this.getVal(),\n                choices = this.results.find(\".select2-result\"),\n                compound = this.results.find(\".select2-result-with-children\"),\n                self = this;\n\n            choices.each2(function (i, choice) {\n                var id = self.id(choice.data(\"select2-data\"));\n                if (indexOf(id, val) >= 0) {\n                    choice.addClass(\"select2-selected\");\n                    // mark all children of the selected parent as selected\n                    choice.find(\".select2-result-selectable\").addClass(\"select2-selected\");\n                }\n            });\n\n            compound.each2(function(i, choice) {\n                // hide an optgroup if it doesn't have any selectable children\n                if (!choice.is('.select2-result-selectable')\n                    && choice.find(\".select2-result-selectable:not(.select2-selected)\").length === 0) {\n                    choice.addClass(\"select2-selected\");\n                }\n            });\n\n            if (this.highlight() == -1 && noHighlightUpdate !== false){\n                self.highlight(0);\n            }\n\n            //If all results are chosen render formatNoMatches\n            if(!this.opts.createSearchChoice && !choices.filter('.select2-result:not(.select2-selected)').length > 0){\n                if(!data || data && !data.more && this.results.find(\".select2-no-results\").length === 0) {\n                    if (checkFormatter(self.opts.formatNoMatches, \"formatNoMatches\")) {\n                        this.results.append(\"<li class='select2-no-results'>\" + evaluate(self.opts.formatNoMatches, self.opts.element, self.search.val()) + \"</li>\");\n                    }\n                }\n            }\n\n        },\n\n        // multi\n        getMaxSearchWidth: function() {\n            return this.selection.width() - getSideBorderPadding(this.search);\n        },\n\n        // multi\n        resizeSearch: function () {\n            var minimumWidth, left, maxWidth, containerLeft, searchWidth,\n                sideBorderPadding = getSideBorderPadding(this.search);\n\n            minimumWidth = measureTextWidth(this.search) + 10;\n\n            left = this.search.offset().left;\n\n            maxWidth = this.selection.width();\n            containerLeft = this.selection.offset().left;\n\n            searchWidth = maxWidth - (left - containerLeft) - sideBorderPadding;\n\n            if (searchWidth < minimumWidth) {\n                searchWidth = maxWidth - sideBorderPadding;\n            }\n\n            if (searchWidth < 40) {\n                searchWidth = maxWidth - sideBorderPadding;\n            }\n\n            if (searchWidth <= 0) {\n              searchWidth = minimumWidth;\n            }\n\n            this.search.width(Math.floor(searchWidth));\n        },\n\n        // multi\n        getVal: function () {\n            var val;\n            if (this.select) {\n                val = this.select.val();\n                return val === null ? [] : val;\n            } else {\n                val = this.opts.element.val();\n                return splitVal(val, this.opts.separator);\n            }\n        },\n\n        // multi\n        setVal: function (val) {\n            var unique;\n            if (this.select) {\n                this.select.val(val);\n            } else {\n                unique = [];\n                // filter out duplicates\n                $(val).each(function () {\n                    if (indexOf(this, unique) < 0) unique.push(this);\n                });\n                this.opts.element.val(unique.length === 0 ? \"\" : unique.join(this.opts.separator));\n            }\n        },\n\n        // multi\n        buildChangeDetails: function (old, current) {\n            var current = current.slice(0),\n                old = old.slice(0);\n\n            // remove intersection from each array\n            for (var i = 0; i < current.length; i++) {\n                for (var j = 0; j < old.length; j++) {\n                    if (equal(this.opts.id(current[i]), this.opts.id(old[j]))) {\n                        current.splice(i, 1);\n                        if(i>0){\n                        \ti--;\n                        }\n                        old.splice(j, 1);\n                        j--;\n                    }\n                }\n            }\n\n            return {added: current, removed: old};\n        },\n\n\n        // multi\n        val: function (val, triggerChange) {\n            var oldData, self=this;\n\n            if (arguments.length === 0) {\n                return this.getVal();\n            }\n\n            oldData=this.data();\n            if (!oldData.length) oldData=[];\n\n            // val is an id. !val is true for [undefined,null,'',0] - 0 is legal\n            if (!val && val !== 0) {\n                this.opts.element.val(\"\");\n                this.updateSelection([]);\n                this.clearSearch();\n                if (triggerChange) {\n                    this.triggerChange({added: this.data(), removed: oldData});\n                }\n                return;\n            }\n\n            // val is a list of ids\n            this.setVal(val);\n\n            if (this.select) {\n                this.opts.initSelection(this.select, this.bind(this.updateSelection));\n                if (triggerChange) {\n                    this.triggerChange(this.buildChangeDetails(oldData, this.data()));\n                }\n            } else {\n                if (this.opts.initSelection === undefined) {\n                    throw new Error(\"val() cannot be called if initSelection() is not defined\");\n                }\n\n                this.opts.initSelection(this.opts.element, function(data){\n                    var ids=$.map(data, self.id);\n                    self.setVal(ids);\n                    self.updateSelection(data);\n                    self.clearSearch();\n                    if (triggerChange) {\n                        self.triggerChange(self.buildChangeDetails(oldData, self.data()));\n                    }\n                });\n            }\n            this.clearSearch();\n        },\n\n        // multi\n        onSortStart: function() {\n            if (this.select) {\n                throw new Error(\"Sorting of elements is not supported when attached to <select>. Attach to <input type='hidden'/> instead.\");\n            }\n\n            // collapse search field into 0 width so its container can be collapsed as well\n            this.search.width(0);\n            // hide the container\n            this.searchContainer.hide();\n        },\n\n        // multi\n        onSortEnd:function() {\n\n            var val=[], self=this;\n\n            // show search and move it to the end of the list\n            this.searchContainer.show();\n            // make sure the search container is the last item in the list\n            this.searchContainer.appendTo(this.searchContainer.parent());\n            // since we collapsed the width in dragStarted, we resize it here\n            this.resizeSearch();\n\n            // update selection\n            this.selection.find(\".select2-search-choice\").each(function() {\n                val.push(self.opts.id($(this).data(\"select2-data\")));\n            });\n            this.setVal(val);\n            this.triggerChange();\n        },\n\n        // multi\n        data: function(values, triggerChange) {\n            var self=this, ids, old;\n            if (arguments.length === 0) {\n                 return this.selection\n                     .children(\".select2-search-choice\")\n                     .map(function() { return $(this).data(\"select2-data\"); })\n                     .get();\n            } else {\n                old = this.data();\n                if (!values) { values = []; }\n                ids = $.map(values, function(e) { return self.opts.id(e); });\n                this.setVal(ids);\n                this.updateSelection(values);\n                this.clearSearch();\n                if (triggerChange) {\n                    this.triggerChange(this.buildChangeDetails(old, this.data()));\n                }\n            }\n        }\n    });\n\n    $.fn.select2 = function () {\n\n        var args = Array.prototype.slice.call(arguments, 0),\n            opts,\n            select2,\n            method, value, multiple,\n            allowedMethods = [\"val\", \"destroy\", \"opened\", \"open\", \"close\", \"focus\", \"isFocused\", \"container\", \"dropdown\", \"onSortStart\", \"onSortEnd\", \"enable\", \"disable\", \"readonly\", \"positionDropdown\", \"data\", \"search\"],\n            valueMethods = [\"opened\", \"isFocused\", \"container\", \"dropdown\"],\n            propertyMethods = [\"val\", \"data\"],\n            methodsMap = { search: \"externalSearch\" };\n\n        this.each(function () {\n            if (args.length === 0 || typeof(args[0]) === \"object\") {\n                opts = args.length === 0 ? {} : $.extend({}, args[0]);\n                opts.element = $(this);\n\n                if (opts.element.get(0).tagName.toLowerCase() === \"select\") {\n                    multiple = opts.element.prop(\"multiple\");\n                } else {\n                    multiple = opts.multiple || false;\n                    if (\"tags\" in opts) {opts.multiple = multiple = true;}\n                }\n\n                select2 = multiple ? new window.Select2[\"class\"].multi() : new window.Select2[\"class\"].single();\n                select2.init(opts);\n            } else if (typeof(args[0]) === \"string\") {\n\n                if (indexOf(args[0], allowedMethods) < 0) {\n                    throw \"Unknown method: \" + args[0];\n                }\n\n                value = undefined;\n                select2 = $(this).data(\"select2\");\n                if (select2 === undefined) return;\n\n                method=args[0];\n\n                if (method === \"container\") {\n                    value = select2.container;\n                } else if (method === \"dropdown\") {\n                    value = select2.dropdown;\n                } else {\n                    if (methodsMap[method]) method = methodsMap[method];\n\n                    value = select2[method].apply(select2, args.slice(1));\n                }\n                if (indexOf(args[0], valueMethods) >= 0\n                    || (indexOf(args[0], propertyMethods) >= 0 && args.length == 1)) {\n                    return false; // abort the iteration, ready to return first matched value\n                }\n            } else {\n                throw \"Invalid arguments to select2 plugin: \" + args;\n            }\n        });\n        return (value === undefined) ? this : value;\n    };\n\n    // plugin defaults, accessible to users\n    $.fn.select2.defaults = {\n        width: \"copy\",\n        loadMorePadding: 0,\n        closeOnSelect: true,\n        openOnEnter: true,\n        containerCss: {},\n        dropdownCss: {},\n        containerCssClass: \"\",\n        dropdownCssClass: \"\",\n        formatResult: function(result, container, query, escapeMarkup) {\n            var markup=[];\n            markMatch(result.text, query.term, markup, escapeMarkup);\n            return markup.join(\"\");\n        },\n        formatSelection: function (data, container, escapeMarkup) {\n            return data ? escapeMarkup(data.text) : undefined;\n        },\n        sortResults: function (results, container, query) {\n            return results;\n        },\n        formatResultCssClass: function(data) {return data.css;},\n        formatSelectionCssClass: function(data, container) {return undefined;},\n        minimumResultsForSearch: 0,\n        minimumInputLength: 0,\n        maximumInputLength: null,\n        maximumSelectionSize: 0,\n        id: function (e) { return e == undefined ? null : e.id; },\n        matcher: function(term, text) {\n            return stripDiacritics(''+text).toUpperCase().indexOf(stripDiacritics(''+term).toUpperCase()) >= 0;\n        },\n        separator: \",\",\n        tokenSeparators: [],\n        tokenizer: defaultTokenizer,\n        escapeMarkup: defaultEscapeMarkup,\n        blurOnChange: false,\n        selectOnBlur: false,\n        adaptContainerCssClass: function(c) { return c; },\n        adaptDropdownCssClass: function(c) { return null; },\n        nextSearchTerm: function(selectedObject, currentSearchTerm) { return undefined; },\n        searchInputPlaceholder: '',\n        createSearchChoicePosition: 'top',\n        shouldFocusInput: function (instance) {\n            // Attempt to detect touch devices\n            var supportsTouchEvents = (('ontouchstart' in window) ||\n                                       (navigator.msMaxTouchPoints > 0));\n\n            // Only devices which support touch events should be special cased\n            if (!supportsTouchEvents) {\n                return true;\n            }\n\n            // Never focus the input if search is disabled\n            if (instance.opts.minimumResultsForSearch < 0) {\n                return false;\n            }\n\n            return true;\n        }\n    };\n\n    $.fn.select2.locales = [];\n\n    $.fn.select2.locales['en'] = {\n         formatMatches: function (matches) { if (matches === 1) { return \"One result is available, press enter to select it.\"; } return matches + \" results are available, use up and down arrow keys to navigate.\"; },\n         formatNoMatches: function () { return \"No matches found\"; },\n         formatAjaxError: function (jqXHR, textStatus, errorThrown) { return \"Loading failed\"; },\n         formatInputTooShort: function (input, min) { var n = min - input.length; return \"Please enter \" + n + \" or more character\" + (n == 1 ? \"\" : \"s\"); },\n         formatInputTooLong: function (input, max) { var n = input.length - max; return \"Please delete \" + n + \" character\" + (n == 1 ? \"\" : \"s\"); },\n         formatSelectionTooBig: function (limit) { return \"You can only select \" + limit + \" item\" + (limit == 1 ? \"\" : \"s\"); },\n         formatLoadMore: function (pageNumber) { return \"Loading more results…\"; },\n         formatSearching: function () { return \"Searching…\"; },\n    };\n\n    $.extend($.fn.select2.defaults, $.fn.select2.locales['en']);\n\n    $.fn.select2.ajaxDefaults = {\n        transport: $.ajax,\n        params: {\n            type: \"GET\",\n            cache: false,\n            dataType: \"json\"\n        }\n    };\n\n    // exports\n    window.Select2 = {\n        query: {\n            ajax: ajax,\n            local: local,\n            tags: tags\n        }, util: {\n            debounce: debounce,\n            markMatch: markMatch,\n            escapeMarkup: defaultEscapeMarkup,\n            stripDiacritics: stripDiacritics\n        }, \"class\": {\n            \"abstract\": AbstractSelect2,\n            \"single\": SingleSelect2,\n            \"multi\": MultiSelect2\n        }\n    };\n\n}(jQuery));\n\n/* ============================================================\n * flatui-radiocheck v0.1.0\n * ============================================================ */\n\n+function (global, $) {\n  'use strict';\n\n  var Radiocheck = function (element, options) {\n    this.init('radiocheck', element, options);\n  };\n\n  Radiocheck.DEFAULTS = {\n    checkboxClass: 'custom-checkbox',\n    radioClass: 'custom-radio',\n    checkboxTemplate: '<span class=\"icons\"><span class=\"icon-unchecked\"></span><span class=\"icon-checked\"></span></span>',\n    radioTemplate: '<span class=\"icons\"><span class=\"icon-unchecked\"></span><span class=\"icon-checked\"></span></span>'\n  };\n\n  Radiocheck.prototype.init = function (type, element, options) {\n    this.$element = $(element);\n    this.options = $.extend({}, Radiocheck.DEFAULTS, this.$element.data(), options);\n    if (this.$element.attr('type') == 'checkbox') {\n      this.$element.addClass(this.options.checkboxClass);\n      this.$element.after(this.options.checkboxTemplate);\n    } else if (this.$element.attr('type') == 'radio') {\n      this.$element.addClass(this.options.radioClass);\n      this.$element.after(this.options.radioTemplate);\n    }\n  };\n\n  Radiocheck.prototype.check = function () {\n    this.$element.prop('checked', true);\n    this.$element.trigger('change.radiocheck').trigger('checked.radiocheck');\n  },\n\n  Radiocheck.prototype.uncheck = function () {\n    this.$element.prop('checked', false);\n    this.$element.trigger('change.radiocheck').trigger('unchecked.radiocheck');\n  },\n\n  Radiocheck.prototype.toggle = function () {\n    this.$element.prop('checked', function (i, value) {\n      return !value;\n    });\n    this.$element.trigger('change.radiocheck').trigger('toggled.radiocheck');\n  },\n\n  Radiocheck.prototype.indeterminate = function () {\n    this.$element.prop('indeterminate', true);\n    this.$element.trigger('change.radiocheck').trigger('indeterminated.radiocheck');\n  },\n\n  Radiocheck.prototype.determinate = function () {\n    this.$element.prop('indeterminate', false);\n    this.$element.trigger('change.radiocheck').trigger('determinated.radiocheck');\n  },\n\n  Radiocheck.prototype.disable = function () {\n    this.$element.prop('disabled', true);\n    this.$element.trigger('change.radiocheck').trigger('disabled.radiocheck');\n  },\n\n  Radiocheck.prototype.enable = function () {\n    this.$element.prop('disabled', false);\n    this.$element.trigger('change.radiocheck').trigger('enabled.radiocheck');\n  },\n\n  Radiocheck.prototype.destroy = function () {\n    this.$element.removeData().removeClass(this.options.checkboxClass + ' ' + this.options.radioClass).next('.icons').remove();\n    this.$element.trigger('destroyed.radiocheck');\n  };\n\n  // RADIOCHECK PLUGIN DEFINITION\n  // ============================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this);\n      var data    = $this.data('radiocheck');\n      var options = typeof option == 'object' && option;\n\n      if (!data && option == 'destroy') { return; }\n      if (!data) {\n        $this.data('radiocheck', (data = new Radiocheck(this, options)));\n      }\n      if (typeof option == 'string') {\n        data[option]();\n      }\n\n      // Adding 'nohover' class for mobile devices\n\n      var mobile = /mobile|tablet|phone|ip(ad|od)|android|silk|webos/i.test(global.navigator.userAgent);\n\n      if (mobile === true) {\n        $this.parent().hover(function () {\n          $this.addClass('nohover');\n        }, function () {\n          $this.removeClass('nohover');\n        });\n      }\n    });\n  }\n\n  var old = $.fn.radiocheck;\n\n  $.fn.radiocheck             = Plugin;\n  $.fn.radiocheck.Constructor = Radiocheck;\n\n  // RADIOCHECK NO CONFLICT\n  // ======================\n\n  $.fn.radiocheck.noConflict = function () {\n    $.fn.radiocheck = old;\n    return this;\n  };\n\n}(this, jQuery);\n"
  },
  {
    "path": "app/lib/flat-ui/js/vendor/html5shiv.js",
    "content": "/**\n* @preserve HTML5 Shiv 3.7.2 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed\n*/\n;(function(window, document) {\n/*jshint evil:true */\n  /** version */\n  var version = '3.7.2';\n\n  /** Preset options */\n  var options = window.html5 || {};\n\n  /** Used to skip problem elements */\n  var reSkip = /^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i;\n\n  /** Not all elements can be cloned in IE **/\n  var saveClones = /^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i;\n\n  /** Detect whether the browser supports default html5 styles */\n  var supportsHtml5Styles;\n\n  /** Name of the expando, to work with multiple documents or to re-shiv one document */\n  var expando = '_html5shiv';\n\n  /** The id for the the documents expando */\n  var expanID = 0;\n\n  /** Cached data for each document */\n  var expandoData = {};\n\n  /** Detect whether the browser supports unknown elements */\n  var supportsUnknownElements;\n\n  (function() {\n    try {\n        var a = document.createElement('a');\n        a.innerHTML = '<xyz></xyz>';\n        //if the hidden property is implemented we can assume, that the browser supports basic HTML5 Styles\n        supportsHtml5Styles = ('hidden' in a);\n\n        supportsUnknownElements = a.childNodes.length == 1 || (function() {\n          // assign a false positive if unable to shiv\n          (document.createElement)('a');\n          var frag = document.createDocumentFragment();\n          return (\n            typeof frag.cloneNode == 'undefined' ||\n            typeof frag.createDocumentFragment == 'undefined' ||\n            typeof frag.createElement == 'undefined'\n          );\n        }());\n    } catch(e) {\n      // assign a false positive if detection fails => unable to shiv\n      supportsHtml5Styles = true;\n      supportsUnknownElements = true;\n    }\n\n  }());\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Creates a style sheet with the given CSS text and adds it to the document.\n   * @private\n   * @param {Document} ownerDocument The document.\n   * @param {String} cssText The CSS text.\n   * @returns {StyleSheet} The style element.\n   */\n  function addStyleSheet(ownerDocument, cssText) {\n    var p = ownerDocument.createElement('p'),\n        parent = ownerDocument.getElementsByTagName('head')[0] || ownerDocument.documentElement;\n\n    p.innerHTML = 'x<style>' + cssText + '</style>';\n    return parent.insertBefore(p.lastChild, parent.firstChild);\n  }\n\n  /**\n   * Returns the value of `html5.elements` as an array.\n   * @private\n   * @returns {Array} An array of shived element node names.\n   */\n  function getElements() {\n    var elements = html5.elements;\n    return typeof elements == 'string' ? elements.split(' ') : elements;\n  }\n\n  /**\n   * Extends the built-in list of html5 elements\n   * @memberOf html5\n   * @param {String|Array} newElements whitespace separated list or array of new element names to shiv\n   * @param {Document} ownerDocument The context document.\n   */\n  function addElements(newElements, ownerDocument) {\n    var elements = html5.elements;\n    if(typeof elements != 'string'){\n      elements = elements.join(' ');\n    }\n    if(typeof newElements != 'string'){\n      newElements = newElements.join(' ');\n    }\n    html5.elements = elements +' '+ newElements;\n    shivDocument(ownerDocument);\n  }\n\n   /**\n   * Returns the data associated to the given document\n   * @private\n   * @param {Document} ownerDocument The document.\n   * @returns {Object} An object of data.\n   */\n  function getExpandoData(ownerDocument) {\n    var data = expandoData[ownerDocument[expando]];\n    if (!data) {\n        data = {};\n        expanID++;\n        ownerDocument[expando] = expanID;\n        expandoData[expanID] = data;\n    }\n    return data;\n  }\n\n  /**\n   * returns a shived element for the given nodeName and document\n   * @memberOf html5\n   * @param {String} nodeName name of the element\n   * @param {Document} ownerDocument The context document.\n   * @returns {Object} The shived element.\n   */\n  function createElement(nodeName, ownerDocument, data){\n    if (!ownerDocument) {\n        ownerDocument = document;\n    }\n    if(supportsUnknownElements){\n        return ownerDocument.createElement(nodeName);\n    }\n    if (!data) {\n        data = getExpandoData(ownerDocument);\n    }\n    var node;\n\n    if (data.cache[nodeName]) {\n        node = data.cache[nodeName].cloneNode();\n    } else if (saveClones.test(nodeName)) {\n        node = (data.cache[nodeName] = data.createElem(nodeName)).cloneNode();\n    } else {\n        node = data.createElem(nodeName);\n    }\n\n    // Avoid adding some elements to fragments in IE < 9 because\n    // * Attributes like `name` or `type` cannot be set/changed once an element\n    //   is inserted into a document/fragment\n    // * Link elements with `src` attributes that are inaccessible, as with\n    //   a 403 response, will cause the tab/window to crash\n    // * Script elements appended to fragments will execute when their `src`\n    //   or `text` property is set\n    return node.canHaveChildren && !reSkip.test(nodeName) && !node.tagUrn ? data.frag.appendChild(node) : node;\n  }\n\n  /**\n   * returns a shived DocumentFragment for the given document\n   * @memberOf html5\n   * @param {Document} ownerDocument The context document.\n   * @returns {Object} The shived DocumentFragment.\n   */\n  function createDocumentFragment(ownerDocument, data){\n    if (!ownerDocument) {\n        ownerDocument = document;\n    }\n    if(supportsUnknownElements){\n        return ownerDocument.createDocumentFragment();\n    }\n    data = data || getExpandoData(ownerDocument);\n    var clone = data.frag.cloneNode(),\n        i = 0,\n        elems = getElements(),\n        l = elems.length;\n    for(;i<l;i++){\n        clone.createElement(elems[i]);\n    }\n    return clone;\n  }\n\n  /**\n   * Shivs the `createElement` and `createDocumentFragment` methods of the document.\n   * @private\n   * @param {Document|DocumentFragment} ownerDocument The document.\n   * @param {Object} data of the document.\n   */\n  function shivMethods(ownerDocument, data) {\n    if (!data.cache) {\n        data.cache = {};\n        data.createElem = ownerDocument.createElement;\n        data.createFrag = ownerDocument.createDocumentFragment;\n        data.frag = data.createFrag();\n    }\n\n\n    ownerDocument.createElement = function(nodeName) {\n      //abort shiv\n      if (!html5.shivMethods) {\n          return data.createElem(nodeName);\n      }\n      return createElement(nodeName, ownerDocument, data);\n    };\n\n    ownerDocument.createDocumentFragment = Function('h,f', 'return function(){' +\n      'var n=f.cloneNode(),c=n.createElement;' +\n      'h.shivMethods&&(' +\n        // unroll the `createElement` calls\n        getElements().join().replace(/[\\w\\-:]+/g, function(nodeName) {\n          data.createElem(nodeName);\n          data.frag.createElement(nodeName);\n          return 'c(\"' + nodeName + '\")';\n        }) +\n      ');return n}'\n    )(html5, data.frag);\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Shivs the given document.\n   * @memberOf html5\n   * @param {Document} ownerDocument The document to shiv.\n   * @returns {Document} The shived document.\n   */\n  function shivDocument(ownerDocument) {\n    if (!ownerDocument) {\n        ownerDocument = document;\n    }\n    var data = getExpandoData(ownerDocument);\n\n    if (html5.shivCSS && !supportsHtml5Styles && !data.hasCSS) {\n      data.hasCSS = !!addStyleSheet(ownerDocument,\n        // corrects block display not defined in IE6/7/8/9\n        'article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}' +\n        // adds styling not present in IE6/7/8/9\n        'mark{background:#FF0;color:#000}' +\n        // hides non-rendered elements\n        'template{display:none}'\n      );\n    }\n    if (!supportsUnknownElements) {\n      shivMethods(ownerDocument, data);\n    }\n    return ownerDocument;\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * The `html5` object is exposed so that more elements can be shived and\n   * existing shiving can be detected on iframes.\n   * @type Object\n   * @example\n   *\n   * // options can be changed before the script is included\n   * html5 = { 'elements': 'mark section', 'shivCSS': false, 'shivMethods': false };\n   */\n  var html5 = {\n\n    /**\n     * An array or space separated string of node names of the elements to shiv.\n     * @memberOf html5\n     * @type Array|String\n     */\n    'elements': options.elements || 'abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video',\n\n    /**\n     * current version of html5shiv\n     */\n    'version': version,\n\n    /**\n     * A flag to indicate that the HTML5 style sheet should be inserted.\n     * @memberOf html5\n     * @type Boolean\n     */\n    'shivCSS': (options.shivCSS !== false),\n\n    /**\n     * Is equal to true if a browser supports creating unknown/HTML5 elements\n     * @memberOf html5\n     * @type boolean\n     */\n    'supportsUnknownElements': supportsUnknownElements,\n\n    /**\n     * A flag to indicate that the document's `createElement` and `createDocumentFragment`\n     * methods should be overwritten.\n     * @memberOf html5\n     * @type Boolean\n     */\n    'shivMethods': (options.shivMethods !== false),\n\n    /**\n     * A string to describe the type of `html5` object (\"default\" or \"default print\").\n     * @memberOf html5\n     * @type String\n     */\n    'type': 'default',\n\n    // shivs the document according to the specified `html5` object options\n    'shivDocument': shivDocument,\n\n    //creates a shived element\n    createElement: createElement,\n\n    //creates a shived documentFragment\n    createDocumentFragment: createDocumentFragment,\n\n    //extends list of elements\n    addElements: addElements\n  };\n\n  /*--------------------------------------------------------------------------*/\n\n  // expose html5\n  window.html5 = html5;\n\n  // shiv the document\n  shivDocument(document);\n\n}(this, document));\n"
  },
  {
    "path": "app/lib/flat-ui/js/vendor/video.js",
    "content": "/*! Video.js v4.7.3 Copyright 2014 Brightcove, Inc. https://github.com/videojs/video.js/blob/master/LICENSE */ \n(function() {var b=void 0,f=!0,k=null,l=!1;function m(){return function(){}}function p(a){return function(){return this[a]}}function r(a){return function(){return a}}var s;document.createElement(\"video\");document.createElement(\"audio\");document.createElement(\"track\");function t(a,c,d){if(\"string\"===typeof a){0===a.indexOf(\"#\")&&(a=a.slice(1));if(t.Ca[a])return t.Ca[a];a=t.w(a)}if(!a||!a.nodeName)throw new TypeError(\"The element or ID supplied is not valid. (videojs)\");return a.player||new t.Player(a,c,d)}\nvar videojs=window.videojs=t;t.Vb=\"4.7\";t.Uc=\"https:\"==document.location.protocol?\"https://\":\"http://\";t.options={techOrder:[\"html5\",\"flash\"],html5:{},flash:{},width:300,height:150,defaultVolume:0,playbackRates:[],children:{mediaLoader:{},posterImage:{},textTrackDisplay:{},loadingSpinner:{},bigPlayButton:{},controlBar:{},errorDisplay:{}},language:document.getElementsByTagName(\"html\")[0].getAttribute(\"lang\")||navigator.Va&&navigator.Va[0]||navigator.ve||navigator.language||\"en\",languages:{},notSupportedMessage:\"No compatible source was found for this video.\"};\n\"GENERATED_CDN_VSN\"!==t.Vb&&(videojs.options.flash.swf=t.Uc+\"vjs.zencdn.net/\"+t.Vb+\"/video-js.swf\");t.fd=function(a,c){t.options.languages[a]=t.options.languages[a]!==b?t.ha.Wa(t.options.languages[a],c):c;return t.options.languages};t.Ca={};\"function\"===typeof define&&define.amd?define([],function(){return videojs}):\"object\"===typeof exports&&\"object\"===typeof module&&(module.exports=videojs);t.ra=t.CoreObject=m();\nt.ra.extend=function(a){var c,d;a=a||{};c=a.init||a.i||this.prototype.init||this.prototype.i||m();d=function(){c.apply(this,arguments)};d.prototype=t.h.create(this.prototype);d.prototype.constructor=d;d.extend=t.ra.extend;d.create=t.ra.create;for(var e in a)a.hasOwnProperty(e)&&(d.prototype[e]=a[e]);return d};t.ra.create=function(){var a=t.h.create(this.prototype);this.apply(a,arguments);return a};\nt.d=function(a,c,d){if(t.h.isArray(c))return u(t.d,a,c,d);var e=t.getData(a);e.D||(e.D={});e.D[c]||(e.D[c]=[]);d.z||(d.z=t.z++);e.D[c].push(d);e.Y||(e.disabled=l,e.Y=function(c){if(!e.disabled){c=t.qc(c);var d=e.D[c.type];if(d)for(var d=d.slice(0),j=0,n=d.length;j<n&&!c.xc();j++)d[j].call(a,c)}});1==e.D[c].length&&(a.addEventListener?a.addEventListener(c,e.Y,l):a.attachEvent&&a.attachEvent(\"on\"+c,e.Y))};\nt.p=function(a,c,d){if(t.tc(a)){var e=t.getData(a);if(e.D){if(t.h.isArray(c))return u(t.p,a,c,d);if(c){var g=e.D[c];if(g){if(d){if(d.z)for(e=0;e<g.length;e++)g[e].z===d.z&&g.splice(e--,1)}else e.D[c]=[];t.kc(a,c)}}else for(g in e.D)c=g,e.D[c]=[],t.kc(a,c)}}};t.kc=function(a,c){var d=t.getData(a);0===d.D[c].length&&(delete d.D[c],a.removeEventListener?a.removeEventListener(c,d.Y,l):a.detachEvent&&a.detachEvent(\"on\"+c,d.Y));t.Ib(d.D)&&(delete d.D,delete d.Y,delete d.disabled);t.Ib(d)&&t.Gc(a)};\nt.qc=function(a){function c(){return f}function d(){return l}if(!a||!a.Jb){var e=a||window.event;a={};for(var g in e)\"layerX\"!==g&&(\"layerY\"!==g&&\"keyboardEvent.keyLocation\"!==g)&&(\"returnValue\"==g&&e.preventDefault||(a[g]=e[g]));a.target||(a.target=a.srcElement||document);a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;a.preventDefault=function(){e.preventDefault&&e.preventDefault();a.returnValue=l;a.Bd=c;a.defaultPrevented=f};a.Bd=d;a.defaultPrevented=l;a.stopPropagation=function(){e.stopPropagation&&\ne.stopPropagation();a.cancelBubble=f;a.Jb=c};a.Jb=d;a.stopImmediatePropagation=function(){e.stopImmediatePropagation&&e.stopImmediatePropagation();a.xc=c;a.stopPropagation()};a.xc=d;if(a.clientX!=k){g=document.documentElement;var h=document.body;a.pageX=a.clientX+(g&&g.scrollLeft||h&&h.scrollLeft||0)-(g&&g.clientLeft||h&&h.clientLeft||0);a.pageY=a.clientY+(g&&g.scrollTop||h&&h.scrollTop||0)-(g&&g.clientTop||h&&h.clientTop||0)}a.which=a.charCode||a.keyCode;a.button!=k&&(a.button=a.button&1?0:a.button&\n4?1:a.button&2?2:0)}return a};t.m=function(a,c){var d=t.tc(a)?t.getData(a):{},e=a.parentNode||a.ownerDocument;\"string\"===typeof c&&(c={type:c,target:a});c=t.qc(c);d.Y&&d.Y.call(a,c);if(e&&!c.Jb()&&c.bubbles!==l)t.m(e,c);else if(!e&&!c.defaultPrevented&&(d=t.getData(c.target),c.target[c.type])){d.disabled=f;if(\"function\"===typeof c.target[c.type])c.target[c.type]();d.disabled=l}return!c.defaultPrevented};\nt.X=function(a,c,d){function e(){t.p(a,c,e);d.apply(this,arguments)}if(t.h.isArray(c))return u(t.X,a,c,d);e.z=d.z=d.z||t.z++;t.d(a,c,e)};function u(a,c,d,e){t.ic.forEach(d,function(d){a(c,d,e)})}var v=Object.prototype.hasOwnProperty;t.e=function(a,c){var d;c=c||{};d=document.createElement(a||\"div\");t.h.Z(c,function(a,c){-1!==a.indexOf(\"aria-\")||\"role\"==a?d.setAttribute(a,c):d[a]=c});return d};t.ba=function(a){return a.charAt(0).toUpperCase()+a.slice(1)};t.h={};\nt.h.create=Object.create||function(a){function c(){}c.prototype=a;return new c};t.h.Z=function(a,c,d){for(var e in a)v.call(a,e)&&c.call(d||this,e,a[e])};t.h.A=function(a,c){if(!c)return a;for(var d in c)v.call(c,d)&&(a[d]=c[d]);return a};t.h.pd=function(a,c){var d,e,g;a=t.h.copy(a);for(d in c)v.call(c,d)&&(e=a[d],g=c[d],a[d]=t.h.Ta(e)&&t.h.Ta(g)?t.h.pd(e,g):c[d]);return a};t.h.copy=function(a){return t.h.A({},a)};\nt.h.Ta=function(a){return!!a&&\"object\"===typeof a&&\"[object Object]\"===a.toString()&&a.constructor===Object};t.h.isArray=Array.isArray||function(a){return\"[object Array]\"===Object.prototype.toString.call(a)};t.bind=function(a,c,d){function e(){return c.apply(a,arguments)}c.z||(c.z=t.z++);e.z=d?d+\"_\"+c.z:c.z;return e};t.va={};t.z=1;t.expando=\"vdata\"+(new Date).getTime();t.getData=function(a){var c=a[t.expando];c||(c=a[t.expando]=t.z++,t.va[c]={});return t.va[c]};\nt.tc=function(a){a=a[t.expando];return!(!a||t.Ib(t.va[a]))};t.Gc=function(a){var c=a[t.expando];if(c){delete t.va[c];try{delete a[t.expando]}catch(d){a.removeAttribute?a.removeAttribute(t.expando):a[t.expando]=k}}};t.Ib=function(a){for(var c in a)if(a[c]!==k)return l;return f};t.n=function(a,c){-1==(\" \"+a.className+\" \").indexOf(\" \"+c+\" \")&&(a.className=\"\"===a.className?c:a.className+\" \"+c)};\nt.q=function(a,c){var d,e;if(-1!=a.className.indexOf(c)){d=a.className.split(\" \");for(e=d.length-1;0<=e;e--)d[e]===c&&d.splice(e,1);a.className=d.join(\" \")}};t.B=t.e(\"video\");t.M=navigator.userAgent;t.$c=/iPhone/i.test(t.M);t.Zc=/iPad/i.test(t.M);t.ad=/iPod/i.test(t.M);t.Yc=t.$c||t.Zc||t.ad;var aa=t,x;var y=t.M.match(/OS (\\d+)_/i);x=y&&y[1]?y[1]:b;aa.me=x;t.Wc=/Android/i.test(t.M);var ba=t,z;var A=t.M.match(/Android (\\d+)(?:\\.(\\d+))?(?:\\.(\\d+))*/i),B,C;\nA?(B=A[1]&&parseFloat(A[1]),C=A[2]&&parseFloat(A[2]),z=B&&C?parseFloat(A[1]+\".\"+A[2]):B?B:k):z=k;ba.Ub=z;t.bd=t.Wc&&/webkit/i.test(t.M)&&2.3>t.Ub;t.Xc=/Firefox/i.test(t.M);t.ne=/Chrome/i.test(t.M);t.ec=!!(\"ontouchstart\"in window||window.Vc&&document instanceof window.Vc);t.Ic=function(a,c){t.h.Z(c,function(c,e){e===k||\"undefined\"===typeof e||e===l?a.removeAttribute(c):a.setAttribute(c,e===f?\"\":e)})};\nt.Aa=function(a){var c,d,e,g;c={};if(a&&a.attributes&&0<a.attributes.length){d=a.attributes;for(var h=d.length-1;0<=h;h--){e=d[h].name;g=d[h].value;if(\"boolean\"===typeof a[e]||-1!==\",autoplay,controls,loop,muted,default,\".indexOf(\",\"+e+\",\"))g=g!==k?f:l;c[e]=g}}return c};\nt.pe=function(a,c){var d=\"\";document.defaultView&&document.defaultView.getComputedStyle?d=document.defaultView.getComputedStyle(a,\"\").getPropertyValue(c):a.currentStyle&&(d=a[\"client\"+c.substr(0,1).toUpperCase()+c.substr(1)]+\"px\");return d};t.Hb=function(a,c){c.firstChild?c.insertBefore(a,c.firstChild):c.appendChild(a)};t.Pa={};t.w=function(a){0===a.indexOf(\"#\")&&(a=a.slice(1));return document.getElementById(a)};\nt.za=function(a,c){c=c||a;var d=Math.floor(a%60),e=Math.floor(a/60%60),g=Math.floor(a/3600),h=Math.floor(c/60%60),j=Math.floor(c/3600);if(isNaN(a)||Infinity===a)g=e=d=\"-\";g=0<g||0<j?g+\":\":\"\";return g+(((g||10<=h)&&10>e?\"0\"+e:e)+\":\")+(10>d?\"0\"+d:d)};t.jd=function(){document.body.focus();document.onselectstart=r(l)};t.ie=function(){document.onselectstart=r(f)};t.trim=function(a){return(a+\"\").replace(/^\\s+|\\s+$/g,\"\")};t.round=function(a,c){c||(c=0);return Math.round(a*Math.pow(10,c))/Math.pow(10,c)};\nt.Ab=function(a,c){return{length:1,start:function(){return a},end:function(){return c}}};\nt.get=function(a,c,d,e){var g,h,j,n;d=d||m();\"undefined\"===typeof XMLHttpRequest&&(window.XMLHttpRequest=function(){try{return new window.ActiveXObject(\"Msxml2.XMLHTTP.6.0\")}catch(a){}try{return new window.ActiveXObject(\"Msxml2.XMLHTTP.3.0\")}catch(c){}try{return new window.ActiveXObject(\"Msxml2.XMLHTTP\")}catch(d){}throw Error(\"This browser does not support XMLHttpRequest.\");});h=new XMLHttpRequest;j=t.Vd(a);n=window.location;j.protocol+j.host!==n.protocol+n.host&&window.XDomainRequest&&!(\"withCredentials\"in\nh)?(h=new window.XDomainRequest,h.onload=function(){c(h.responseText)},h.onerror=d,h.onprogress=m(),h.ontimeout=d):(g=\"file:\"==j.protocol||\"file:\"==n.protocol,h.onreadystatechange=function(){4===h.readyState&&(200===h.status||g&&0===h.status?c(h.responseText):d(h.responseText))});try{h.open(\"GET\",a,f),e&&(h.withCredentials=f)}catch(q){d(q);return}try{h.send()}catch(w){d(w)}};\nt.Zd=function(a){try{var c=window.localStorage||l;c&&(c.volume=a)}catch(d){22==d.code||1014==d.code?t.log(\"LocalStorage Full (VideoJS)\",d):18==d.code?t.log(\"LocalStorage not allowed (VideoJS)\",d):t.log(\"LocalStorage Error (VideoJS)\",d)}};t.sc=function(a){a.match(/^https?:\\/\\//)||(a=t.e(\"div\",{innerHTML:'<a href=\"'+a+'\">x</a>'}).firstChild.href);return a};\nt.Vd=function(a){var c,d,e,g;g=\"protocol hostname port pathname search hash host\".split(\" \");d=t.e(\"a\",{href:a});if(e=\"\"===d.host&&\"file:\"!==d.protocol)c=t.e(\"div\"),c.innerHTML='<a href=\"'+a+'\"></a>',d=c.firstChild,c.setAttribute(\"style\",\"display:none; position:absolute;\"),document.body.appendChild(c);a={};for(var h=0;h<g.length;h++)a[g[h]]=d[g[h]];e&&document.body.removeChild(c);return a};\nfunction D(a,c){var d,e;d=Array.prototype.slice.call(c);e=m();e=window.console||{log:e,warn:e,error:e};a?d.unshift(a.toUpperCase()+\":\"):a=\"log\";t.log.history.push(d);d.unshift(\"VIDEOJS:\");if(e[a].apply)e[a].apply(e,d);else e[a](d.join(\" \"))}t.log=function(){D(k,arguments)};t.log.history=[];t.log.error=function(){D(\"error\",arguments)};t.log.warn=function(){D(\"warn\",arguments)};\nt.xd=function(a){var c,d;a.getBoundingClientRect&&a.parentNode&&(c=a.getBoundingClientRect());if(!c)return{left:0,top:0};a=document.documentElement;d=document.body;return{left:t.round(c.left+(window.pageXOffset||d.scrollLeft)-(a.clientLeft||d.clientLeft||0)),top:t.round(c.top+(window.pageYOffset||d.scrollTop)-(a.clientTop||d.clientTop||0))}};t.ic={};t.ic.forEach=function(a,c,d){if(t.h.isArray(a)&&c instanceof Function)for(var e=0,g=a.length;e<g;++e)c.call(d||t,a[e],e,a);return a};t.ha={};\nt.ha.Wa=function(a,c){var d,e,g;a=t.h.copy(a);for(d in c)c.hasOwnProperty(d)&&(e=a[d],g=c[d],a[d]=t.h.Ta(e)&&t.h.Ta(g)?t.ha.Wa(e,g):c[d]);return a};\nt.a=t.ra.extend({i:function(a,c,d){this.c=a;this.l=t.h.copy(this.l);c=this.options(c);this.U=c.id||(c.el&&c.el.id?c.el.id:a.id()+\"_component_\"+t.z++);this.Id=c.name||k;this.b=c.el||this.e();this.N=[];this.Qa={};this.Ra={};this.vc();this.J(d);if(c.Hc!==l){var e,g;e=t.bind(this.j(),this.j().reportUserActivity);this.d(\"touchstart\",function(){e();clearInterval(g);g=setInterval(e,250)});a=function(){e();clearInterval(g)};this.d(\"touchmove\",e);this.d(\"touchend\",a);this.d(\"touchcancel\",a)}}});s=t.a.prototype;\ns.dispose=function(){this.m({type:\"dispose\",bubbles:l});if(this.N)for(var a=this.N.length-1;0<=a;a--)this.N[a].dispose&&this.N[a].dispose();this.Ra=this.Qa=this.N=k;this.p();this.b.parentNode&&this.b.parentNode.removeChild(this.b);t.Gc(this.b);this.b=k};s.c=f;s.j=p(\"c\");s.options=function(a){return a===b?this.l:this.l=t.ha.Wa(this.l,a)};s.e=function(a,c){return t.e(a,c)};s.s=function(a){var c=this.c.language(),d=this.c.Va();return d&&d[c]&&d[c][a]?d[c][a]:a};s.w=p(\"b\");\ns.ka=function(){return this.v||this.b};s.id=p(\"U\");s.name=p(\"Id\");s.children=p(\"N\");s.zd=function(a){return this.Qa[a]};s.la=function(a){return this.Ra[a]};s.R=function(a,c){var d,e;\"string\"===typeof a?(e=a,c=c||{},d=c.componentClass||t.ba(e),c.name=e,d=new window.videojs[d](this.c||this,c)):d=a;this.N.push(d);\"function\"===typeof d.id&&(this.Qa[d.id()]=d);(e=e||d.name&&d.name())&&(this.Ra[e]=d);\"function\"===typeof d.el&&d.el()&&this.ka().appendChild(d.el());return d};\ns.removeChild=function(a){\"string\"===typeof a&&(a=this.la(a));if(a&&this.N){for(var c=l,d=this.N.length-1;0<=d;d--)if(this.N[d]===a){c=f;this.N.splice(d,1);break}c&&(this.Qa[a.id]=k,this.Ra[a.name]=k,(c=a.w())&&c.parentNode===this.ka()&&this.ka().removeChild(a.w()))}};s.vc=function(){var a,c,d,e;a=this;if(c=this.options().children)if(t.h.isArray(c))for(var g=0;g<c.length;g++)d=c[g],\"string\"==typeof d?(e=d,d={}):e=d.name,a[e]=a.R(e,d);else t.h.Z(c,function(c,d){d!==l&&(a[c]=a.R(c,d))})};s.T=r(\"\");\ns.d=function(a,c){t.d(this.b,a,t.bind(this,c));return this};s.p=function(a,c){t.p(this.b,a,c);return this};s.X=function(a,c){t.X(this.b,a,t.bind(this,c));return this};s.m=function(a){t.m(this.b,a);return this};s.J=function(a){a&&(this.ma?a.call(this):(this.bb===b&&(this.bb=[]),this.bb.push(a)));return this};s.Ga=function(){this.ma=f;var a=this.bb;if(a&&0<a.length){for(var c=0,d=a.length;c<d;c++)a[c].call(this);this.bb=[];this.m(\"ready\")}};s.n=function(a){t.n(this.b,a);return this};\ns.q=function(a){t.q(this.b,a);return this};s.show=function(){this.b.style.display=\"block\";return this};s.W=function(){this.b.style.display=\"none\";return this};function E(a){a.q(\"vjs-lock-showing\")}s.disable=function(){this.W();this.show=m()};s.width=function(a,c){return F(this,\"width\",a,c)};s.height=function(a,c){return F(this,\"height\",a,c)};s.sd=function(a,c){return this.width(a,f).height(c)};\nfunction F(a,c,d,e){if(d!==b)return a.b.style[c]=-1!==(\"\"+d).indexOf(\"%\")||-1!==(\"\"+d).indexOf(\"px\")?d:\"auto\"===d?\"\":d+\"px\",e||a.m(\"resize\"),a;if(!a.b)return 0;d=a.b.style[c];e=d.indexOf(\"px\");return-1!==e?parseInt(d.slice(0,e),10):parseInt(a.b[\"offset\"+t.ba(c)],10)}\nfunction G(a){var c,d,e,g,h,j,n,q;c=0;d=k;a.d(\"touchstart\",function(a){1===a.touches.length&&(d=a.touches[0],c=(new Date).getTime(),g=f)});a.d(\"touchmove\",function(a){1<a.touches.length?g=l:d&&(j=a.touches[0].pageX-d.pageX,n=a.touches[0].pageY-d.pageY,q=Math.sqrt(j*j+n*n),22<q&&(g=l))});h=function(){g=l};a.d(\"touchleave\",h);a.d(\"touchcancel\",h);a.d(\"touchend\",function(a){d=k;g===f&&(e=(new Date).getTime()-c,250>e&&(a.preventDefault(),this.m(\"tap\")))})}\nt.t=t.a.extend({i:function(a,c){t.a.call(this,a,c);G(this);this.d(\"tap\",this.r);this.d(\"click\",this.r);this.d(\"focus\",this.Za);this.d(\"blur\",this.Ya)}});s=t.t.prototype;\ns.e=function(a,c){var d;c=t.h.A({className:this.T(),role:\"button\",\"aria-live\":\"polite\",tabIndex:0},c);d=t.a.prototype.e.call(this,a,c);c.innerHTML||(this.v=t.e(\"div\",{className:\"vjs-control-content\"}),this.yb=t.e(\"span\",{className:\"vjs-control-text\",innerHTML:this.s(this.ua)||\"Need Text\"}),this.v.appendChild(this.yb),d.appendChild(this.v));return d};s.T=function(){return\"vjs-control \"+t.a.prototype.T.call(this)};s.r=m();s.Za=function(){t.d(document,\"keyup\",t.bind(this,this.ea))};\ns.ea=function(a){if(32==a.which||13==a.which)a.preventDefault(),this.r()};s.Ya=function(){t.p(document,\"keyup\",t.bind(this,this.ea))};\nt.Q=t.a.extend({i:function(a,c){t.a.call(this,a,c);this.hd=this.la(this.l.barName);this.handle=this.la(this.l.handleName);this.d(\"mousedown\",this.$a);this.d(\"touchstart\",this.$a);this.d(\"focus\",this.Za);this.d(\"blur\",this.Ya);this.d(\"click\",this.r);this.c.d(\"controlsvisible\",t.bind(this,this.update));a.d(this.Cc,t.bind(this,this.update));this.S={};this.S.move=t.bind(this,this.ab);this.S.end=t.bind(this,this.Mb)}});s=t.Q.prototype;\ns.e=function(a,c){c=c||{};c.className+=\" vjs-slider\";c=t.h.A({role:\"slider\",\"aria-valuenow\":0,\"aria-valuemin\":0,\"aria-valuemax\":100,tabIndex:0},c);return t.a.prototype.e.call(this,a,c)};s.$a=function(a){a.preventDefault();t.jd();this.n(\"vjs-sliding\");t.d(document,\"mousemove\",this.S.move);t.d(document,\"mouseup\",this.S.end);t.d(document,\"touchmove\",this.S.move);t.d(document,\"touchend\",this.S.end);this.ab(a)};s.ab=m();\ns.Mb=function(){t.ie();this.q(\"vjs-sliding\");t.p(document,\"mousemove\",this.S.move,l);t.p(document,\"mouseup\",this.S.end,l);t.p(document,\"touchmove\",this.S.move,l);t.p(document,\"touchend\",this.S.end,l);this.update()};s.update=function(){if(this.b){var a,c=this.Gb(),d=this.handle,e=this.hd;isNaN(c)&&(c=0);a=c;if(d){a=this.b.offsetWidth;var g=d.w().offsetWidth;a=g?g/a:0;c*=1-a;a=c+a/2;d.w().style.left=t.round(100*c,2)+\"%\"}e&&(e.w().style.width=t.round(100*a,2)+\"%\")}};\nfunction H(a,c){var d,e,g,h;d=a.b;e=t.xd(d);h=g=d.offsetWidth;d=a.handle;if(a.options().vertical)return h=e.top,e=c.changedTouches?c.changedTouches[0].pageY:c.pageY,d&&(d=d.w().offsetHeight,h+=d/2,g-=d),Math.max(0,Math.min(1,(h-e+g)/g));g=e.left;e=c.changedTouches?c.changedTouches[0].pageX:c.pageX;d&&(d=d.w().offsetWidth,g+=d/2,h-=d);return Math.max(0,Math.min(1,(e-g)/h))}s.Za=function(){t.d(document,\"keyup\",t.bind(this,this.ea))};\ns.ea=function(a){if(37==a.which||40==a.which)a.preventDefault(),this.Lc();else if(38==a.which||39==a.which)a.preventDefault(),this.Mc()};s.Ya=function(){t.p(document,\"keyup\",t.bind(this,this.ea))};s.r=function(a){a.stopImmediatePropagation();a.preventDefault()};t.$=t.a.extend();t.$.prototype.defaultValue=0;\nt.$.prototype.e=function(a,c){c=c||{};c.className+=\" vjs-slider-handle\";c=t.h.A({innerHTML:'<span class=\"vjs-control-text\">'+this.defaultValue+\"</span>\"},c);return t.a.prototype.e.call(this,\"div\",c)};t.ia=t.a.extend();function ca(a,c){a.R(c);c.d(\"click\",t.bind(a,function(){E(this)}))}\nt.ia.prototype.e=function(){var a=this.options().lc||\"ul\";this.v=t.e(a,{className:\"vjs-menu-content\"});a=t.a.prototype.e.call(this,\"div\",{append:this.v,className:\"vjs-menu\"});a.appendChild(this.v);t.d(a,\"click\",function(a){a.preventDefault();a.stopImmediatePropagation()});return a};t.I=t.t.extend({i:function(a,c){t.t.call(this,a,c);this.selected(c.selected)}});t.I.prototype.e=function(a,c){return t.t.prototype.e.call(this,\"li\",t.h.A({className:\"vjs-menu-item\",innerHTML:this.l.label},c))};\nt.I.prototype.r=function(){this.selected(f)};t.I.prototype.selected=function(a){a?(this.n(\"vjs-selected\"),this.b.setAttribute(\"aria-selected\",f)):(this.q(\"vjs-selected\"),this.b.setAttribute(\"aria-selected\",l))};t.L=t.t.extend({i:function(a,c){t.t.call(this,a,c);this.Ba=this.xa();this.R(this.Ba);this.O&&0===this.O.length&&this.W();this.d(\"keyup\",this.ea);this.b.setAttribute(\"aria-haspopup\",f);this.b.setAttribute(\"role\",\"button\")}});s=t.L.prototype;s.ta=l;\ns.xa=function(){var a=new t.ia(this.c);this.options().title&&a.ka().appendChild(t.e(\"li\",{className:\"vjs-menu-title\",innerHTML:t.ba(this.options().title),fe:-1}));if(this.O=this.createItems())for(var c=0;c<this.O.length;c++)ca(a,this.O[c]);return a};s.wa=m();s.T=function(){return this.className+\" vjs-menu-button \"+t.t.prototype.T.call(this)};s.Za=m();s.Ya=m();s.r=function(){this.X(\"mouseout\",t.bind(this,function(){E(this.Ba);this.b.blur()}));this.ta?I(this):J(this)};\ns.ea=function(a){a.preventDefault();32==a.which||13==a.which?this.ta?I(this):J(this):27==a.which&&this.ta&&I(this)};function J(a){a.ta=f;a.Ba.n(\"vjs-lock-showing\");a.b.setAttribute(\"aria-pressed\",f);a.O&&0<a.O.length&&a.O[0].w().focus()}function I(a){a.ta=l;E(a.Ba);a.b.setAttribute(\"aria-pressed\",l)}t.F=function(a){\"number\"===typeof a?this.code=a:\"string\"===typeof a?this.message=a:\"object\"===typeof a&&t.h.A(this,a);this.message||(this.message=t.F.qd[this.code]||\"\")};t.F.prototype.code=0;\nt.F.prototype.message=\"\";t.F.prototype.status=k;t.F.Sa=\"MEDIA_ERR_CUSTOM MEDIA_ERR_ABORTED MEDIA_ERR_NETWORK MEDIA_ERR_DECODE MEDIA_ERR_SRC_NOT_SUPPORTED MEDIA_ERR_ENCRYPTED\".split(\" \");\nt.F.qd={1:\"You aborted the video playback\",2:\"A network error caused the video download to fail part-way.\",3:\"The video playback was aborted due to a corruption problem or because the video used features your browser did not support.\",4:\"The video could not be loaded, either because the server or network failed or because the format is not supported.\",5:\"The video is encrypted and we do not have the keys to decrypt it.\"};for(var K=0;K<t.F.Sa.length;K++)t.F[t.F.Sa[K]]=K,t.F.prototype[t.F.Sa[K]]=K;\nvar L,M,N,O;\nL=[\"requestFullscreen exitFullscreen fullscreenElement fullscreenEnabled fullscreenchange fullscreenerror\".split(\" \"),\"webkitRequestFullscreen webkitExitFullscreen webkitFullscreenElement webkitFullscreenEnabled webkitfullscreenchange webkitfullscreenerror\".split(\" \"),\"webkitRequestFullScreen webkitCancelFullScreen webkitCurrentFullScreenElement webkitCancelFullScreen webkitfullscreenchange webkitfullscreenerror\".split(\" \"),\"mozRequestFullScreen mozCancelFullScreen mozFullScreenElement mozFullScreenEnabled mozfullscreenchange mozfullscreenerror\".split(\" \"),\"msRequestFullscreen msExitFullscreen msFullscreenElement msFullscreenEnabled MSFullscreenChange MSFullscreenError\".split(\" \")];\nM=L[0];for(O=0;O<L.length;O++)if(L[O][1]in document){N=L[O];break}if(N){t.Pa.Fb={};for(O=0;O<N.length;O++)t.Pa.Fb[M[O]]=N[O]}\nt.Player=t.a.extend({i:function(a,c,d){this.P=a;a.id=a.id||\"vjs_video_\"+t.z++;this.ge=a&&t.Aa(a);c=t.h.A(da(a),c);this.Ua=c.language||t.options.language;this.Gd=c.languages||t.options.languages;this.G={};this.Dc=c.poster;this.zb=c.controls;a.controls=l;c.Hc=l;t.a.call(this,this,c,d);this.controls()?this.n(\"vjs-controls-enabled\"):this.n(\"vjs-controls-disabled\");t.Ca[this.U]=this;c.plugins&&t.h.Z(c.plugins,function(a,c){this[a](c)},this);var e,g,h,j,n,q;e=t.bind(this,this.reportUserActivity);this.d(\"mousedown\",\nfunction(){e();clearInterval(g);g=setInterval(e,250)});this.d(\"mousemove\",function(a){if(a.screenX!=n||a.screenY!=q)n=a.screenX,q=a.screenY,e()});this.d(\"mouseup\",function(){e();clearInterval(g)});this.d(\"keydown\",e);this.d(\"keyup\",e);h=setInterval(t.bind(this,function(){this.qa&&(this.qa=l,this.userActive(f),clearTimeout(j),j=setTimeout(t.bind(this,function(){this.qa||this.userActive(l)}),2E3))}),250);this.d(\"dispose\",function(){clearInterval(h);clearTimeout(j)})}});s=t.Player.prototype;\ns.language=function(a){if(a===b)return this.Ua;this.Ua=a;return this};s.Va=p(\"Gd\");s.l=t.options;s.dispose=function(){this.m(\"dispose\");this.p(\"dispose\");t.Ca[this.U]=k;this.P&&this.P.player&&(this.P.player=k);this.b&&this.b.player&&(this.b.player=k);this.k&&this.k.dispose();t.a.prototype.dispose.call(this)};\nfunction da(a){var c={sources:[],tracks:[]};t.h.A(c,t.Aa(a));if(a.hasChildNodes()){var d,e,g,h;a=a.childNodes;g=0;for(h=a.length;g<h;g++)d=a[g],e=d.nodeName.toLowerCase(),\"source\"===e?c.sources.push(t.Aa(d)):\"track\"===e&&c.tracks.push(t.Aa(d))}return c}\ns.e=function(){var a=this.b=t.a.prototype.e.call(this,\"div\"),c=this.P,d;c.removeAttribute(\"width\");c.removeAttribute(\"height\");if(c.hasChildNodes()){var e,g,h,j,n;e=c.childNodes;g=e.length;for(n=[];g--;)h=e[g],j=h.nodeName.toLowerCase(),\"track\"===j&&n.push(h);for(e=0;e<n.length;e++)c.removeChild(n[e])}d=t.Aa(c);t.h.Z(d,function(c){a.setAttribute(c,d[c])});c.id+=\"_html5_api\";c.className=\"vjs-tech\";c.player=a.player=this;this.n(\"vjs-paused\");this.width(this.l.width,f);this.height(this.l.height,f);c.parentNode&&\nc.parentNode.insertBefore(a,c);t.Hb(c,a);this.b=a;this.d(\"loadstart\",this.Nd);this.d(\"waiting\",this.Td);this.d([\"canplay\",\"canplaythrough\",\"playing\",\"ended\"],this.Sd);this.d(\"seeking\",this.Qd);this.d(\"seeked\",this.Pd);this.d(\"ended\",this.Jd);this.d(\"play\",this.Ob);this.d(\"firstplay\",this.Ld);this.d(\"pause\",this.Nb);this.d(\"progress\",this.Od);this.d(\"durationchange\",this.Ac);this.d(\"fullscreenchange\",this.Md);return a};\nfunction P(a,c,d){a.k&&(a.ma=l,a.k.dispose(),a.k=l);\"Html5\"!==c&&a.P&&(t.g.Cb(a.P),a.P=k);a.fb=c;a.ma=l;var e=t.h.A({source:d,parentEl:a.b},a.l[c.toLowerCase()]);d&&(a.nc=d.type,d.src==a.G.src&&0<a.G.currentTime&&(e.startTime=a.G.currentTime),a.G.src=d.src);a.k=new window.videojs[c](a,e);a.k.J(function(){this.c.Ga()})}s.Nd=function(){this.error(k);this.paused()?(Q(this,l),this.X(\"play\",function(){Q(this,f)})):this.m(\"firstplay\")};s.uc=l;\nfunction Q(a,c){c!==b&&a.uc!==c&&((a.uc=c)?(a.n(\"vjs-has-started\"),a.m(\"firstplay\")):a.q(\"vjs-has-started\"))}s.Ob=function(){this.q(\"vjs-paused\");this.n(\"vjs-playing\")};s.Td=function(){this.n(\"vjs-waiting\")};s.Sd=function(){this.q(\"vjs-waiting\")};s.Qd=function(){this.n(\"vjs-seeking\")};s.Pd=function(){this.q(\"vjs-seeking\")};s.Ld=function(){this.l.starttime&&this.currentTime(this.l.starttime);this.n(\"vjs-has-started\")};s.Nb=function(){this.q(\"vjs-playing\");this.n(\"vjs-paused\")};\ns.Od=function(){1==this.bufferedPercent()&&this.m(\"loadedalldata\")};s.Jd=function(){this.l.loop&&(this.currentTime(0),this.play())};s.Ac=function(){var a=R(this,\"duration\");a&&(0>a&&(a=Infinity),this.duration(a),Infinity===a?this.n(\"vjs-live\"):this.q(\"vjs-live\"))};s.Md=function(){this.isFullscreen()?this.n(\"vjs-fullscreen\"):this.q(\"vjs-fullscreen\")};function S(a,c,d){if(a.k&&!a.k.ma)a.k.J(function(){this[c](d)});else try{a.k[c](d)}catch(e){throw t.log(e),e;}}\nfunction R(a,c){if(a.k&&a.k.ma)try{return a.k[c]()}catch(d){throw a.k[c]===b?t.log(\"Video.js: \"+c+\" method not defined for \"+a.fb+\" playback technology.\",d):\"TypeError\"==d.name?(t.log(\"Video.js: \"+c+\" unavailable on \"+a.fb+\" playback technology element.\",d),a.k.ma=l):t.log(d),d;}}s.play=function(){S(this,\"play\");return this};s.pause=function(){S(this,\"pause\");return this};s.paused=function(){return R(this,\"paused\")===l?l:f};\ns.currentTime=function(a){return a!==b?(S(this,\"setCurrentTime\",a),this):this.G.currentTime=R(this,\"currentTime\")||0};s.duration=function(a){if(a!==b)return this.G.duration=parseFloat(a),this;this.G.duration===b&&this.Ac();return this.G.duration||0};s.remainingTime=function(){return this.duration()-this.currentTime()};s.buffered=function(){var a=R(this,\"buffered\");if(!a||!a.length)a=t.Ab(0,0);return a};\ns.bufferedPercent=function(){var a=this.duration(),c=this.buffered(),d=0,e,g;if(!a)return 0;for(var h=0;h<c.length;h++)e=c.start(h),g=c.end(h),g>a&&(g=a),d+=g-e;return d/a};s.volume=function(a){if(a!==b)return a=Math.max(0,Math.min(1,parseFloat(a))),this.G.volume=a,S(this,\"setVolume\",a),t.Zd(a),this;a=parseFloat(R(this,\"volume\"));return isNaN(a)?1:a};s.muted=function(a){return a!==b?(S(this,\"setMuted\",a),this):R(this,\"muted\")||l};s.Ea=function(){return R(this,\"supportsFullScreen\")||l};s.wc=l;\ns.isFullscreen=function(a){return a!==b?(this.wc=!!a,this):this.wc};s.isFullScreen=function(a){t.log.warn('player.isFullScreen() has been deprecated, use player.isFullscreen() with a lowercase \"s\")');return this.isFullscreen(a)};\ns.requestFullscreen=function(){var a=t.Pa.Fb;this.isFullscreen(f);a?(t.d(document,a.fullscreenchange,t.bind(this,function(c){this.isFullscreen(document[a.fullscreenElement]);this.isFullscreen()===l&&t.p(document,a.fullscreenchange,arguments.callee);this.m(\"fullscreenchange\")})),this.b[a.requestFullscreen]()):this.k.Ea()?S(this,\"enterFullScreen\"):(this.pc(),this.m(\"fullscreenchange\"));return this};\ns.exitFullscreen=function(){var a=t.Pa.Fb;this.isFullscreen(l);if(a)document[a.exitFullscreen]();else this.k.Ea()?S(this,\"exitFullScreen\"):(this.Db(),this.m(\"fullscreenchange\"));return this};s.pc=function(){this.Cd=f;this.td=document.documentElement.style.overflow;t.d(document,\"keydown\",t.bind(this,this.rc));document.documentElement.style.overflow=\"hidden\";t.n(document.body,\"vjs-full-window\");this.m(\"enterFullWindow\")};\ns.rc=function(a){27===a.keyCode&&(this.isFullscreen()===f?this.exitFullscreen():this.Db())};s.Db=function(){this.Cd=l;t.p(document,\"keydown\",this.rc);document.documentElement.style.overflow=this.td;t.q(document.body,\"vjs-full-window\");this.m(\"exitFullWindow\")};\ns.selectSource=function(a){for(var c=0,d=this.l.techOrder;c<d.length;c++){var e=t.ba(d[c]),g=window.videojs[e];if(g){if(g.isSupported())for(var h=0,j=a;h<j.length;h++){var n=j[h];if(g.canPlaySource(n))return{source:n,k:e}}}else t.log.error('The \"'+e+'\" tech is undefined. Skipped browser support check for that tech.')}return l};\ns.src=function(a){if(a===b)return R(this,\"src\");t.h.isArray(a)?T(this,a):\"string\"===typeof a?this.src({src:a}):a instanceof Object&&(a.type&&!window.videojs[this.fb].canPlaySource(a)?T(this,[a]):(this.G.src=a.src,this.nc=a.type||\"\",this.J(function(){S(this,\"src\",a.src);\"auto\"==this.l.preload&&this.load();this.l.autoplay&&this.play()})));return this};\nfunction T(a,c){var d=a.selectSource(c);d?d.k===a.fb?a.src(d.source):P(a,d.k,d.source):(a.error({code:4,message:a.s(a.options().notSupportedMessage)}),a.Ga())}s.load=function(){S(this,\"load\");return this};s.currentSrc=function(){return R(this,\"currentSrc\")||this.G.src||\"\"};s.od=function(){return this.nc||\"\"};s.Da=function(a){return a!==b?(S(this,\"setPreload\",a),this.l.preload=a,this):R(this,\"preload\")};s.autoplay=function(a){return a!==b?(S(this,\"setAutoplay\",a),this.l.autoplay=a,this):R(this,\"autoplay\")};\ns.loop=function(a){return a!==b?(S(this,\"setLoop\",a),this.l.loop=a,this):R(this,\"loop\")};s.poster=function(a){if(a===b)return this.Dc;this.Dc=a;S(this,\"setPoster\",a);this.m(\"posterchange\")};s.controls=function(a){return a!==b?(a=!!a,this.zb!==a&&((this.zb=a)?(this.q(\"vjs-controls-disabled\"),this.n(\"vjs-controls-enabled\"),this.m(\"controlsenabled\")):(this.q(\"vjs-controls-enabled\"),this.n(\"vjs-controls-disabled\"),this.m(\"controlsdisabled\"))),this):this.zb};t.Player.prototype.Tb;s=t.Player.prototype;\ns.usingNativeControls=function(a){return a!==b?(a=!!a,this.Tb!==a&&((this.Tb=a)?(this.n(\"vjs-using-native-controls\"),this.m(\"usingnativecontrols\")):(this.q(\"vjs-using-native-controls\"),this.m(\"usingcustomcontrols\"))),this):this.Tb};s.da=k;s.error=function(a){if(a===b)return this.da;if(a===k)return this.da=a,this.q(\"vjs-error\"),this;this.da=a instanceof t.F?a:new t.F(a);this.m(\"error\");this.n(\"vjs-error\");t.log.error(\"(CODE:\"+this.da.code+\" \"+t.F.Sa[this.da.code]+\")\",this.da.message,this.da);return this};\ns.ended=function(){return R(this,\"ended\")};s.seeking=function(){return R(this,\"seeking\")};s.qa=f;s.reportUserActivity=function(){this.qa=f};s.Sb=f;s.userActive=function(a){return a!==b?(a=!!a,a!==this.Sb&&((this.Sb=a)?(this.qa=f,this.q(\"vjs-user-inactive\"),this.n(\"vjs-user-active\"),this.m(\"useractive\")):(this.qa=l,this.k&&this.k.X(\"mousemove\",function(a){a.stopPropagation();a.preventDefault()}),this.q(\"vjs-user-active\"),this.n(\"vjs-user-inactive\"),this.m(\"userinactive\"))),this):this.Sb};\ns.playbackRate=function(a){return a!==b?(S(this,\"setPlaybackRate\",a),this):this.k&&this.k.o&&this.k.o.playbackRate?R(this,\"playbackRate\"):1};t.Ja=t.a.extend();t.Ja.prototype.l={qe:\"play\",children:{playToggle:{},currentTimeDisplay:{},timeDivider:{},durationDisplay:{},remainingTimeDisplay:{},liveDisplay:{},progressControl:{},fullscreenToggle:{},volumeControl:{},muteToggle:{},playbackRateMenuButton:{}}};t.Ja.prototype.e=function(){return t.e(\"div\",{className:\"vjs-control-bar\"})};\nt.Yb=t.a.extend({i:function(a,c){t.a.call(this,a,c)}});t.Yb.prototype.e=function(){var a=t.a.prototype.e.call(this,\"div\",{className:\"vjs-live-controls vjs-control\"});this.v=t.e(\"div\",{className:\"vjs-live-display\",innerHTML:'<span class=\"vjs-control-text\">'+this.s(\"Stream Type\")+\"</span>\"+this.s(\"LIVE\"),\"aria-live\":\"off\"});a.appendChild(this.v);return a};t.ac=t.t.extend({i:function(a,c){t.t.call(this,a,c);a.d(\"play\",t.bind(this,this.Ob));a.d(\"pause\",t.bind(this,this.Nb))}});s=t.ac.prototype;s.ua=\"Play\";\ns.T=function(){return\"vjs-play-control \"+t.t.prototype.T.call(this)};s.r=function(){this.c.paused()?this.c.play():this.c.pause()};s.Ob=function(){t.q(this.b,\"vjs-paused\");t.n(this.b,\"vjs-playing\");this.b.children[0].children[0].innerHTML=this.s(\"Pause\")};s.Nb=function(){t.q(this.b,\"vjs-playing\");t.n(this.b,\"vjs-paused\");this.b.children[0].children[0].innerHTML=this.s(\"Play\")};t.ib=t.a.extend({i:function(a,c){t.a.call(this,a,c);a.d(\"timeupdate\",t.bind(this,this.ga))}});\nt.ib.prototype.e=function(){var a=t.a.prototype.e.call(this,\"div\",{className:\"vjs-current-time vjs-time-controls vjs-control\"});this.v=t.e(\"div\",{className:\"vjs-current-time-display\",innerHTML:'<span class=\"vjs-control-text\">Current Time </span>0:00',\"aria-live\":\"off\"});a.appendChild(this.v);return a};t.ib.prototype.ga=function(){var a=this.c.cb?this.c.G.currentTime:this.c.currentTime();this.v.innerHTML='<span class=\"vjs-control-text\">'+this.s(\"Current Time\")+\"</span> \"+t.za(a,this.c.duration())};\nt.jb=t.a.extend({i:function(a,c){t.a.call(this,a,c);a.d(\"timeupdate\",t.bind(this,this.ga))}});t.jb.prototype.e=function(){var a=t.a.prototype.e.call(this,\"div\",{className:\"vjs-duration vjs-time-controls vjs-control\"});this.v=t.e(\"div\",{className:\"vjs-duration-display\",innerHTML:'<span class=\"vjs-control-text\">'+this.s(\"Duration Time\")+\"</span> 0:00\",\"aria-live\":\"off\"});a.appendChild(this.v);return a};\nt.jb.prototype.ga=function(){var a=this.c.duration();a&&(this.v.innerHTML='<span class=\"vjs-control-text\">'+this.s(\"Duration Time\")+\"</span> \"+t.za(a))};t.gc=t.a.extend({i:function(a,c){t.a.call(this,a,c)}});t.gc.prototype.e=function(){return t.a.prototype.e.call(this,\"div\",{className:\"vjs-time-divider\",innerHTML:\"<div><span>/</span></div>\"})};t.qb=t.a.extend({i:function(a,c){t.a.call(this,a,c);a.d(\"timeupdate\",t.bind(this,this.ga))}});\nt.qb.prototype.e=function(){var a=t.a.prototype.e.call(this,\"div\",{className:\"vjs-remaining-time vjs-time-controls vjs-control\"});this.v=t.e(\"div\",{className:\"vjs-remaining-time-display\",innerHTML:'<span class=\"vjs-control-text\">'+this.s(\"Remaining Time\")+\"</span> -0:00\",\"aria-live\":\"off\"});a.appendChild(this.v);return a};t.qb.prototype.ga=function(){this.c.duration()&&(this.v.innerHTML='<span class=\"vjs-control-text\">'+this.s(\"Remaining Time\")+\"</span> -\"+t.za(this.c.remainingTime()))};\nt.Ka=t.t.extend({i:function(a,c){t.t.call(this,a,c)}});t.Ka.prototype.ua=\"Fullscreen\";t.Ka.prototype.T=function(){return\"vjs-fullscreen-control \"+t.t.prototype.T.call(this)};t.Ka.prototype.r=function(){this.c.isFullscreen()?(this.c.exitFullscreen(),this.yb.innerHTML=this.s(\"Fullscreen\")):(this.c.requestFullscreen(),this.yb.innerHTML=this.s(\"Non-Fullscreen\"))};t.pb=t.a.extend({i:function(a,c){t.a.call(this,a,c)}});t.pb.prototype.l={children:{seekBar:{}}};\nt.pb.prototype.e=function(){return t.a.prototype.e.call(this,\"div\",{className:\"vjs-progress-control vjs-control\"})};t.cc=t.Q.extend({i:function(a,c){t.Q.call(this,a,c);a.d(\"timeupdate\",t.bind(this,this.pa));a.J(t.bind(this,this.pa))}});s=t.cc.prototype;s.l={children:{loadProgressBar:{},playProgressBar:{},seekHandle:{}},barName:\"playProgressBar\",handleName:\"seekHandle\"};s.Cc=\"timeupdate\";s.e=function(){return t.Q.prototype.e.call(this,\"div\",{className:\"vjs-progress-holder\",\"aria-label\":\"video progress bar\"})};\ns.pa=function(){var a=this.c.cb?this.c.G.currentTime:this.c.currentTime();this.b.setAttribute(\"aria-valuenow\",t.round(100*this.Gb(),2));this.b.setAttribute(\"aria-valuetext\",t.za(a,this.c.duration()))};s.Gb=function(){return this.c.currentTime()/this.c.duration()};s.$a=function(a){t.Q.prototype.$a.call(this,a);this.c.cb=f;this.ke=!this.c.paused();this.c.pause()};s.ab=function(a){a=H(this,a)*this.c.duration();a==this.c.duration()&&(a-=0.1);this.c.currentTime(a)};\ns.Mb=function(a){t.Q.prototype.Mb.call(this,a);this.c.cb=l;this.ke&&this.c.play()};s.Mc=function(){this.c.currentTime(this.c.currentTime()+5)};s.Lc=function(){this.c.currentTime(this.c.currentTime()-5)};t.mb=t.a.extend({i:function(a,c){t.a.call(this,a,c);a.d(\"progress\",t.bind(this,this.update))}});t.mb.prototype.e=function(){return t.a.prototype.e.call(this,\"div\",{className:\"vjs-load-progress\",innerHTML:'<span class=\"vjs-control-text\"><span>'+this.s(\"Loaded\")+\"</span>: 0%</span>\"})};\nt.mb.prototype.update=function(){var a,c,d,e,g=this.c.buffered();a=this.c.duration();var h,j=this.c;h=j.buffered();j=j.duration();h=h.end(h.length-1);h>j&&(h=j);j=this.b.children;this.b.style.width=100*(h/a||0)+\"%\";for(a=0;a<g.length;a++)c=g.start(a),d=g.end(a),(e=j[a])||(e=this.b.appendChild(t.e())),e.style.left=100*(c/h||0)+\"%\",e.style.width=100*((d-c)/h||0)+\"%\";for(a=j.length;a>g.length;a--)this.b.removeChild(j[a-1])};t.$b=t.a.extend({i:function(a,c){t.a.call(this,a,c)}});\nt.$b.prototype.e=function(){return t.a.prototype.e.call(this,\"div\",{className:\"vjs-play-progress\",innerHTML:'<span class=\"vjs-control-text\"><span>'+this.s(\"Progress\")+\"</span>: 0%</span>\"})};t.Ma=t.$.extend({i:function(a,c){t.$.call(this,a,c);a.d(\"timeupdate\",t.bind(this,this.ga))}});t.Ma.prototype.defaultValue=\"00:00\";t.Ma.prototype.e=function(){return t.$.prototype.e.call(this,\"div\",{className:\"vjs-seek-handle\",\"aria-live\":\"off\"})};\nt.Ma.prototype.ga=function(){var a=this.c.cb?this.c.G.currentTime:this.c.currentTime();this.b.innerHTML='<span class=\"vjs-control-text\">'+t.za(a,this.c.duration())+\"</span>\"};t.sb=t.a.extend({i:function(a,c){t.a.call(this,a,c);a.k&&(a.k.o&&a.k.o.volumeControl===l)&&this.n(\"vjs-hidden\");a.d(\"loadstart\",t.bind(this,function(){a.k.o&&a.k.o.volumeControl===l?this.n(\"vjs-hidden\"):this.q(\"vjs-hidden\")}))}});t.sb.prototype.l={children:{volumeBar:{}}};\nt.sb.prototype.e=function(){return t.a.prototype.e.call(this,\"div\",{className:\"vjs-volume-control vjs-control\"})};t.rb=t.Q.extend({i:function(a,c){t.Q.call(this,a,c);a.d(\"volumechange\",t.bind(this,this.pa));a.J(t.bind(this,this.pa))}});s=t.rb.prototype;s.pa=function(){this.b.setAttribute(\"aria-valuenow\",t.round(100*this.c.volume(),2));this.b.setAttribute(\"aria-valuetext\",t.round(100*this.c.volume(),2)+\"%\")};s.l={children:{volumeLevel:{},volumeHandle:{}},barName:\"volumeLevel\",handleName:\"volumeHandle\"};\ns.Cc=\"volumechange\";s.e=function(){return t.Q.prototype.e.call(this,\"div\",{className:\"vjs-volume-bar\",\"aria-label\":\"volume level\"})};s.ab=function(a){this.c.muted()&&this.c.muted(l);this.c.volume(H(this,a))};s.Gb=function(){return this.c.muted()?0:this.c.volume()};s.Mc=function(){this.c.volume(this.c.volume()+0.1)};s.Lc=function(){this.c.volume(this.c.volume()-0.1)};t.hc=t.a.extend({i:function(a,c){t.a.call(this,a,c)}});\nt.hc.prototype.e=function(){return t.a.prototype.e.call(this,\"div\",{className:\"vjs-volume-level\",innerHTML:'<span class=\"vjs-control-text\"></span>'})};t.tb=t.$.extend();t.tb.prototype.defaultValue=\"00:00\";t.tb.prototype.e=function(){return t.$.prototype.e.call(this,\"div\",{className:\"vjs-volume-handle\"})};\nt.ja=t.t.extend({i:function(a,c){t.t.call(this,a,c);a.d(\"volumechange\",t.bind(this,this.update));a.k&&(a.k.o&&a.k.o.volumeControl===l)&&this.n(\"vjs-hidden\");a.d(\"loadstart\",t.bind(this,function(){a.k.o&&a.k.o.volumeControl===l?this.n(\"vjs-hidden\"):this.q(\"vjs-hidden\")}))}});t.ja.prototype.e=function(){return t.t.prototype.e.call(this,\"div\",{className:\"vjs-mute-control vjs-control\",innerHTML:'<div><span class=\"vjs-control-text\">'+this.s(\"Mute\")+\"</span></div>\"})};\nt.ja.prototype.r=function(){this.c.muted(this.c.muted()?l:f)};t.ja.prototype.update=function(){var a=this.c.volume(),c=3;0===a||this.c.muted()?c=0:0.33>a?c=1:0.67>a&&(c=2);this.c.muted()?this.b.children[0].children[0].innerHTML!=this.s(\"Unmute\")&&(this.b.children[0].children[0].innerHTML=this.s(\"Unmute\")):this.b.children[0].children[0].innerHTML!=this.s(\"Mute\")&&(this.b.children[0].children[0].innerHTML=this.s(\"Mute\"));for(a=0;4>a;a++)t.q(this.b,\"vjs-vol-\"+a);t.n(this.b,\"vjs-vol-\"+c)};\nt.sa=t.L.extend({i:function(a,c){t.L.call(this,a,c);a.d(\"volumechange\",t.bind(this,this.update));a.k&&(a.k.o&&a.k.o.Sc===l)&&this.n(\"vjs-hidden\");a.d(\"loadstart\",t.bind(this,function(){a.k.o&&a.k.o.Sc===l?this.n(\"vjs-hidden\"):this.q(\"vjs-hidden\")}));this.n(\"vjs-menu-button\")}});t.sa.prototype.xa=function(){var a=new t.ia(this.c,{lc:\"div\"}),c=new t.rb(this.c,t.h.A({vertical:f},this.l.we));a.R(c);return a};t.sa.prototype.r=function(){t.ja.prototype.r.call(this);t.L.prototype.r.call(this)};\nt.sa.prototype.e=function(){return t.t.prototype.e.call(this,\"div\",{className:\"vjs-volume-menu-button vjs-menu-button vjs-control\",innerHTML:'<div><span class=\"vjs-control-text\">'+this.s(\"Mute\")+\"</span></div>\"})};t.sa.prototype.update=t.ja.prototype.update;t.bc=t.L.extend({i:function(a,c){t.L.call(this,a,c);this.Rc();this.Qc();a.d(\"loadstart\",t.bind(this,this.Rc));a.d(\"ratechange\",t.bind(this,this.Qc))}});s=t.bc.prototype;\ns.e=function(){var a=t.a.prototype.e.call(this,\"div\",{className:\"vjs-playback-rate vjs-menu-button vjs-control\",innerHTML:'<div class=\"vjs-control-content\"><span class=\"vjs-control-text\">'+this.s(\"Playback Rate\")+\"</span></div>\"});this.yc=t.e(\"div\",{className:\"vjs-playback-rate-value\",innerHTML:1});a.appendChild(this.yc);return a};s.xa=function(){var a=new t.ia(this.j()),c=this.j().options().playbackRates;if(c)for(var d=c.length-1;0<=d;d--)a.R(new t.ob(this.j(),{rate:c[d]+\"x\"}));return a};\ns.pa=function(){this.w().setAttribute(\"aria-valuenow\",this.j().playbackRate())};s.r=function(){for(var a=this.j().playbackRate(),c=this.j().options().playbackRates,d=c[0],e=0;e<c.length;e++)if(c[e]>a){d=c[e];break}this.j().playbackRate(d)};function U(a){return a.j().k&&a.j().k.o.playbackRate&&a.j().options().playbackRates&&0<a.j().options().playbackRates.length}s.Rc=function(){U(this)?this.q(\"vjs-hidden\"):this.n(\"vjs-hidden\")};s.Qc=function(){U(this)&&(this.yc.innerHTML=this.j().playbackRate()+\"x\")};\nt.ob=t.I.extend({lc:\"button\",i:function(a,c){var d=this.label=c.rate,e=this.Fc=parseFloat(d,10);c.label=d;c.selected=1===e;t.I.call(this,a,c);this.j().d(\"ratechange\",t.bind(this,this.update))}});t.ob.prototype.r=function(){t.I.prototype.r.call(this);this.j().playbackRate(this.Fc)};t.ob.prototype.update=function(){this.selected(this.j().playbackRate()==this.Fc)};\nt.La=t.t.extend({i:function(a,c){t.t.call(this,a,c);a.poster()&&this.src(a.poster());(!a.poster()||!a.controls())&&this.W();a.d(\"posterchange\",t.bind(this,function(){this.src(a.poster())}));a.d(\"play\",t.bind(this,this.W))}});var ea=\"backgroundSize\"in t.B.style;t.La.prototype.e=function(){var a=t.e(\"div\",{className:\"vjs-poster\",tabIndex:-1});ea||a.appendChild(t.e(\"img\"));return a};t.La.prototype.src=function(a){var c=this.w();a!==b&&(ea?c.style.backgroundImage='url(\"'+a+'\")':c.firstChild.src=a)};\nt.La.prototype.r=function(){this.j().controls()&&this.c.play()};t.Zb=t.a.extend({i:function(a,c){t.a.call(this,a,c)}});t.Zb.prototype.e=function(){return t.a.prototype.e.call(this,\"div\",{className:\"vjs-loading-spinner\"})};t.gb=t.t.extend();t.gb.prototype.e=function(){return t.t.prototype.e.call(this,\"div\",{className:\"vjs-big-play-button\",innerHTML:'<span aria-hidden=\"true\"></span>',\"aria-label\":\"play video\"})};t.gb.prototype.r=function(){this.c.play()};\nt.kb=t.a.extend({i:function(a,c){t.a.call(this,a,c);this.update();a.d(\"error\",t.bind(this,this.update))}});t.kb.prototype.e=function(){var a=t.a.prototype.e.call(this,\"div\",{className:\"vjs-error-display\"});this.v=t.e(\"div\");a.appendChild(this.v);return a};t.kb.prototype.update=function(){this.j().error()&&(this.v.innerHTML=this.s(this.j().error().message))};\nt.u=t.a.extend({i:function(a,c,d){c=c||{};c.Hc=l;t.a.call(this,a,c,d);this.o.progressEvents||(this.zc=f,this.Ec=setInterval(t.bind(this,function(){var a=this.j().bufferedPercent();this.kd!=a&&this.j().m(\"progress\");this.kd=a;1===a&&clearInterval(this.Ec)}),500));this.o.timeupdateEvents||(this.Lb=f,this.j().d(\"play\",t.bind(this,this.Pc)),this.j().d(\"pause\",t.bind(this,this.eb)),this.X(\"timeupdate\",function(){this.o.timeupdateEvents=f;fa(this)}));var e,g;g=this;e=this.j();a=function(){if(e.controls()&&\n!e.usingNativeControls()){var a;g.d(\"mousedown\",g.r);g.d(\"touchstart\",function(){a=this.c.userActive()});g.d(\"touchmove\",function(){a&&this.j().reportUserActivity()});g.d(\"touchend\",function(a){a.preventDefault()});G(g);g.d(\"tap\",g.Rd)}};c=t.bind(g,g.Xd);this.J(a);e.d(\"controlsenabled\",a);e.d(\"controlsdisabled\",c);this.J(function(){this.networkState&&0<this.networkState()&&this.j().m(\"loadstart\")})}});s=t.u.prototype;\ns.Xd=function(){this.p(\"tap\");this.p(\"touchstart\");this.p(\"touchmove\");this.p(\"touchleave\");this.p(\"touchcancel\");this.p(\"touchend\");this.p(\"click\");this.p(\"mousedown\")};s.r=function(a){0===a.button&&this.j().controls()&&(this.j().paused()?this.j().play():this.j().pause())};s.Rd=function(){this.j().userActive(!this.j().userActive())};function fa(a){a.Lb=l;a.eb();a.p(\"play\",a.Pc);a.p(\"pause\",a.eb)}\ns.Pc=function(){this.mc&&this.eb();this.mc=setInterval(t.bind(this,function(){this.j().m(\"timeupdate\")}),250)};s.eb=function(){clearInterval(this.mc);this.j().m(\"timeupdate\")};s.dispose=function(){this.zc&&(this.zc=l,clearInterval(this.Ec));this.Lb&&fa(this);t.a.prototype.dispose.call(this)};s.Qb=function(){this.Lb&&this.j().m(\"timeupdate\")};s.Jc=m();s.o={volumeControl:f,fullscreenResize:l,playbackRate:l,progressEvents:l,timeupdateEvents:l};t.media={};\nt.g=t.u.extend({i:function(a,c,d){this.o.volumeControl=t.g.md();this.o.playbackRate=t.g.ld();this.o.movingMediaElementInDOM=!t.Yc;this.o.fullscreenResize=f;this.o.progressEvents=f;t.u.call(this,a,c,d);for(d=t.g.lb.length-1;0<=d;d--)t.d(this.b,t.g.lb[d],t.bind(this,this.vd));if((c=c.source)&&this.b.currentSrc!==c.src)this.b.src=c.src;if(t.ec&&a.options().nativeControlsForTouch!==l){var e,g,h,j;e=this;g=this.j();c=g.controls();e.b.controls=!!c;h=function(){e.b.controls=f};j=function(){e.b.controls=\nl};g.d(\"controlsenabled\",h);g.d(\"controlsdisabled\",j);c=function(){g.p(\"controlsenabled\",h);g.p(\"controlsdisabled\",j)};e.d(\"dispose\",c);g.d(\"usingcustomcontrols\",c);g.usingNativeControls(f)}a.J(function(){this.P&&(this.l.autoplay&&this.paused())&&(delete this.P.poster,this.play())});this.Ga()}});s=t.g.prototype;s.dispose=function(){t.g.Cb(this.b);t.u.prototype.dispose.call(this)};\ns.e=function(){var a=this.c,c=a.P,d;if(!c||this.o.movingMediaElementInDOM===l)c?(d=c.cloneNode(l),t.g.Cb(c),c=d,a.P=k):(c=t.e(\"video\"),t.Ic(c,t.h.A(a.ge||{},{id:a.id()+\"_html5_api\",\"class\":\"vjs-tech\"}))),c.player=a,t.Hb(c,a.w());d=[\"autoplay\",\"preload\",\"loop\",\"muted\"];for(var e=d.length-1;0<=e;e--){var g=d[e],h={};\"undefined\"!==typeof a.l[g]&&(h[g]=a.l[g]);t.Ic(c,h)}return c};s.vd=function(a){\"error\"==a.type?this.j().error(this.error().code):(a.bubbles=l,this.j().m(a))};s.play=function(){this.b.play()};\ns.pause=function(){this.b.pause()};s.paused=function(){return this.b.paused};s.currentTime=function(){return this.b.currentTime};s.Qb=function(a){try{this.b.currentTime=a}catch(c){t.log(c,\"Video is not ready. (Video.js)\")}};s.duration=function(){return this.b.duration||0};s.buffered=function(){return this.b.buffered};s.volume=function(){return this.b.volume};s.de=function(a){this.b.volume=a};s.muted=function(){return this.b.muted};s.ae=function(a){this.b.muted=a};s.width=function(){return this.b.offsetWidth};\ns.height=function(){return this.b.offsetHeight};s.Ea=function(){return\"function\"==typeof this.b.webkitEnterFullScreen&&(/Android/.test(t.M)||!/Chrome|Mac OS X 10.5/.test(t.M))?f:l};s.oc=function(){var a=this.b;a.paused&&a.networkState<=a.le?(this.b.play(),setTimeout(function(){a.pause();a.webkitEnterFullScreen()},0)):a.webkitEnterFullScreen()};s.wd=function(){this.b.webkitExitFullScreen()};s.src=function(a){this.b.src=a};s.load=function(){this.b.load()};s.currentSrc=function(){return this.b.currentSrc};\ns.poster=function(){return this.b.poster};s.Jc=function(a){this.b.poster=a};s.Da=function(){return this.b.Da};s.ce=function(a){this.b.Da=a};s.autoplay=function(){return this.b.autoplay};s.Yd=function(a){this.b.autoplay=a};s.controls=function(){return this.b.controls};s.loop=function(){return this.b.loop};s.$d=function(a){this.b.loop=a};s.error=function(){return this.b.error};s.seeking=function(){return this.b.seeking};s.ended=function(){return this.b.ended};s.playbackRate=function(){return this.b.playbackRate};\ns.be=function(a){this.b.playbackRate=a};s.networkState=function(){return this.b.networkState};t.g.isSupported=function(){try{t.B.volume=0.5}catch(a){return l}return!!t.B.canPlayType};t.g.wb=function(a){try{return!!t.B.canPlayType(a.type)}catch(c){return\"\"}};t.g.md=function(){var a=t.B.volume;t.B.volume=a/2+0.1;return a!==t.B.volume};t.g.ld=function(){var a=t.B.playbackRate;t.B.playbackRate=a/2+0.1;return a!==t.B.playbackRate};var V,ga=/^application\\/(?:x-|vnd\\.apple\\.)mpegurl/i,ha=/^video\\/mp4/i;\nt.g.Bc=function(){4<=t.Ub&&(V||(V=t.B.constructor.prototype.canPlayType),t.B.constructor.prototype.canPlayType=function(a){return a&&ga.test(a)?\"maybe\":V.call(this,a)});t.bd&&(V||(V=t.B.constructor.prototype.canPlayType),t.B.constructor.prototype.canPlayType=function(a){return a&&ha.test(a)?\"maybe\":V.call(this,a)})};t.g.je=function(){var a=t.B.constructor.prototype.canPlayType;t.B.constructor.prototype.canPlayType=V;V=k;return a};t.g.Bc();t.g.lb=\"loadstart suspend abort error emptied stalled loadedmetadata loadeddata canplay canplaythrough playing waiting seeking seeked ended durationchange timeupdate progress play pause ratechange volumechange\".split(\" \");\nt.g.Cb=function(a){if(a){a.player=k;for(a.parentNode&&a.parentNode.removeChild(a);a.hasChildNodes();)a.removeChild(a.firstChild);a.removeAttribute(\"src\");if(\"function\"===typeof a.load)try{a.load()}catch(c){}}};\nt.f=t.u.extend({i:function(a,c,d){t.u.call(this,a,c,d);var e=c.source;d=c.parentEl;var g=this.b=t.e(\"div\",{id:a.id()+\"_temp_flash\"}),h=a.id()+\"_flash_api\",j=a.l,j=t.h.A({readyFunction:\"videojs.Flash.onReady\",eventProxyFunction:\"videojs.Flash.onEvent\",errorEventProxyFunction:\"videojs.Flash.onError\",autoplay:j.autoplay,preload:j.Da,loop:j.loop,muted:j.muted},c.flashVars),n=t.h.A({wmode:\"opaque\",bgcolor:\"#000000\"},c.params),h=t.h.A({id:h,name:h,\"class\":\"vjs-tech\"},c.attributes);e&&(e.type&&t.f.Ed(e.type)?\n(e=t.f.Nc(e.src),j.rtmpConnection=encodeURIComponent(e.xb),j.rtmpStream=encodeURIComponent(e.Rb)):j.src=encodeURIComponent(t.sc(e.src)));t.Hb(g,d);c.startTime&&this.J(function(){this.load();this.play();this.currentTime(c.startTime)});t.Xc&&this.J(function(){t.d(this.w(),\"mousemove\",t.bind(this,function(){this.j().m({type:\"mousemove\",bubbles:l})}))});a.d(\"stageclick\",a.reportUserActivity);this.b=t.f.ud(c.swf,g,j,n,h)}});t.f.prototype.dispose=function(){t.u.prototype.dispose.call(this)};\nt.f.prototype.play=function(){this.b.vjs_play()};t.f.prototype.pause=function(){this.b.vjs_pause()};t.f.prototype.src=function(a){if(a===b)return this.currentSrc();t.f.Dd(a)?(a=t.f.Nc(a),this.se(a.xb),this.te(a.Rb)):(a=t.sc(a),this.b.vjs_src(a));if(this.c.autoplay()){var c=this;setTimeout(function(){c.play()},0)}};t.f.prototype.setCurrentTime=function(a){this.Hd=a;this.b.vjs_setProperty(\"currentTime\",a);t.u.prototype.Qb.call(this)};\nt.f.prototype.currentTime=function(){return this.seeking()?this.Hd||0:this.b.vjs_getProperty(\"currentTime\")};t.f.prototype.currentSrc=function(){var a=this.b.vjs_getProperty(\"currentSrc\");if(a==k){var c=this.rtmpConnection(),d=this.rtmpStream();c&&d&&(a=t.f.ee(c,d))}return a};t.f.prototype.load=function(){this.b.vjs_load()};t.f.prototype.poster=function(){this.b.vjs_getProperty(\"poster\")};t.f.prototype.setPoster=m();t.f.prototype.buffered=function(){return t.Ab(0,this.b.vjs_getProperty(\"buffered\"))};\nt.f.prototype.Ea=r(l);t.f.prototype.oc=r(l);function ia(){var a=W[X],c=a.charAt(0).toUpperCase()+a.slice(1);ja[\"set\"+c]=function(c){return this.b.vjs_setProperty(a,c)}}function ka(a){ja[a]=function(){return this.b.vjs_getProperty(a)}}\nvar ja=t.f.prototype,W=\"rtmpConnection rtmpStream preload defaultPlaybackRate playbackRate autoplay loop mediaGroup controller controls volume muted defaultMuted\".split(\" \"),la=\"error networkState readyState seeking initialTime duration startOffsetTime paused played seekable ended videoTracks audioTracks videoWidth videoHeight textTracks\".split(\" \"),X;for(X=0;X<W.length;X++)ka(W[X]),ia();for(X=0;X<la.length;X++)ka(la[X]);t.f.isSupported=function(){return 10<=t.f.version()[0]};\nt.f.wb=function(a){if(!a.type)return\"\";a=a.type.replace(/;.*/,\"\").toLowerCase();if(a in t.f.yd||a in t.f.Oc)return\"maybe\"};t.f.yd={\"video/flv\":\"FLV\",\"video/x-flv\":\"FLV\",\"video/mp4\":\"MP4\",\"video/m4v\":\"MP4\"};t.f.Oc={\"rtmp/mp4\":\"MP4\",\"rtmp/flv\":\"FLV\"};t.f.onReady=function(a){var c;if(c=(a=t.w(a))&&a.parentNode&&a.parentNode.player)a.player=c,t.f.checkReady(c.k)};t.f.checkReady=function(a){a.w()&&(a.w().vjs_getProperty?a.Ga():setTimeout(function(){t.f.checkReady(a)},50))};t.f.onEvent=function(a,c){t.w(a).player.m(c)};\nt.f.onError=function(a,c){var d=t.w(a).player,e=\"FLASH: \"+c;\"srcnotfound\"==c?d.error({code:4,message:e}):d.error(e)};t.f.version=function(){var a=\"0,0,0\";try{a=(new window.ActiveXObject(\"ShockwaveFlash.ShockwaveFlash\")).GetVariable(\"$version\").replace(/\\D+/g,\",\").match(/^,?(.+),?$/)[1]}catch(c){try{navigator.mimeTypes[\"application/x-shockwave-flash\"].enabledPlugin&&(a=(navigator.plugins[\"Shockwave Flash 2.0\"]||navigator.plugins[\"Shockwave Flash\"]).description.replace(/\\D+/g,\",\").match(/^,?(.+),?$/)[1])}catch(d){}}return a.split(\",\")};\nt.f.ud=function(a,c,d,e,g){a=t.f.Ad(a,d,e,g);a=t.e(\"div\",{innerHTML:a}).childNodes[0];d=c.parentNode;c.parentNode.replaceChild(a,c);var h=d.childNodes[0];setTimeout(function(){h.style.display=\"block\"},1E3);return a};\nt.f.Ad=function(a,c,d,e){var g=\"\",h=\"\",j=\"\";c&&t.h.Z(c,function(a,c){g+=a+\"=\"+c+\"&amp;\"});d=t.h.A({movie:a,flashvars:g,allowScriptAccess:\"always\",allowNetworking:\"all\"},d);t.h.Z(d,function(a,c){h+='<param name=\"'+a+'\" value=\"'+c+'\" />'});e=t.h.A({data:a,width:\"100%\",height:\"100%\"},e);t.h.Z(e,function(a,c){j+=a+'=\"'+c+'\" '});return'<object type=\"application/x-shockwave-flash\"'+j+\">\"+h+\"</object>\"};t.f.ee=function(a,c){return a+\"&\"+c};\nt.f.Nc=function(a){var c={xb:\"\",Rb:\"\"};if(!a)return c;var d=a.indexOf(\"&\"),e;-1!==d?e=d+1:(d=e=a.lastIndexOf(\"/\")+1,0===d&&(d=e=a.length));c.xb=a.substring(0,d);c.Rb=a.substring(e,a.length);return c};t.f.Ed=function(a){return a in t.f.Oc};t.f.dd=/^rtmp[set]?:\\/\\//i;t.f.Dd=function(a){return t.f.dd.test(a)};\nt.cd=t.a.extend({i:function(a,c,d){t.a.call(this,a,c,d);if(!a.l.sources||0===a.l.sources.length){c=0;for(d=a.l.techOrder;c<d.length;c++){var e=t.ba(d[c]),g=window.videojs[e];if(g&&g.isSupported()){P(a,e);break}}}else a.src(a.l.sources)}});t.Player.prototype.textTracks=function(){return this.Fa=this.Fa||[]};\nfunction ma(a,c,d,e,g){var h=a.Fa=a.Fa||[];g=g||{};g.kind=c;g.label=d;g.language=e;c=t.ba(c||\"subtitles\");var j=new window.videojs[c+\"Track\"](a,g);h.push(j);j.Bb()&&a.J(function(){setTimeout(function(){Y(j.j(),j.id())},0)})}function Y(a,c,d){for(var e=a.Fa,g=0,h=e.length,j,n;g<h;g++)j=e[g],j.id()===c?(j.show(),n=j):d&&(j.K()==d&&0<j.mode())&&j.disable();(c=n?n.K():d?d:l)&&a.m(c+\"trackchange\")}\nt.C=t.a.extend({i:function(a,c){t.a.call(this,a,c);this.U=c.id||\"vjs_\"+c.kind+\"_\"+c.language+\"_\"+t.z++;this.Kc=c.src;this.rd=c[\"default\"]||c.dflt;this.he=c.title;this.Ua=c.srclang;this.Fd=c.label;this.ca=[];this.ub=[];this.na=this.oa=0;this.c.d(\"fullscreenchange\",t.bind(this,this.gd))}});s=t.C.prototype;s.K=p(\"H\");s.src=p(\"Kc\");s.Bb=p(\"rd\");s.title=p(\"he\");s.language=p(\"Ua\");s.label=p(\"Fd\");s.nd=p(\"ca\");s.ed=p(\"ub\");s.readyState=p(\"oa\");s.mode=p(\"na\");\ns.gd=function(){this.b.style.fontSize=this.c.isFullScreen()?140*(screen.width/this.c.width())+\"%\":\"\"};s.e=function(){return t.a.prototype.e.call(this,\"div\",{className:\"vjs-\"+this.H+\" vjs-text-track\"})};s.show=function(){na(this);this.na=2;t.a.prototype.show.call(this)};s.W=function(){na(this);this.na=1;t.a.prototype.W.call(this)};\ns.disable=function(){2==this.na&&this.W();this.c.p(\"timeupdate\",t.bind(this,this.update,this.U));this.c.p(\"ended\",t.bind(this,this.reset,this.U));this.reset();this.c.la(\"textTrackDisplay\").removeChild(this);this.na=0};function na(a){0===a.oa&&a.load();0===a.na&&(a.c.d(\"timeupdate\",t.bind(a,a.update,a.U)),a.c.d(\"ended\",t.bind(a,a.reset,a.U)),(\"captions\"===a.H||\"subtitles\"===a.H)&&a.c.la(\"textTrackDisplay\").R(a))}\ns.load=function(){0===this.oa&&(this.oa=1,t.get(this.Kc,t.bind(this,this.Ud),t.bind(this,this.Kd)))};s.Kd=function(a){this.error=a;this.oa=3;this.m(\"error\")};s.Ud=function(a){var c,d;a=a.split(\"\\n\");for(var e=\"\",g=1,h=a.length;g<h;g++)if(e=t.trim(a[g])){-1==e.indexOf(\"--\\x3e\")?(c=e,e=t.trim(a[++g])):c=this.ca.length;c={id:c,index:this.ca.length};d=e.split(/[\\t ]+/);c.startTime=oa(d[0]);c.ya=oa(d[2]);for(d=[];a[++g]&&(e=t.trim(a[g]));)d.push(e);c.text=d.join(\"<br/>\");this.ca.push(c)}this.oa=2;this.m(\"loaded\")};\nfunction oa(a){var c=a.split(\":\");a=0;var d,e,g;3==c.length?(d=c[0],e=c[1],c=c[2]):(d=0,e=c[0],c=c[1]);c=c.split(/\\s+/);c=c.splice(0,1)[0];c=c.split(/\\.|,/);g=parseFloat(c[1]);c=c[0];a+=3600*parseFloat(d);a+=60*parseFloat(e);a+=parseFloat(c);g&&(a+=g/1E3);return a}\ns.update=function(){if(0<this.ca.length){var a=this.c.options().trackTimeOffset||0,a=this.c.currentTime()+a;if(this.Pb===b||a<this.Pb||this.Xa<=a){var c=this.ca,d=this.c.duration(),e=0,g=l,h=[],j,n,q,w;a>=this.Xa||this.Xa===b?w=this.Eb!==b?this.Eb:0:(g=f,w=this.Kb!==b?this.Kb:c.length-1);for(;;){q=c[w];if(q.ya<=a)e=Math.max(e,q.ya),q.Oa&&(q.Oa=l);else if(a<q.startTime){if(d=Math.min(d,q.startTime),q.Oa&&(q.Oa=l),!g)break}else g?(h.splice(0,0,q),n===b&&(n=w),j=w):(h.push(q),j===b&&(j=w),n=w),d=Math.min(d,\nq.ya),e=Math.max(e,q.startTime),q.Oa=f;if(g)if(0===w)break;else w--;else if(w===c.length-1)break;else w++}this.ub=h;this.Xa=d;this.Pb=e;this.Eb=j;this.Kb=n;j=this.ub;n=\"\";a=0;for(c=j.length;a<c;a++)n+='<span class=\"vjs-tt-cue\">'+j[a].text+\"</span>\";this.b.innerHTML=n;this.m(\"cuechange\")}}};s.reset=function(){this.Xa=0;this.Pb=this.c.duration();this.Kb=this.Eb=0};t.Wb=t.C.extend();t.Wb.prototype.H=\"captions\";t.dc=t.C.extend();t.dc.prototype.H=\"subtitles\";t.Xb=t.C.extend();t.Xb.prototype.H=\"chapters\";\nt.fc=t.a.extend({i:function(a,c,d){t.a.call(this,a,c,d);if(a.l.tracks&&0<a.l.tracks.length){c=this.c;a=a.l.tracks;for(var e=0;e<a.length;e++)d=a[e],ma(c,d.kind,d.label,d.language,d)}}});t.fc.prototype.e=function(){return t.a.prototype.e.call(this,\"div\",{className:\"vjs-text-track-display\"})};t.aa=t.I.extend({i:function(a,c){var d=this.fa=c.track;c.label=d.label();c.selected=d.Bb();t.I.call(this,a,c);this.c.d(d.K()+\"trackchange\",t.bind(this,this.update))}});\nt.aa.prototype.r=function(){t.I.prototype.r.call(this);Y(this.c,this.fa.U,this.fa.K())};t.aa.prototype.update=function(){this.selected(2==this.fa.mode())};t.nb=t.aa.extend({i:function(a,c){c.track={K:function(){return c.kind},j:a,label:function(){return c.kind+\" off\"},Bb:r(l),mode:r(l)};t.aa.call(this,a,c);this.selected(f)}});t.nb.prototype.r=function(){t.aa.prototype.r.call(this);Y(this.c,this.fa.U,this.fa.K())};\nt.nb.prototype.update=function(){for(var a=this.c.textTracks(),c=0,d=a.length,e,g=f;c<d;c++)e=a[c],e.K()==this.fa.K()&&2==e.mode()&&(g=l);this.selected(g)};t.V=t.L.extend({i:function(a,c){t.L.call(this,a,c);1>=this.O.length&&this.W()}});t.V.prototype.wa=function(){var a=[],c;a.push(new t.nb(this.c,{kind:this.H}));for(var d=0;d<this.c.textTracks().length;d++)c=this.c.textTracks()[d],c.K()===this.H&&a.push(new t.aa(this.c,{track:c}));return a};\nt.Ha=t.V.extend({i:function(a,c,d){t.V.call(this,a,c,d);this.b.setAttribute(\"aria-label\",\"Captions Menu\")}});t.Ha.prototype.H=\"captions\";t.Ha.prototype.ua=\"Captions\";t.Ha.prototype.className=\"vjs-captions-button\";t.Na=t.V.extend({i:function(a,c,d){t.V.call(this,a,c,d);this.b.setAttribute(\"aria-label\",\"Subtitles Menu\")}});t.Na.prototype.H=\"subtitles\";t.Na.prototype.ua=\"Subtitles\";t.Na.prototype.className=\"vjs-subtitles-button\";\nt.Ia=t.V.extend({i:function(a,c,d){t.V.call(this,a,c,d);this.b.setAttribute(\"aria-label\",\"Chapters Menu\")}});s=t.Ia.prototype;s.H=\"chapters\";s.ua=\"Chapters\";s.className=\"vjs-chapters-button\";s.wa=function(){for(var a=[],c,d=0;d<this.c.textTracks().length;d++)c=this.c.textTracks()[d],c.K()===this.H&&a.push(new t.aa(this.c,{track:c}));return a};\ns.xa=function(){for(var a=this.c.textTracks(),c=0,d=a.length,e,g,h=this.O=[];c<d;c++)if(e=a[c],e.K()==this.H)if(0===e.readyState())e.load(),e.d(\"loaded\",t.bind(this,this.xa));else{g=e;break}a=this.Ba;a===b&&(a=new t.ia(this.c),a.ka().appendChild(t.e(\"li\",{className:\"vjs-menu-title\",innerHTML:t.ba(this.H),fe:-1})));if(g){e=g.ca;for(var j,c=0,d=e.length;c<d;c++)j=e[c],j=new t.hb(this.c,{track:g,cue:j}),h.push(j),a.R(j);this.R(a)}0<this.O.length&&this.show();return a};\nt.hb=t.I.extend({i:function(a,c){var d=this.fa=c.track,e=this.cue=c.cue,g=a.currentTime();c.label=e.text;c.selected=e.startTime<=g&&g<e.ya;t.I.call(this,a,c);d.d(\"cuechange\",t.bind(this,this.update))}});t.hb.prototype.r=function(){t.I.prototype.r.call(this);this.c.currentTime(this.cue.startTime);this.update(this.cue.startTime)};t.hb.prototype.update=function(){var a=this.cue,c=this.c.currentTime();this.selected(a.startTime<=c&&c<a.ya)};\nt.h.A(t.Ja.prototype.l.children,{subtitlesButton:{},captionsButton:{},chaptersButton:{}});\nif(\"undefined\"!==typeof window.JSON&&\"function\"===window.JSON.parse)t.JSON=window.JSON;else{t.JSON={};var Z=/[\\u0000\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g;t.JSON.parse=function(a,c){function d(a,e){var j,n,q=a[e];if(q&&\"object\"===typeof q)for(j in q)Object.prototype.hasOwnProperty.call(q,j)&&(n=d(q,j),n!==b?q[j]=n:delete q[j]);return c.call(a,e,q)}var e;a=String(a);Z.lastIndex=0;Z.test(a)&&(a=a.replace(Z,function(a){return\"\\\\u\"+(\"0000\"+a.charCodeAt(0).toString(16)).slice(-4)}));\nif(/^[\\],:{}\\s]*$/.test(a.replace(/\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g,\"@\").replace(/\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g,\"]\").replace(/(?:^|:|,)(?:\\s*\\[)+/g,\"\")))return e=eval(\"(\"+a+\")\"),\"function\"===typeof c?d({\"\":e},\"\"):e;throw new SyntaxError(\"JSON.parse(): invalid or malformed JSON data\");}}\nt.jc=function(){var a,c,d=document.getElementsByTagName(\"video\");if(d&&0<d.length)for(var e=0,g=d.length;e<g;e++)if((c=d[e])&&c.getAttribute)c.player===b&&(a=c.getAttribute(\"data-setup\"),a!==k&&(a=t.JSON.parse(a||\"{}\"),videojs(c,a)));else{t.vb();break}else t.Tc||t.vb()};t.vb=function(){setTimeout(t.jc,1)};\"complete\"===document.readyState?t.Tc=f:t.X(window,\"load\",function(){t.Tc=f});t.vb();t.Wd=function(a,c){t.Player.prototype[a]=c};var pa=this;function $(a,c){var d=a.split(\".\"),e=pa;!(d[0]in e)&&e.execScript&&e.execScript(\"var \"+d[0]);for(var g;d.length&&(g=d.shift());)!d.length&&c!==b?e[g]=c:e=e[g]?e[g]:e[g]={}};$(\"videojs\",t);$(\"_V_\",t);$(\"videojs.options\",t.options);$(\"videojs.players\",t.Ca);$(\"videojs.TOUCH_ENABLED\",t.ec);$(\"videojs.cache\",t.va);$(\"videojs.Component\",t.a);t.a.prototype.player=t.a.prototype.j;t.a.prototype.options=t.a.prototype.options;t.a.prototype.init=t.a.prototype.i;t.a.prototype.dispose=t.a.prototype.dispose;t.a.prototype.createEl=t.a.prototype.e;t.a.prototype.contentEl=t.a.prototype.ka;t.a.prototype.el=t.a.prototype.w;t.a.prototype.addChild=t.a.prototype.R;\nt.a.prototype.getChild=t.a.prototype.la;t.a.prototype.getChildById=t.a.prototype.zd;t.a.prototype.children=t.a.prototype.children;t.a.prototype.initChildren=t.a.prototype.vc;t.a.prototype.removeChild=t.a.prototype.removeChild;t.a.prototype.on=t.a.prototype.d;t.a.prototype.off=t.a.prototype.p;t.a.prototype.one=t.a.prototype.X;t.a.prototype.trigger=t.a.prototype.m;t.a.prototype.triggerReady=t.a.prototype.Ga;t.a.prototype.show=t.a.prototype.show;t.a.prototype.hide=t.a.prototype.W;\nt.a.prototype.width=t.a.prototype.width;t.a.prototype.height=t.a.prototype.height;t.a.prototype.dimensions=t.a.prototype.sd;t.a.prototype.ready=t.a.prototype.J;t.a.prototype.addClass=t.a.prototype.n;t.a.prototype.removeClass=t.a.prototype.q;t.a.prototype.buildCSSClass=t.a.prototype.T;t.a.prototype.localize=t.a.prototype.s;t.Player.prototype.ended=t.Player.prototype.ended;t.Player.prototype.enterFullWindow=t.Player.prototype.pc;t.Player.prototype.exitFullWindow=t.Player.prototype.Db;\nt.Player.prototype.preload=t.Player.prototype.Da;t.Player.prototype.remainingTime=t.Player.prototype.remainingTime;t.Player.prototype.supportsFullScreen=t.Player.prototype.Ea;t.Player.prototype.currentType=t.Player.prototype.od;t.Player.prototype.language=t.Player.prototype.language;t.Player.prototype.languages=t.Player.prototype.Va;$(\"videojs.MediaLoader\",t.cd);$(\"videojs.TextTrackDisplay\",t.fc);$(\"videojs.ControlBar\",t.Ja);$(\"videojs.Button\",t.t);$(\"videojs.PlayToggle\",t.ac);\n$(\"videojs.FullscreenToggle\",t.Ka);$(\"videojs.BigPlayButton\",t.gb);$(\"videojs.LoadingSpinner\",t.Zb);$(\"videojs.CurrentTimeDisplay\",t.ib);$(\"videojs.DurationDisplay\",t.jb);$(\"videojs.TimeDivider\",t.gc);$(\"videojs.RemainingTimeDisplay\",t.qb);$(\"videojs.LiveDisplay\",t.Yb);$(\"videojs.ErrorDisplay\",t.kb);$(\"videojs.Slider\",t.Q);$(\"videojs.ProgressControl\",t.pb);$(\"videojs.SeekBar\",t.cc);$(\"videojs.LoadProgressBar\",t.mb);$(\"videojs.PlayProgressBar\",t.$b);$(\"videojs.SeekHandle\",t.Ma);\n$(\"videojs.VolumeControl\",t.sb);$(\"videojs.VolumeBar\",t.rb);$(\"videojs.VolumeLevel\",t.hc);$(\"videojs.VolumeMenuButton\",t.sa);$(\"videojs.VolumeHandle\",t.tb);$(\"videojs.MuteToggle\",t.ja);$(\"videojs.PosterImage\",t.La);$(\"videojs.Menu\",t.ia);$(\"videojs.MenuItem\",t.I);$(\"videojs.MenuButton\",t.L);$(\"videojs.PlaybackRateMenuButton\",t.bc);t.L.prototype.createItems=t.L.prototype.wa;t.V.prototype.createItems=t.V.prototype.wa;t.Ia.prototype.createItems=t.Ia.prototype.wa;$(\"videojs.SubtitlesButton\",t.Na);\n$(\"videojs.CaptionsButton\",t.Ha);$(\"videojs.ChaptersButton\",t.Ia);$(\"videojs.MediaTechController\",t.u);t.u.prototype.features=t.u.prototype.o;t.u.prototype.o.volumeControl=t.u.prototype.o.Sc;t.u.prototype.o.fullscreenResize=t.u.prototype.o.oe;t.u.prototype.o.progressEvents=t.u.prototype.o.re;t.u.prototype.o.timeupdateEvents=t.u.prototype.o.ue;t.u.prototype.setPoster=t.u.prototype.Jc;$(\"videojs.Html5\",t.g);t.g.Events=t.g.lb;t.g.isSupported=t.g.isSupported;t.g.canPlaySource=t.g.wb;\nt.g.patchCanPlayType=t.g.Bc;t.g.unpatchCanPlayType=t.g.je;t.g.prototype.setCurrentTime=t.g.prototype.Qb;t.g.prototype.setVolume=t.g.prototype.de;t.g.prototype.setMuted=t.g.prototype.ae;t.g.prototype.setPreload=t.g.prototype.ce;t.g.prototype.setAutoplay=t.g.prototype.Yd;t.g.prototype.setLoop=t.g.prototype.$d;t.g.prototype.enterFullScreen=t.g.prototype.oc;t.g.prototype.exitFullScreen=t.g.prototype.wd;t.g.prototype.playbackRate=t.g.prototype.playbackRate;t.g.prototype.setPlaybackRate=t.g.prototype.be;\n$(\"videojs.Flash\",t.f);t.f.isSupported=t.f.isSupported;t.f.canPlaySource=t.f.wb;t.f.onReady=t.f.onReady;$(\"videojs.TextTrack\",t.C);t.C.prototype.label=t.C.prototype.label;t.C.prototype.kind=t.C.prototype.K;t.C.prototype.mode=t.C.prototype.mode;t.C.prototype.cues=t.C.prototype.nd;t.C.prototype.activeCues=t.C.prototype.ed;$(\"videojs.CaptionsTrack\",t.Wb);$(\"videojs.SubtitlesTrack\",t.dc);$(\"videojs.ChaptersTrack\",t.Xb);$(\"videojs.autoSetup\",t.jc);$(\"videojs.plugin\",t.Wd);$(\"videojs.createTimeRange\",t.Ab);\n$(\"videojs.util\",t.ha);t.ha.mergeOptions=t.ha.Wa;t.addLanguage=t.fd;})();\n"
  },
  {
    "path": "bin/app.js",
    "content": "#!/usr/bin/env node\n'use strict';\n\n/**\n * Serve que quality of a required package using mongodb\n * (C) 2015 Diego Lafuente.\n */\n\n// requires\nrequire('prototypes');\nvar config = require('../config.js');\nvar server = require('../lib/server.js');\nvar Log = require('log');\n\n// globals\nvar log = new Log(config.logLevel);\n\nserver.startServer(function(error)\n{\n\tif (error) {\n\t\treturn log.error('Could not start server: %s', error);\n\t}\n\tlog.info('Server listening on port %s', config.expressPort);\n});\n\n"
  },
  {
    "path": "bin/update.js",
    "content": "#!/usr/bin/env node\n'use strict';\n\n/**\n * Update packages in pending collection\n * (C) 2015 Diego Lafuente.\n */\n\n// requires\nrequire('prototypes');\nvar update = require('../lib/update.js');\nvar config = require('../config.js');\nvar Log = require('log');\n\n// globals\nvar log = new Log(config.logLevel);\n\n\nfunction updateAll()\n{\n\t// set update token for github\n\tconfig.githubToken = config.githubTokenUpdate;\n\tupdate.goOver(function(error, result)\n\t{\n\t\tif (error)\n\t\t{\n\t\t\tlog.error('Could not evaluate all: %s', error);\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tlog.info('Processed ' + result + ' chunks of approx ' + config.limit + ' elements each.');\n\t\tprocess.exit(0);\n\t});\n}\n\nupdateAll();\n\n"
  },
  {
    "path": "config.js",
    "content": "'use strict';\n\n/**\n * Global config settings.\n * (C) 2015 Diego Lafuente.\n */\n\n // requires\nvar Log = require('log');\n\n// globals\nexports.logLevel = 'info';\nvar log = new Log(exports.logLevel);\n\nexports.limit = 100;\nexports.expressPort = 8080;\nexports.packagesCollection = 'packages';\nexports.pendingCollection = 'pending';\nexports.mongoConnection = 'mongodb://localhost/quality?autoReconnect=true&connectTimeoutMS=5000';\nexports.testMongoConnection = 'mongodb://localhost/qualitytest?autoReconnect=true&connectTimeoutMS=5000';\nexports.githubToken = '';\nexports.githubTokenUpdate = '';\nexports.githubApiMaxCallsReachedError = 'MAX_GITHUB_API_CALLS_REACHED';\nexports.packageExpiration = 3600;\n\ntry {\n    var localConfig = require('./local-config.js');\n    for (var key in localConfig) {\n        exports[key] = localConfig[key];\n    }\n} catch(exception) {\n    log.notice('local-config.js not found');\n}"
  },
  {
    "path": "download.sh",
    "content": "#!/bin/bash\n# Download a fresh copy of all.json\n# (C) 2015 Alex Fernández\nDIR=$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd )\nwget http://registry.npmjs.org/-/all -O $DIR/all.json\n\n"
  },
  {
    "path": "index.js",
    "content": "'use strict';\n\n/**\n * Starts the server.\n * (C) 2014 Alex Fernández.\n */\n\n\n// requires\nvar app = require('./bin/app.js');\n\napp.startServer(function(){});\n\n\n"
  },
  {
    "path": "lib/badges.js",
    "content": "'use strict';\n\n// requires\nrequire('prototypes');\nvar Canvas = require('canvas');\nvar testing = require('testing');\nvar fs = require('fs');\nvar basicRequest = require('basic-request');\nvar Log = require('log');\nvar config = require('../config.js');\nvar qs = require('querystring');\n\n// constants\nvar MAX_PACKAGE_NAME = 19;\nvar RATING_PARAM = '$rating$';\nvar COLOR_PARAM = '$color$';\nvar SHIELDS_IO_URL = 'https://img.shields.io/badge/quality-' + RATING_PARAM + '-' + COLOR_PARAM + '.svg?';\nvar MAX_SIZE = 3;\n\n// globals\nvar log = new Log(config.logLevel);\nvar BADGES_BY_SIZE = [];\nvar STARS_BY_SIZE = [];\n[1, 2, 3].forEach(function (size) {\n\tBADGES_BY_SIZE.push(readImage('badge2', size));\n\tvar stars = {};\n\tfor (var value = 0.5; value <= 5; value += 0.5) stars[value] = readImage('stars' + value, size);\n\tSTARS_BY_SIZE.push(stars);\n});\n\nfunction readImage (name, size) {\n\treturn fs.readFileSync(__dirname + '/../app/img/' + name + '_x' + size + '.png');\n}\n\nvar ranges = [\n\t[0, 1],\n\t[12, 25],\n\t[37, 50],\n\t[62, 75],\n\t[87, 99],\n];\nvar colors = {\n\t0: 'lightgrey',\n\t0.5: 'red',\n\t1: 'red',\n\t1.5: 'red',\n\t2: 'orange',\n\t2.5: 'orange',\n\t3: 'yellow',\n\t3.5: 'yellow',\n\t4: 'lightgreen',\n\t4.5: 'green',\n\t5: 'brightgreen',\n};\n\n\nfunction getStarsCount(score) {\n\tif (!score)\n\t{\n\t\treturn 0;\n\t}\n\tvar range;\n\tfor (var i = 0, len = ranges.length; i < len; i++) {\n\t\trange = ranges[i];\n\t\tif (score < range[0]) {\n\t\t\treturn i;\n\t\t}\n\t\tif (score < range[1]) {\n\t\t\treturn i + '.5';\n\t\t}\n\t}\n\treturn '5';\n}\n\nfunction getStarsImage(score, size) {\n\treturn STARS_BY_SIZE[size - 1][getStarsCount(score)];\n}\n\nexports.compileBadge = function (name, quality, size, callback) {\n\tsize = size || 1;\n\tif (size > MAX_SIZE) size = MAX_SIZE;\n\tif (size < 1) size = 1;\n\n\tif (name.length > MAX_PACKAGE_NAME) {\n\t\tname = name.slice(0, MAX_PACKAGE_NAME - 3) + '...';\n\t}\n\tvar canvas = Canvas.createCanvas(256 * size, 64 * size);\n\tvar context = canvas.getContext('2d');\n\n\tvar image = new Canvas.Image();\n\timage.src = BADGES_BY_SIZE[size - 1];\n\tcontext.drawImage(image, 0, 0, 256 * size, 64 * size);\n\n\tcontext.font = (15 * size) + 'px monospace';\n\tcontext.textAlign = 'right';\n\tcontext.fillText(name, 244 * size, 23 * size);\n\n\tvar starsImage = new Canvas.Image();\n\tstarsImage.src = getStarsImage(quality, size);\n\tcontext.drawImage(starsImage, 155 * size, 27 * size, 92 * size, 17 * size);\n\n\t//canvas.toDataURL('image/png', callback);\n\tcanvas.toBuffer(callback);\n};\n\nfunction convertToText(stars)\n{\n\tvar text = '';\n\tfor (var i = 0; i < 5; i++)\n\t{\n\t\tif (stars <= i)\n\t\t{\n\t\t\ttext += '☆';\n\t\t}\n\t\telse if (stars >= i + 1)\n\t\t{\n\t\t\ttext += '★';\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttext += '½';\n\t\t}\n\t}\n\treturn text;\n}\n\nfunction testStarsText(callback)\n{\n\ttesting.assertEquals(convertToText(0), '☆☆☆☆☆', callback);\n\ttesting.assertEquals(convertToText(0.5), '½☆☆☆☆', callback);\n\ttesting.assertEquals(convertToText(1), '★☆☆☆☆', callback);\n\ttesting.assertEquals(convertToText(3.5), '★★★½☆', callback);\n\ttesting.assertEquals(convertToText(5), '★★★★★', callback);\n\ttesting.success(callback);\n}\n\nfunction convertToColor(stars)\n{\n\treturn colors[stars];\n}\n\nexports.retrieveShield = function(name, quality, queryString, callback)\n{\n\tvar stars = getStarsCount(quality);\n\tvar text = convertToText(stars);\n\tlog.info('Shield for %s: quality %s, stars %s, text %s', name, quality, stars, text);\n  var escaped = qs.escape(text);\n  \n\tvar color = convertToColor(stars);\n\tvar url = SHIELDS_IO_URL.replace(RATING_PARAM, escaped).replace(COLOR_PARAM, color) + queryString;\n\tbasicRequest.get(url, function(error, body)\n\t{\n\t\tif (error)\n\t\t{\n\t\t\tlog.error('Could not get shield for %s from %s: %s', name, url, error);\n\t\t\treturn callback('Could not retrieve badge');\n\t\t}\n\t\treturn callback(null, body);\n\t});\n};\n\nfunction testRetrieveShield(callback)\n{\n\texports.retrieveShield('test', 65, '', function(error, result)\n\t{\n\t\ttesting.check(error, 'Could not retrieve shield', callback);\n\t\ttesting.assert(result.contains('★★★½☆'), 'Result %s should contain stars', result, callback);\n\t\ttesting.success(callback);\n\t});\n}\n\nexports.test = function(callback)\n{\n\ttesting.run([\n\t\ttestStarsText,\n\t\ttestRetrieveShield,\n\t], callback);\n};\n\n// run tests if invoked directly\nif (__filename == process.argv[1])\n{\n\texports.test(testing.show);\n}\n"
  },
  {
    "path": "lib/cache.js",
    "content": "'use strict';\n\n/**\n * A simple cache.\n * (C) 2015 Diego Lafuente.\n */\n\n // requires\nrequire('prototypes');\nvar moment = require('moment');\nvar testing = require('testing');\n\n// globals\nvar defaultExpiration = 20.0;\nvar cache = {};\n\n/**\n * Sets a value for a key in the cache. An optional expiration parameter will set the life of the register.\n * @param key[required]: the key that wants to be set in the cache. Will return false if key is null of undefined.\n * @param value[optional]: the value to be set in the cache.\n * @param expiration[optional]: the expiration (in seconds) for the key-value pair. If falsy, defaultExpiration will apply.\n * @return true if everything went ok, false otherwise.\n */\nexports.set = function(key, value, expiration) \n{\n\tif (key === null || key === undefined)\n\t{\n\t\treturn false;\n\t}\n\texpiration = expiration || defaultExpiration;\n\tcache[key] = {\n\t\tvalue: value,\n\t\texpiration: moment().add(expiration, 'seconds')\n\t};\n\treturn true;\n};\n\n/**\n * Gets a value for a key in the cache. Will return null if the value for the key is null, if the registry has expired or if it does not exist.\n * @param key[required]: the key that wants to be fetched from the cache. \n * @return the value stored in the cache. Will return null if the value for the key is null, if the registry has expired or if it does not exist.\n */\nexports.get = function(key) \n{\n\tif (key === null || key === undefined || cache[key] === undefined)\n\t{\n\t\treturn null;\n\t}\n\tif (cache[key].expiration < moment())\n\t{\n\t\tdelete cache[key];\n\t\treturn null;\n\t}\n\treturn cache[key].value;\n};\n\n/*\n * Clears the cache\n */\nexports.clear = function ()\n{\n\tcache = {};\n};\n\n/*\n * Clears the interval (only for test purposes)\n */\n exports.clearInterval = function ()\n {\n \tclearInterval(interval);\n };\n\n/*\n * Clears the expired registries\n */\nfunction clearExpired()\n{\n\tvar now = moment();\n\tfor (var key in cache)\n\t{\n\t\tif (cache[key].expiration < now)\n\t\t{\n\t\t\tdelete cache[key];\n\t\t}\n\t}\n}\n\n// Set periodic task to clear cache\nvar interval = setInterval(clearExpired, defaultExpiration * 1000);\n\n/************************************************\n **************** UNIT TESTS ********************\n ************************************************/\nfunction testSetInvalidKey(callback)\n{\n\ttesting.assertEquals(exports.set(), false, 'trying to set with undefined key should return false', callback);\n\ttesting.assertEquals(exports.set(null, 'valid'), false, 'trying to set with null key should return false', callback);\n\ttesting.success(callback);\n}\n\nfunction testGetInvalidKey(callback)\n{\n\ttesting.assert(exports.get() === null, 'calling get with undefined key should return null', callback);\n\ttesting.assert(exports.get(null) === null, 'calling get with null key should return null', callback);\n\ttesting.assert(exports.get('unexisting') === null, 'calling get with unexisting key should return null', callback);\n\ttesting.success(callback);\n}\n\nfunction testClearExpired(callback)\n{\n\tvar key = 'testkey';\n\tvar value = 'testvalue';\n\tvar expiration = 1.0;\n\ttesting.assert(exports.set(key, value, expiration), 'valid set did not return true',callback);\n\ttesting.assert(cache[key], 'cache should have the entered key', callback);\n\tsetTimeout(function() {\n\t\tclearExpired();\n\t\ttesting.check(cache[key], callback);\n\t\ttesting.success(callback);\n\t}, expiration * 1000 + 1000);\n}\n\nfunction testValidCycleCache(callback) \n{\n\tvar key = 'testkey';\n\tvar value = 'testvalue';\n\tvar expiration = 1.0;\n\ttesting.assertEquals(cache.countProperties(), 0, 'cache should be empty in the beginning', callback);\n\ttesting.assert(exports.set(key, value, expiration), 'valid set did not return true',callback);\n\ttesting.assertEquals(exports.get(key), value, 'wrong value returned by cache.get', callback);\n\tsetTimeout(function() {\n\t\ttesting.assert(exports.get(key) === null, 'expired key should return null', callback);\n\t\ttesting.success(callback);\n\t}, expiration * 1000);\n}\n\n/**\n * Run all tests.\n */\nexports.test = function(callback)\n{\n\ttesting.run([\n\t\ttestSetInvalidKey,\n\t\ttestGetInvalidKey,\n\t\ttestClearExpired,\n\t\ttestValidCycleCache\n\t], 10000, function(error, result) {\n\t\texports.clearInterval();\n\t\treturn callback(error, result);\n\t});\n};\n\n// run tests if invoked directly\nif (__filename == process.argv[1])\n{\n\texports.test(testing.show);\n}\n\n\n\n"
  },
  {
    "path": "lib/cached-request.js",
    "content": "'use strict';\n\n/**\n * Wrapper over the request library featuring a cache.\n * (C) 2015 Diego Lafuente.\n */\n\n// requires\nvar config = require('../config.js');\nvar requestLib = require('request');\nvar cache = require('./cache.js');\nvar testing = require('testing');\nvar Log = require('log');\n\n// globals\nvar log = new Log(config.logLevel);\n\n/**\n * Wraps request.get including the cache option\n * @param url[required]: the url to call\n * @param shouldCache[optional]: boolean indicating if the request should be cached. Defaults to false.\n * @param callback[required]: a function(error, response, body) to be called when finished\n */\n exports.get = function(url, shouldCache, callback) {\n \tif (typeof shouldCache === 'function') {\n \t\tcallback = shouldCache;\n \t\tshouldCache = false;\n \t}\n \t// check cache if needed\n \tif (shouldCache) {\n\t \tvar cachedResponse = cache.get(url);\n\t \tif (cachedResponse) {\n\t \t\tlog.debug('returning cached response for ' + url);\n\t \t\treturn callback (null, null, cachedResponse);\n\t \t} \n \t}\n \trequestLib.get(url, function(error, response, body) {\n \t\t// cache response if everything ok and cache is true\n \t\tif (shouldCache && !error && response.statusCode === 200) {\n \t\t\tlog.debug('setting cahe for ' + url);\n \t\t\tcache.set(url, body);\n \t\t}\n \t\treturn callback (error, response, body);\n \t});\n};\n\n/************************************************\n **************** UNIT TESTS ********************\n ************************************************/\nfunction testShouldCacheOmitted(callback) {\n\tvar testUrl = 'testUrl';\n\t//stubs\n\tvar restoreRequestLibGet = requestLib.get;\n\trequestLib.get = function(url, internalCallback) {\n\t\ttesting.assertEquals(url, testUrl, 'wrong url passed to request.get', callback);\n\t\treturn internalCallback(null, 'testResponse', 'testBody');\n\t};\n\tvar restoreCache = cache;\n\tcache = {\n\t\tget: function() {\n\t\t\ttesting.assert(false, 'cache.get should not be called');\n\t\t},\n\t\tset: function() {\n\t\t\ttesting.assert(false, 'cache.set should not be called');\n\t\t}\n\t};\n\n\texports.get(testUrl, function (error, response, body) {\n\t\ttesting.check(error, callback);\n\t\ttesting.assertEquals(response, 'testResponse', 'wrong response', callback);\n\t\ttesting.assertEquals(body, 'testBody', 'wrong response', callback);\n\t\t// restore\n\t\tcache = restoreCache;\n\t\trequestLib.get = restoreRequestLibGet;\n\t\ttesting.success(callback);\n\t});\n}\n\nfunction testShouldCacheFalse(callback) {\n\tvar testUrl = 'testUrl';\n\t//stubs\n\tvar restoreRequestLibGet = requestLib.get;\n\trequestLib.get = function(url, internalCallback) {\n\t\ttesting.assertEquals(url, testUrl, 'wrong url passed to request.get', callback);\n\t\treturn internalCallback(null, 'testResponse', 'testBody');\n\t};\n\tvar restoreCache = cache;\n\tcache = {\n\t\tget: function() {\n\t\t\ttesting.assert(false, 'cache.get should not be called');\n\t\t},\n\t\tset: function() {\n\t\t\ttesting.assert(false, 'cache.set should not be called');\n\t\t}\n\t};\n\n\texports.get(testUrl, false, function (error, response, body) {\n\t\ttesting.check(error, callback);\n\t\ttesting.assertEquals(response, 'testResponse', 'wrong response', callback);\n\t\ttesting.assertEquals(body, 'testBody', 'wrong response', callback);\n\t\t// restore\n\t\tcache = restoreCache;\n\t\trequestLib.get = restoreRequestLibGet;\n\t\ttesting.success(callback);\n\t});\n}\n\nfunction testShouldCacheTrue(callback) {\n\tvar testUrl = 'testUrl';\n\t//stubs\n\tvar restoreRequestLibGet = requestLib.get;\n\trequestLib.get = function(url, internalCallback) {\n\t\ttesting.assertEquals(url, testUrl, 'wrong url passed to request.get', callback);\n\t\treturn internalCallback(null, {statusCode: 200}, 'testBody');\n\t};\n\tvar restoreCache = cache;\n\tcache = {\n\t\tget: function(key) {\n\t\t\ttesting.assertEquals(key, testUrl, 'wrong url passed to cache.get', callback);\n\t\t},\n\t\tset: function(key, value) {\n\t\t\ttesting.assertEquals(key, testUrl, 'wrong url passed to cache.set', callback);\n\t\t\ttesting.assertEquals(value, 'testBody', 'wrong url passed to cache.set', callback);\n\t\t}\n\t};\n\n\texports.get(testUrl, true, function (error, response, body) {\n\t\ttesting.check(error, callback);\n\t\ttesting.assertEquals(body, 'testBody', 'wrong response', callback);\n\t\t// restore\n\t\tcache = restoreCache;\n\t\trequestLib.get = restoreRequestLibGet;\n\t\ttesting.success(callback);\n\t});\n}\n\n/**\n * Run all tests.\n */\nexports.test = function(callback)\n{\n    testing.run([\n    \ttestShouldCacheOmitted,\n    \ttestShouldCacheFalse,\n    \ttestShouldCacheTrue\n    ], function (error, result) {\n    \tcache.clearInterval();\n    \treturn callback (error, result);\n    });\n};\n\n// run tests if invoked directly\nif (__filename == process.argv[1])\n{\n    exports.test(testing.show);\n}"
  },
  {
    "path": "lib/db.js",
    "content": "'use strict';\n\n/*\n * TuiInnovation database class.\n * Connect to MongoDB, return a collection.\n *\n * Copyright (C) 2013 TuiInnovation.\n */\n\n// requires\nvar MongoClient = require('mongodb').MongoClient;\nvar config = require('../config.js');\nvar Log = require('log');\nvar testing = require('testing');\n\n// globals\nvar log = new Log(config.logLevel);\nvar currentDb = null\nvar currentClient = null\nvar callbacks = [];\nvar isClosed = null;\nvar connectionString = config.mongoConnection;\n\n// init\nconnect();\n\n/**\n * Connect to the database.\n */\nfunction connect() {\n\tvar connection = connectionString;\n\tMongoClient.connect(connection, {w: 1}, function(error, client) {\n\t\tif (connectionString != connection) {\n\t\t\t// connection string changed on the fly; close and ignore\n\t\t\tlog.debug('Discarding open connection to %s', connection);\n\t\t\tclient.close();\n\t\t\treturn;\n\t\t}\n\t\tif (error) {\n\t\t\tlog.error('Could not connect to MongoDB: %s', error);\n\t\t} else {\n\t\t\t//close db before assigning a new one\n\t\t\tlog.debug('opening database: ' +  connectionString);\n\t\t\tif (currentDb) {\n\t\t\t\tcurrentClient.close(true)\n\t\t\t}\n\t\t\tcurrentDb = client.db('quality')\n\t\t\tisClosed = false;\n\t\t\twhile (callbacks.length > 0) {\n\t\t\t\tvar callback = callbacks.shift();\n\t\t\t\tcallback(error, currentDb);\n\t\t\t}\n\t\t\t\n\t\t}\n\t});\n}\n\n/**\n * Check whether the db is open or closed\n */\nexports.isClosed = function() {\n\treturn (isClosed !== false);\n};\n\n/**\n * Add a new callback for database online.\n */\nexports.addCallback = function(callback) {\n\tif (currentDb) {\n\t\tif (isClosed === true) {\n\t\t\tcallbacks.push(callback);\n\t\t\treturn connect();\n\t\t}\n\t\t// db open\n\t\treturn callback(null, currentDb);\n\t}\n\tcallbacks.push(callback);\n};\n\n/**\n * Reconnect to the database, possibly with different paramters.\n */\nexports.reconnect = function(callback) {\n\tif (callback) {\n\t\tcallbacks.push(callback);\n\t}\n\treturn connect();\n};\n\n/**\n * Closes the db connection\n */\nexports.close = function(callback) {\n\tif (!currentDb)\n\t{\n\t\treturn callback(null);\n\t}\n\tcurrentClient.close(true, function (error, result) {\n\t\tisClosed = true;\n\t\tcallback (error, result);\n\t});\n};\n\n/**\n * Get a collection.\n */\nexports.getCollection = function(name) {\n\tif (!currentDb) {\n\t\treturn null;\n\t}\n\treturn currentDb.collection(name);\n};\n\nexports.setTestMode = function()\n{\n\tconnectionString = config.testMongoConnection;\n};\n\nexports.unsetTestMode = function()\n{\n\tconnectionString = config.mongoConnection;\n};\n\n/***********************************\n ************ UNIT TESTS ***********\n ***********************************/\n\nfunction testCollection(callback) {\n\texports.addCallback(function(error) {\n\t\ttesting.check(error, 'Could not start database', callback);\n\t\ttesting.assertEquals(isClosed, false, 'Did not open database', callback);\n\t\tvar test = exports.getCollection('test');\n\t\ttesting.assert(test, 'Empty test collection', callback);\n\t\ttest.count(function(error) {\n\t\t\ttesting.check(error, 'Could not get test count');\n\t\t\ttesting.success(callback);\n\t\t});\n\t});\n}\n\nfunction testReconnect(callback) {\n\texports.setTestMode();\n\texports.reconnect(function() {\n\t\ttesting.assertEquals(isClosed, false, 'Did not open database', callback);\n\t\tvar test = exports.getCollection('test');\n\t\ttesting.assert(test, 'Empty test collection', callback);\n\t\ttest.count(function(error/*, count*/) {\n\t\t\ttesting.check(error, 'Could not get test count: ' + JSON.stringify(error));\n\t\t\texports.unsetTestMode();\n\t\t\ttesting.success(callback);\n\t\t});\n\t});\n}\n\nfunction testClose(callback) {\n\texports.close(function(error) {\n\t\ttesting.check(error, 'Could not close database', callback);\n\t\ttesting.assertEquals(isClosed, true, 'wrong value for isClosed', callback);\n\t\t//add callback and check that the db opens again\n\t\texports.addCallback(function(error) {\n\t\t\ttesting.check(error, 'Could not start database', callback);\n\t\t\ttesting.assertEquals(isClosed, false, 'Did not open database', callback);\n\t\t\tvar test = exports.getCollection('test');\n\t\t\ttesting.assert(test, 'Empty test collection', callback);\n\t\t\ttest.count(function(error) {\n\t\t\t\ttesting.check(error, 'Could not get test count');\n\t\t\t\ttesting.success(callback);\n\t\t\t});\n\t\t});\n\t});\n}\n\n/**\n * Run all tests.\n */\nexports.test = function(callback) {\n\ttesting.run({\n\t\treconnect: testReconnect,\n\t\tcollection: testCollection,\n\t\tclose: testClose\n\t}, function(error, result) {\n\t\texports.close(function(/*err*/) {\n\t\t\tlog.debug ('closing mongo');\n\t\t\tcallback (error, result);\n\t\t});\n\t});\n};\n\n// start tests if invoked directly\nif (__filename == process.argv[1]) {\n    exports.test(testing.show);\n}\n"
  },
  {
    "path": "lib/estimation.js",
    "content": "'use strict';\n\n/**\n * Read info about a package and estimate its quality.\n * (C) 2014 Alex Fernández.\n */\n\n// requires\nrequire('prototypes');\nvar config = require('../config.js');\nvar async = require('async');\nvar moment = require('moment');\nvar testing = require('testing');\nvar Log = require('log');\n\n// globals\nvar log = new Log(config.logLevel);\nvar factors = {\n\tdownloads: require('./factors/downloads.js'),\n\tissues: require('./factors/issues.js'),\n\tversions: require('./factors/versions.js')\n};\n\n\n/**\n * Estimates the quality of a package based on a number of factors.\n * @param entry[required]: an object describing a package as returned by http://registry.npmjs.org/-/all\n * @param callback[required]: a function(error, result) to be called when finished\n * @return This method returns through the callback parameter. Returns an error if the entry is invalid (i.e. has no name)\n * or if any of the factors return an error. If there is no error, the result is always an object.\n * Each key of the result object is the name of a measured factor and the value is an array of two elements (both of \n * them floats between 0.0 and 1.0): the first is the value of the estimated factor, and the second is the weight of \n * this factor in the overall average.\n */\nexports.estimate = function(entry, callback)\n{\n\tif (!entry || !entry.name)\n\t{\n\t\tlog.error('null entry or entry without name: ' + JSON.stringify(entry));\n\t\treturn callback(JSON.stringify(entry) + ' is null or has no name');\n\t}\n\tlog.info('Estimating package: ' + entry.name);\n\tvar now = moment().format();\n\tvar estimation = {\n\t\tname: entry.name,\n\t\tdescription: entry.description,\n\t\tsource: 'npm',\n\t\tlastUpdated: now\n\t};\n\t// stream of factors\n\tvar stream = [];\n\tObject.keys(factors).forEach(function (factorName) {\n\t\tvar factor = factors[factorName];\n\t\tstream.push(function (callback)\n\t\t{\n\t\t\tfactor.estimate(entry, function(error, result) {\n\t\t\t\tif (error)\n\t\t\t\t{\n\t\t\t\t\treturn callback(error);\n\t\t\t\t}\n\t\t\t\testimation = estimation.concat(result);\n\t\t\t\treturn callback(null);\n\t\t\t});\n\t\t});\n\t});\n\t// async!!\n\tasync.parallel(stream, function (error)\n\t{\n\t\tif (error) {\n\t\t\treturn callback(error);\n\t\t}\n\t\treturn callback(null, estimation);\n\t});\n};\n\n/**\n * Calculates the total quality of an estimation and adds it to the given estimation object.\n * @param estimation[required]: the object with the different factors using the [quality, weight] format.\n * @return The estimation with the 'quality' field calculated and added\n */\nexports.addQuality = function(estimation)\n{\n\tvar numerator = 0;\n\tvar denominator = 0;\n\testimation.quality = 0;\n\tfor (var factor in estimation)\n\t{\n\t\tif (estimation[factor] instanceof Array && estimation[factor].length === 2)\n\t\t{\n\t\t\tvar quality = typeof estimation[factor][0] === 'number' ? estimation[factor][0] : 0;\n\t\t\tvar weight = typeof quality === 'number' ? estimation[factor][1] : 0;\n\t\t\tnumerator += (weight * quality);\n\t\t\tdenominator += weight;\n\t\t}\n\t}\n\tif (denominator !== 0)\n\t{\n\t\testimation.quality = numerator/denominator;\n\t}\n\treturn estimation;\n};\n\n/************************************************\n **************** UNIT TESTS ********************\n ************************************************/\nfunction testEstimateInvalidEntry(callback)\n{\n\tvar entry = {};\n\texports.estimate(entry, function (error, result) {\n\t\ttesting.check(result, callback);\n\t\ttesting.assert(error, 'invalid entry should alwasy return an error', callback);\n\t\ttesting.success(callback);\n\t});\n}\n\nfunction testEstimateValidEntryOneFactorReturnsError(callback)\n{\n\tvar entry = require('../test/test_entry.json');\n\t// stub factors\n\tfactors = {\n\t\tdownloads: {\n\t\t\testimate: function(name, internalCallback) {\n\t\t\t\treturn internalCallback(null, {downloads: 1});\n\t\t\t}\n\t\t},\n\t\tissues: {\n\t\t\testimate: function(repo, internalCallback) {\n\t\t\t\treturn internalCallback({check:true});\n\t\t\t}\n\t\t},\n\t\tversions: {\n\t\t\testimate: function(name, internalCallback) {\n\t\t\t\treturn internalCallback(null, {versions: 3});\n\t\t\t}\n\t\t},\n\t};\n\texports.estimate(entry, function (error, result) {\n\t\ttesting.check(result, callback);\n\t\ttesting.assert(error.check, 'estimate did not return the right error when factor failed', callback);\n\t\ttesting.success(callback);\n\t});\n}\n\nfunction testEstimateValidEntry(callback)\n{\n\tvar entry = require('../test/test_entry.json');\n\t// stub moment\n\tvar restore_moment = moment;\n\tmoment = function() {\n\t\treturn {\n\t\t\tformat: function() {\n\t\t\t\treturn 'now';\n\t\t\t}\n\t\t};\n\t};\n\t// stub factors\n\tfactors = {\n\t\tdownloads: {\n\t\t\testimate: function(name, internalCallback) {\n\t\t\t\treturn internalCallback(null, {downloads: 1});\n\t\t\t}\n\t\t},\n\t\tissues: {\n\t\t\testimate: function(repo, internalCallback) {\n\t\t\t\treturn internalCallback(null, {issues: 2});\n\t\t\t}\n\t\t},\n\t\tversions: {\n\t\t\testimate: function(name, internalCallback) {\n\t\t\t\treturn internalCallback(null, {versions: 3});\n\t\t\t}\n\t\t},\n\t};\n\texports.estimate(entry, function (error, result) {\n\t\ttesting.check(error, callback);\n\t\ttesting.assertEquals(result.name, entry.name, 'wrong name returned in estimation', callback);\n\t\ttesting.assertEquals(result.source, 'npm', 'wrong source returned in estimation', callback);\n\t\ttesting.assertEquals(result.lastUpdated, 'now', 'wrong lastUpdated returned in estimation', callback);\n\t\ttesting.assertEquals(result.downloads, 1, 'wrong downloads returned in estimation', callback);\n\t\ttesting.assertEquals(result.issues, 2, 'wrong issues returned in estimation', callback);\n\t\ttesting.assertEquals(result.versions, 3, 'wrong versions returned in estimation', callback);\n\t\t// restore moment\n\t\tmoment = restore_moment;\n\t\ttesting.success(callback);\n\t});\n}\n\nfunction testAddQuality(callback)\n{\n\tvar estimation = {};\n\tvar result = exports.addQuality(estimation);\n\ttesting.assertEquals(result.quality, 0, 'empty estimation should return zero quality', callback);\n\testimation = {kkfu:'tennis', kkfu2:[1,2,3]};\n\tresult = exports.addQuality(estimation);\n\ttesting.assertEquals(result.quality, 0, 'estimation with invalid factors should return zero quality', callback);\n\ttesting.assertEquals(result.kkfu, 'tennis', 'estimation with invalid factors should keep kkfu factor', callback);\n\ttesting.assertEquals(result.kkfu2.length, 3, 'estimation with invalid factors should keep kkfu2 factor', callback);\n\testimation.valid = [1,1];\n\tresult = exports.addQuality(estimation);\n\ttesting.assertEquals(result.quality, 1, 'estimation with invalid factors should return a proper quality', callback);\n\ttesting.assertEquals(result.kkfu, 'tennis', 'estimation with invalid factors should keep kkfu factor', callback);\n\ttesting.assertEquals(result.kkfu2.length, 3, 'estimation with invalid factors should keep kkfu2 factor', callback);\n\ttesting.assertEquals(result.valid.length, 2, 'estimation with invalid factors should keep valid factor', callback);\n\ttesting.success(callback);\n}\n\nfunction testAddQualityInfinity(callback)\n{\n\tvar estimation = require('../test/gulp-filter.json');\n\tvar result = exports.addQuality(estimation);\n\tlog.info(result.quality);\n\ttesting.assert(result.quality < 1, 'quality must always be lower than 1.0', callback);\n\ttesting.assert(result.quality > 0, 'quality must always be higher than 0.0', callback);\n\ttesting.success(callback);\n}\n\n/**\n * Run all tests.\n */\nexports.test = function(callback)\n{\n\ttesting.run([\n\t\ttestEstimateInvalidEntry,\n\t\ttestEstimateValidEntryOneFactorReturnsError,\n\t\ttestEstimateValidEntry,\n\t\ttestAddQuality,\n\t\ttestAddQualityInfinity\n\t], callback);\n};\n\n// run tests if invoked directly\nif (__filename == process.argv[1])\n{\n\texports.test(testing.show);\n}"
  },
  {
    "path": "lib/factors/downloads.js",
    "content": "'use strict';\n\n/**\n * Estimates the quality of a package based on the number of downloads durin the last year.\n * (C) 2015 Diego Lafuente.\n */\n\n// requires\nvar Log = require('log');\nvar config = require('../../config.js');\nvar utils = require('../utils.js');\nvar request = require('request');\nvar moment = require('moment');\nvar testing = require('testing');\n\n// globals\nvar log = new Log(config.logLevel);\n\n/**\n * Estimates the quality of a package based on the number of downloads during last year.\n * @param entry[required]: an object describing a package as returned by http://registry.npmjs.org/-/all\n * @param callback[required]: a function(error, result) to be called when finished\n * @return This method returns through the callback parameter. Returns an error in case something fails. \n * If the error is null, then the result is always object.\n * Each key of the result object is the name of a measured factor and the value is an array of two elements (both of \n * them floats between 0.0 and 1.0): the first is the value of the estimated factor, and the second is the weight of \n * this factor in the overall average.\n */\nexports.estimate = function(entry, callback)\n{\n    if (!entry || !entry.name)\n    {\n        log.error('null entry or entry without name: ' + JSON.stringify(entry));\n        return callback(JSON.stringify(entry) + ' is null or has no name');\n    }\n    var name = entry.name;\n    var estimation = {\n        downloads: [0,1]\n    };\n    var now = moment();\n    var aYearAgo = moment(now).subtract(1,'year');\n    var downloadsUrl = 'http://npm-stat.com/downloads/range/' + aYearAgo.format('YYYY-MM-DD') + ':' + now.format('YYYY-MM-DD') + '/' + utils.urlEncodeRepoName(name);\n    log.debug('Downloads URL: %s', downloadsUrl);\n    request.get(downloadsUrl, function(error, response, body) {\n        if (error || !body)\n        {\n            return callback('Could not read downloads for ' + name + ' (' + downloadsUrl + '): ' + error);\n        }\n        var npmstatResponse;\n        try\n        {\n            npmstatResponse = JSON.parse(body);\n        }\n        catch(exception)\n        {\n            return callback('Could not parse ' + name + ': ' + exception);\n        }\n        var quality = 0;\n        if ('downloads' in npmstatResponse) {\n            var downloads = 0;\n            npmstatResponse.downloads.forEach(function(item) {\n                downloads += item.downloads;\n            });\n            log.debug('Downloads %s', downloads);\n            quality = 1 - 1/downloads;\n        }\n        estimation.downloads = [quality, 1];\n        return callback(null, estimation);\n    });\n};\n\n/************************************************\n **************** UNIT TESTS ********************\n ************************************************/\n function testEstimateInvalidEntry(callback)\n{\n    exports.estimate({}, function (error, estimation) {\n        testing.check(estimation, callback);\n        testing.assert(error, 'invalid entry should return an error', callback);\n        testing.success(callback);\n    });\n}\nfunction testEstimateInvalidPackageName(callback)\n{\n    var entry = {\n        name: 'invalid'\n    };\n    // stub request.get\n    request.get = function(url, internalCallback) {\n        return internalCallback('error');\n    };\n    exports.estimate(entry, function (error, estimation) {\n        testing.check(estimation, callback);\n        testing.assert(error, 'invalid repo should return an error', callback);\n        testing.success(callback);\n    });\n}\n\nfunction testEstimateInvalidJsonReturnedByRegistry(callback)\n{\n    var entry = {\n        name: 'valid'\n    };\n    // stub request.get\n    request.get = function(url, internalCallback) {\n        return internalCallback(null, null, 'invalid_json');\n    };\n    exports.estimate(entry, function (error, estimation) {\n        testing.check(estimation, callback);\n        testing.assert(error, 'if registry returns an error, the factor should return an error', callback);\n        testing.success(callback);\n    });\n}\n\nfunction testEstimateValidEntry(callback)\n{\n    var entry = {\n        name: 'valid'\n    };\n    // stub request.get\n    request.get = function(url, internalCallback) {\n        var response = {downloads: [{downloads: 4}, {downloads: 6}]};\n        return internalCallback(null, null, JSON.stringify(response));\n    };\n    exports.estimate(entry, function (error, estimation) {\n        testing.check(error, callback);\n        testing.assertEquals(estimation.downloads[0], 0.9, 'wrong quality for this repo', callback);\n        testing.success(callback);\n    });\n}\n\n /**\n * Run all tests.\n */\nexports.test = function(callback)\n{\n    testing.run([\n        testEstimateInvalidEntry,\n        testEstimateInvalidPackageName,\n        testEstimateInvalidJsonReturnedByRegistry,\n        testEstimateValidEntry\n    ], callback);\n};\n\n// run tests if invoked directly\nif (__filename == process.argv[1])\n{\n    exports.test(testing.show);\n}\n"
  },
  {
    "path": "lib/factors/issues.js",
    "content": "'use strict';\n\n/**\n * Estimates the quality of a package based on the number of total/open/closed github issues during the last year.\n * (C) 2015 Diego Lafuente.\n */\n\n// requires\nrequire('prototypes');\nvar Log = require('log');\nvar config = require('../../config.js');\nvar utils = require('../utils.js');\nvar request = require('request');\nvar url = require('url');\nvar querystring = require('querystring');\nvar moment = require('moment');\nvar async = require('async');\nvar testing = require('testing');\n\n// globals\nvar log = new Log(config.logLevel);\n\n/**\n * Estimates the quality of a github repo based on its issues (open/closed/total).\n * Receives an object with two fields:\n *    - type: a string indicating the type of repository ('git')\n *    - url: the url of the repo\n * It returns (through the second parameter of the callback) an object with the different\n * factors estimated. It returns an error if something fails (this includes if the system runs out of github API calls)\n * @param entry[required]: an object describing a package as returned by http://registry.npmjs.org/-/all\n * @param callback[required]: a function(error, result) to be called when finished\n * @return This method returns through the callback parameter. Returns an error in case something fails (including running out of github calls)\n * If the error is null, then the result is always object.\n * Each key of the result object is the name of a measured factor and the value is an array of two elements \n * (both of them floats between 0.0 and 1.0): the first is the value of the estimated factor, and the second is the weight of this \n * factor in the overall average.\n */\nexports.estimate = function(entry, callback)\n{\n    if (!entry)\n    {\n        log.error('null entry: ' + JSON.stringify(entry));\n        return callback(JSON.stringify(entry) + ' is null');\n    }\n    var repo = entry.repository;\n    var estimation = {\n        repoTotalIssues: [0, 1],\n        repoOpenIssues: [0, 1],\n        repoLongOpenIssues: [0, 1]\n    };\n    log.debug('estimateRepo %j', repo);\n    var info = extractRepoInfo(repo);\n    if (!info || !info.valid)\n    {\n        log.error('Invalid or null repo: ' + JSON.stringify(repo));\n        return callback(null, estimation);\n    }\n    // get issues for the first page\n    getIssuesForPageLastYear(info.owner, info.name, 1, function (error, result)\n    {\n        if (error)\n        {\n            return callback(error);\n        }\n        // metrics\n        var open = 0;\n        var longOpen = 0;\n        var closed = 0;\n        var total = 0;\n        log.debug('Total number of issues received: %s', result.issues.length);\n        result.issues.forEach(function(issue)\n        {\n            if (!issue)\n            {\n                return log.error('Null issues in %s' + info.name);\n            }\n            total += 1;\n            if (issue.state == 'open')\n            {\n                open += 1;\n                var now = moment();\n                var created = moment(issue.created_at);\n                if (now.diff(created, 'days') > 365)\n                {\n                    longOpen += 1;\n                }\n            }\n            else if (issue.state == 'closed')\n            {\n                closed += 1;\n            }\n            else\n            {\n                log.debug('Invalid state %s', issue.state);\n            }\n        });\n        // is there only one page?\n        if (result.githubIssuesLastPage == 1)\n        {\n            log.debug('Repository ' + info.name + ' has only 1 page of issues');\n            if (total === 0)\n            {\n                estimation.repoTotalIssues = [0, 1];\n                estimation.repoOpenIssues = [0, 1];\n                estimation.repoLongOpenIssues = [0, 1];\n                return callback(null, estimation);\n            }\n            var totalFactor = 1 - 1 / total;\n            var openFactor = (open / total > 0.2) ? 1.2 - open / total : 1;\n            var longOpenFactor = (open > 0) ? 1 - longOpen / open : 1;\n            estimation.repoTotalIssues = [totalFactor, 1];\n            estimation.repoOpenIssues = [openFactor, 1];\n            estimation.repoLongOpenIssues = [longOpenFactor, 1];\n            return callback(null, estimation);\n        }\n        // more than one page. Process pending pages\n        log.info('Repository ' + info.name + ' has ' + result.githubIssuesLastPage + ' pages of issues');\n        var pendingObject = {\n            owner: info.owner,\n            name: info.name,\n            pages: [2, result.githubIssuesLastPage],\n            total: total,\n            open: open,\n            closed: closed,\n            longOpen: longOpen\n        };\n        return pending(pendingObject, callback);\n    });\n};\n\n/**\n * Finishes the measure of quality started by 'estimate'. It receives a pending object, performs the remaining API requests in parallel\n * and returns the result in the callback. Errors are logged but not returned\n * @param pending[required]: an object with the following fields:\n *    - owner: owner of the repository\n *    - name: name of the repository\n *    - pages: an array containing two elements: the next page number to process and the last page number to process\n *    - total: number of total valid issues so far\n *    - open: number of valid open issues so far\n *    - closed: number of valid closed issues so far\n *    - longOpen: number of valid long open issues so far\n * @param callback[required]: a function(error, result) to be called when finished\n * @return This method returns through the callback parameter. Returns an error in case something fails (including running out of github calls)\n * If the error is null, then the result is always object.\n * Each key of the result object is the name of a measured factor and the value is an array of two elements (both of them floats between 0.0 and 1.0): the first is the \n * value of the estimated factor, and the second is the weight of this factor in the overall average. \n */\nfunction pending(pendingObject, callback)\n{\n    log.info('Pending ' + (pendingObject.pages[1] - pendingObject.pages[0]) + ' pages of repo: ' + pendingObject.name + ' - owner: ' + pendingObject.owner);\n    var stream = [];\n    var estimation = {};\n    function streamItem(page)\n    {\n        return function (callback)\n        {\n            getIssuesForPageLastYear(pendingObject.owner, pendingObject.name, page, callback);\n        };\n    }\n    for(var i = pendingObject.pages[0]; i <= pendingObject.pages[1]; i++)\n    {\n        stream.push(streamItem(i));\n    }\n    async.parallel(stream, function (error, results)\n    {\n        if (error) \n        {\n            return callback(error);\n        }\n        var issues = [];\n        results.forEach(function (result)\n        {\n            issues = issues.concat(result.issues);\n        });\n        // metrics\n        var open = pendingObject.open;\n        var longOpen = pendingObject.longOpen;\n        var closed = pendingObject.closed;\n        var total = pendingObject.total;\n        log.debug('Total number of issues received: %s', issues.length);\n        issues.forEach(function(issue)\n        {\n            if (!issue)\n            {\n                return log.error('Null issues in %s' + pendingObject.name);\n            }\n            total += 1;\n            if (issue.state == 'open')\n            {\n                open += 1;\n                var now = moment();\n                var created = moment(issue.created_at);\n                if (now.diff(created, 'days') > 365)\n                {\n                    longOpen += 1;\n                }\n            }\n            else if (issue.state == 'closed')\n            {\n                closed += 1;\n            }\n            else\n            {\n                log.debug('Invalid state %s', issue.state);\n            }\n        });\n        var totalFactor = 1 - 1 / total;\n        var openFactor = (open / total > 0.2) ? 1.2 - open / total : 1;\n        var longOpenFactor = (open > 0) ? 1 - longOpen / open : 1;\n        estimation.repoTotalIssues = [totalFactor, 1];\n        estimation.repoOpenIssues = [openFactor, 1];\n        estimation.repoLongOpenIssues = [longOpenFactor, 1];\n        return callback(null, estimation);\n    });\n}\n\n/**\n * Extracts the info of a repo object\n * @param repo[required]: an object with the following fields:\n *    - type: a string indicating the type of repository ('git')\n *    - url: the url of the repo\n * @return An object containing the following fields:\n *    - valid: true if the provided repo is valid, false otherwise\n *    - owner: the owner of the repo\n *    - name: the name of the repo\n * The object returned is null if the repo object is not complete or if the repo type is not 'git'\n */\nfunction extractRepoInfo(repo)\n{\n    log.debug('extractRepoInfo %j', repo);\n    if (!repo || !repo.type || !repo.url)\n    {\n        log.debug('Incomplete repo. Returning null info.');\n        return null;\n    }\n    if (repo.type != 'git')\n    {\n        log.debug('Invalid repo type: %s', repo.type);\n        return null;\n    }\n    if (repo.url.startsWith('git@github.com:'))\n    {\n        return extractPieces(repo.url.substringFrom('git@github.com:'), 0);\n    }\n    if (repo.url.startsWith('git://github.com:'))\n    {\n        return extractPieces(repo.url.substringFrom('git://github.com:'), 0);\n    }\n    return extractPieces(repo.url, 3);\n    // Auxiliary function to extract pieces\n    function extractPieces(remaining, initial)\n    {\n        var pieces = remaining.split('/');\n        if (pieces.length != initial + 2)\n        {\n            log.debug('Invalid URL %s', remaining);\n            return {};\n        }\n        return {\n            valid: true,\n            owner: pieces[initial],\n            name: pieces[initial + 1].substringUpTo('.git'),\n        };\n    }\n}\n\n/**\n * Makes a request to the github issues API and return an object with the information about the issues retrieved and\n * about the remaining API calls/time. It only returns the issues updated during the last year.\n * @param repoOwner[required]: the owner of the repo\n * @param repoName[required]: the name of the repo\n * @param page[required]: the page number of the issues to be retrieved. First page is page=1.\n * @param callback[required]: a function(error, result) to be called when finished\n * @return This method returns through the callback parameter. Returns an error if something fails\n * If error is null, then result is always an object containing the following fields:\n *    - issues: an array with the issues retrieved as returned by the github API\n *    - githubIssuesLastPage: the last page of issues in this repo.\n */\nfunction getIssuesForPageLastYear (repoOwner, repoName, page, callback)\n{\n    var result = {issues:[]};\n    var aYearAgo = moment().subtract(1,'year').format();\n    var issuesUrl = 'https://api.github.com/repos/' + repoOwner + '/' + utils.urlEncodeRepoName(repoName) + '/issues?per_page=100&state=all&since=' + aYearAgo + '&page=' + page;\n    var pageIssuesUrl = issuesUrl + '&page=' + page;\n    request({method:'GET', uri:pageIssuesUrl, headers:{'User-Agent':'node.js'}, auth:{user:config.githubToken}}, function(error, response, body)\n    {\n        if (error)\n        {\n            return callback('Could not access issues on ' + issuesUrl + ': ' + error);\n        }\n        // check if we exceeded the maximum number of calls to github api\n        if (response.statusCode === 403)\n        {\n            return callback(config.githubApiMaxCallsReachedError);\n        }\n        // check if the github repo does not exist\n        if (response.statusCode === 404)\n        {\n            return callback(null, result);\n        }\n        if (response && response.headers)\n        {\n            result.githubIssuesLastPage = 1;\n            // check if there are pages\n            if (response.headers.link)\n            {\n                try\n                {\n                    var lastPageLinkElement = response.headers.link.split(',').filter(function(element) {\n                        if (element.indexOf('rel=\"last\"') > -1) {\n                            return true;\n                        }\n                        return false;\n                    })[0];\n                    var lastPageUrl = url.parse(lastPageLinkElement.substring(lastPageLinkElement.lastIndexOf('<') + 1,lastPageLinkElement.lastIndexOf('>')));\n                    result.githubIssuesLastPage = parseInt(querystring.parse(lastPageUrl.query).page, 10);\n                }\n                catch(exception)\n                {\n                    log.warning('Repository with LINK gave no last page. Probably this is the last page', response.headers.link);\n                    result.githubIssuesLastPage = 1;\n                }\n            }\n        }\n        try\n        {\n            result.issues  = JSON.parse(body);\n        }\n        catch(exception)\n        {\n            return callback('Could not parse issues returned by ' + issuesUrl + ': ' + exception);\n        }\n        return callback(null, result);\n    });\n}\n\n/************************************************\n **************** UNIT TESTS ********************\n ************************************************/\n\n//getIssuesForPageLastYear tests\n\nfunction testGetIssuesForPageLastYearErrorResponse(callback)\n{\n    //stub request\n    var restoreRequest = request;\n    request = function (params, internalCallback)\n    {\n        internalCallback({check: true});\n    };\n    getIssuesForPageLastYear('repoOwner', 'repoName', 2, function (error, result) {\n        testing.check(result, callback);\n        testing.assert(error, 'no error returned by getIssuesForPageLastYear when the request returns an error', callback);\n        // restore request\n        request = restoreRequest;\n        testing.success(callback);\n    });\n}\n\nfunction testGetIssuesForPageLastYearNoMoreGithubApiCalls(callback)\n{\n    //stub request\n    var restoreRequest = request;\n    request = function (params, internalCallback)\n    {\n        internalCallback(null, {statusCode:403}, '{\"message\":\"API rate limit exceeded\"}');\n    };\n    getIssuesForPageLastYear('repoOwner', 'repoName', 2, function (error, result) {\n        testing.check(result, callback);\n        testing.assertEquals(error, config.githubApiMaxCallsReachedError, 'no error returned by getIssuesForPageLastYear when no more github API calls are available', callback);\n        // restore request\n        request = restoreRequest;\n        testing.success(callback);\n    });\n}\n\nfunction testGetIssuesForPageLastYearPackageNotFound(callback)\n{\n    //stub request\n    var restoreRequest = request;\n    request = function (params, internalCallback)\n    {\n        internalCallback(null, {statusCode:404}, '{\"message\":\"Not found\"}');\n    };\n    getIssuesForPageLastYear('repoOwner', 'repoName', 2, function (error, result) {\n        testing.check(error, callback);\n        testing.assertEquals(result.issues.length, 0, 'not found should return empty issues', callback);\n        // restore request\n        request = restoreRequest;\n        testing.success(callback);\n    });\n}\n\nfunction testValidGetIssuesForPageLastYear(callback)\n{\n    //stub request\n    var restoreRequest = request;\n    request = function (params, internalCallback)\n    {\n        var response = {\n            headers: {\n                'link': 'rel=\"last\"<http://test.com/test?page=12>'\n            }\n        };\n        var body = [{}, {}];\n        internalCallback(null, response, JSON.stringify(body));\n    };\n    getIssuesForPageLastYear('repoOwner', 'repoName', 2, function (error, result) {\n        testing.check(error, callback);\n        testing.assertEquals(result.githubIssuesLastPage, 12, 'wrong last page of issues returned', callback);\n        testing.assertEquals(result.issues.length, 2, 'wrong number of issues returned', callback);\n        // restore request\n        request = restoreRequest;\n        testing.success(callback);\n    });\n}\n\n// extractRepoInfo tests\n\nfunction testExtractRepoInfoInvalidRepo(callback)\n{\n    testing.assertEquals(extractRepoInfo(null), null, 'extractRepoInfo of null did not return null', callback);\n    testing.assertEquals(extractRepoInfo({}), null, 'extractRepoInfo of empty object did not return null', callback);\n    testing.assertEquals(extractRepoInfo({type:'non-git', url:'https://github.com/alexfernandez/loadtest'}), null, 'extractRepoInfo of non-git repo did not return null', callback);\n    testing.success(callback);\n}\n\nfunction testExtractRepoInfoValidRepo(callback)\n{\n    var repoInfo = extractRepoInfo({type:'git', url:'https://github.com/alexfernandez/loadtest.git'});\n    testing.assert(repoInfo.valid, 'valid repo returned invalid info', callback);\n    testing.assertEquals(repoInfo.owner, 'alexfernandez', 'valid repo returned wrong owner', callback);\n    testing.assertEquals(repoInfo.name, 'loadtest', 'valid repo returned wrong owner', callback);\n    testing.success(callback);\n}\n\n// estimate tests\n\nfunction testEstimateInvalidEntry(callback)\n{\n    exports.estimate(null, function (error, result) {\n        testing.check(result, callback);\n        testing.assert(error, 'null entry should return an error', callback);\n        testing.success(callback);\n    });\n}\n\nfunction testEstimateInvalidRepo(callback)\n{\n    var entry = {\n        repository:{}\n    };\n    exports.estimate(entry, function (error, result) {\n        testing.check(error, callback);\n        testing.assertEquals(result.repoTotalIssues[0], 0, 'repoTotalIssues should be zero for a invalid repo', callback);\n        testing.assertEquals(result.repoOpenIssues[0], 0, 'repoOpenIssues should be zero for a invalid repo', callback);\n        testing.assertEquals(result.repoLongOpenIssues[0], 0, 'repoLongOpenIssues should be zero for a invalid repo', callback);\n        testing.success(callback);\n    });\n}\n\nfunction testEstimateValidRepoGetIssuesForPageLastYearReturnedError(callback)\n{\n    var entry = {\n        repository:{\n            type:'git',\n            url:'https://github.com/alexfernandez/loadtest'\n        }\n    };\n    // stub getIssuesForPageLastYear\n    getIssuesForPageLastYear = function (repoOwner, repoName, page, internalCallback)\n    {\n        return internalCallback({check: true});\n    };\n    exports.estimate(entry, function (error, result) {\n        testing.check(result, callback);\n        testing.assert(error.check, 'estimate should return the right error when getIssuesForPageLastYear returns an error', callback);\n        testing.success(callback);\n    });\n}\n\nfunction testEstimateValidRepo(callback)\n{\n    var entry = {\n        repository:{\n            type:'git',\n            url:'https://github.com/alexfernandez/loadtest'\n        }\n    };\n    // stub getIssuesForPageLastYear\n    getIssuesForPageLastYear = function (repoOwner, repoName, page, internalCallback)\n    {\n        testing.assertEquals(repoOwner, 'alexfernandez', 'wrong repo owner used to call getIssuesForPageLastYear', callback);\n        testing.assertEquals(repoName, 'loadtest', 'wrong repo owner used to call getIssuesForPageLastYear', callback);\n        testing.assertEquals(page, 1, 'estimate should always request page 1', callback);\n        return internalCallback(null, {issues: [{state: 'open',\n                                                created_at: moment().format()}],\n                                        githubIssuesLastPage: 1});\n    };\n    // stub pending\n    var restorePending = pending;\n    pending = function()\n    {\n        testing.assert(false, 'pending should never be called when there is only one page of issues', callback);\n    };\n    exports.estimate(entry, function (error, result) {\n        testing.check(error, callback);\n        testing.assertEquals(result.repoTotalIssues[0], 0, 'repoTotalIssues should be zero for this repo', callback);\n        testing.assert(Math.abs(result.repoOpenIssues[0] - 0.2) < 0.00001, 'repoOpenIssues should be 0.2 for this repo', callback);\n        testing.assertEquals(result.repoLongOpenIssues[0], 1, 'repoLongOpenIssues should be 1 for this repo', callback);\n        pending = restorePending;\n        testing.success(callback);\n    });\n}\n\nfunction testEstimateValidRepoPendingReturnsError(callback)\n{\n    var entry = {\n        repository:{\n            type:'git',\n            url:'https://github.com/alexfernandez/loadtest'\n        }\n    };\n    // stub getIssuesForPageLastYear\n    getIssuesForPageLastYear = function (repoOwner, repoName, page, internalCallback)\n    {\n        testing.assertEquals(repoOwner, 'alexfernandez', 'wrong repo owner used to call getIssuesForPageLastYear', callback);\n        testing.assertEquals(repoName, 'loadtest', 'wrong repo owner used to call getIssuesForPageLastYear', callback);\n        testing.assertEquals(page, 1, 'estimate should always request page 1', callback);\n        return internalCallback(null, {issues: [{state: 'open',\n                                                created_at: moment().subtract(366, 'days').format()}],\n                                        githubIssuesLastPage: 3});\n    };\n    // stub pending\n    var restorePending = pending;\n    pending = function(pendingObject, internalCallback)\n    {\n        testing.assertEquals(pendingObject.owner, 'alexfernandez', 'wrong repo owner sent to pending', callback);\n        testing.assertEquals(pendingObject.name, 'loadtest', 'wrong repo name sent to pending', callback);\n        testing.assertEquals(pendingObject.pages[0], 2, 'wrong initial page sent to pending', callback);\n        testing.assertEquals(pendingObject.pages[1], 3, 'wrong final page sent to pending', callback);\n        testing.assertEquals(pendingObject.total, 1, 'wrong total issues sent to pending', callback);\n        testing.assertEquals(pendingObject.open, 1, 'wrong open issues sent to pending', callback);\n        testing.assertEquals(pendingObject.closed, 0, 'wrong closed issues sent to pending', callback);\n        testing.assertEquals(pendingObject.longOpen, 1, 'wrong long open issues sent to pending', callback);\n        internalCallback({check:true});\n    };\n    exports.estimate(entry, function (error, result) {\n        testing.check(result, callback);\n        testing.assert(error.check, 'estimate should return the right error when pending returns an error', callback);\n        //restore pending\n        pending = restorePending;\n        testing.success(callback);\n    });\n}\n\nfunction testEstimateValidRepoPending(callback)\n{\n    var entry = {\n        repository:{\n            type:'git',\n            url:'https://github.com/alexfernandez/loadtest'\n        }\n    };\n    // stub getIssuesForPageLastYear\n    getIssuesForPageLastYear = function (repoOwner, repoName, page, internalCallback)\n    {\n        testing.assertEquals(repoOwner, 'alexfernandez', 'wrong repo owner used to call getIssuesForPageLastYear', callback);\n        testing.assertEquals(repoName, 'loadtest', 'wrong repo owner used to call getIssuesForPageLastYear', callback);\n        testing.assertEquals(page, 1, 'estimate should always request page 1', callback);\n        return internalCallback(null, {issues: [{state: 'open',\n                                                created_at: moment().subtract(366, 'days').format()}],\n                                        githubIssuesLastPage: 3});\n    };\n    // stub pending\n    var restorePending = pending;\n    pending = function(pendingObject, internalCallback)\n    {\n        testing.assertEquals(pendingObject.owner, 'alexfernandez', 'wrong repo owner sent to pending', callback);\n        testing.assertEquals(pendingObject.name, 'loadtest', 'wrong repo name sent to pending', callback);\n        testing.assertEquals(pendingObject.pages[0], 2, 'wrong initial page sent to pending', callback);\n        testing.assertEquals(pendingObject.pages[1], 3, 'wrong final page sent to pending', callback);\n        testing.assertEquals(pendingObject.total, 1, 'wrong total issues sent to pending', callback);\n        testing.assertEquals(pendingObject.open, 1, 'wrong open issues sent to pending', callback);\n        testing.assertEquals(pendingObject.closed, 0, 'wrong closed issues sent to pending', callback);\n        testing.assertEquals(pendingObject.longOpen, 1, 'wrong long open issues sent to pending', callback);\n        internalCallback(null, {check:true});\n    };\n    exports.estimate(entry, function (error, result) {\n        testing.check(error, callback);\n        testing.assert(result.check, 'estimate should return the right result when pending returns a result', callback);\n        //restore pending\n        pending = restorePending;\n        testing.success(callback);\n    });\n}\n\n// pending tests\n\nfunction testPendingGetIssuesForPageLastYearReturnedError(callback)\n{\n    var pendingObject = {\n        owner: 'alexfernandez',\n        name: 'loadtest',\n        pages: [2, 3],\n        total: 1,\n        open: 0,\n        closed: 1,\n        longOpen: 0\n    };\n    // stub getIssuesForPageLastYear\n    getIssuesForPageLastYear = function (repoOwner, repoName, page, internalCallback)\n    {\n        return internalCallback({check: true});\n    };\n    pending(pendingObject, function (error, result) {\n        testing.check(result, callback);\n        testing.assert(error.check, 'pending returned wrong error when getIssuesForPageLastYear returned an error', callback);\n        testing.success(callback);\n    });\n}\n\nfunction testPending(callback)\n{\n    var pendingObject = {\n        owner: 'alexfernandez',\n        name: 'loadtest',\n        pages: [2, 3],\n        total: 1,\n        open: 0,\n        closed: 1,\n        longOpen: 0\n    };\n    // stub getIssuesForPageLastYear\n    getIssuesForPageLastYear = function (repoOwner, repoName, page, internalCallback)\n    {\n        testing.assertEquals(repoOwner, 'alexfernandez', 'wrong repo owner used to call getIssuesForPageLastYear', callback);\n        testing.assertEquals(repoName, 'loadtest', 'wrong repo owner used to call getIssuesForPageLastYear', callback);\n        return internalCallback(null, {issues: [{state: 'closed'}],\n                                        githubIssuesLastPage: 3});\n    };\n    pending(pendingObject, function (error, result) {\n        testing.check(error, callback);\n        testing.assert(Math.abs(result.repoTotalIssues[0] - 2/3) < 0.00001, 'repoTotalIssues should be 2/3 for this repo', callback);\n        testing.assertEquals(result.repoOpenIssues[0], 1, 'repoOpenIssues should be 1 for this repo', callback);\n        testing.assertEquals(result.repoLongOpenIssues[0], 1, 'repoLongOpenIssues should be 1 for this repo', callback);\n        testing.success(callback);\n    });\n}\n\n/**\n * Run all tests.\n */\nexports.test = function(callback)\n{\n    testing.run([\n        testGetIssuesForPageLastYearErrorResponse,\n        testGetIssuesForPageLastYearNoMoreGithubApiCalls,\n        testGetIssuesForPageLastYearPackageNotFound,\n        testValidGetIssuesForPageLastYear,\n        testExtractRepoInfoInvalidRepo,\n        testExtractRepoInfoValidRepo,\n        testEstimateInvalidEntry,\n        testEstimateInvalidRepo,\n        testEstimateValidRepoGetIssuesForPageLastYearReturnedError,\n        testEstimateValidRepo,\n        testEstimateValidRepoPendingReturnsError,\n        testEstimateValidRepoPending,\n        testPendingGetIssuesForPageLastYearReturnedError,\n        testPending\n    ], callback);\n};\n\n// run tests if invoked directly\nif (__filename == process.argv[1])\n{\n    exports.test(testing.show);\n}\n"
  },
  {
    "path": "lib/factors/versions.js",
    "content": "'use strict';\n\n/**\n * Estimates the quality of a package based on the number of versions.\n * (C) 2015 Diego Lafuente.\n */\n\n// requires\nrequire('prototypes');\nvar Log = require('log');\nvar utils = require('../utils.js');\nvar config = require('../../config.js');\nvar cache = require('../cache.js');\nvar requestLib = require('../cached-request.js');\nvar testing = require('testing');\n\n// globals\nvar log = new Log(config.logLevel);\n\n/**\n * Estimates the quality of a package based on the number of versions.\n * @param entry[required]: an object describing a package as returned by http://registry.npmjs.org/-/all\n * @param callback[required]: a function(error, result) to be called when finished\n * @return This method returns through the callback parameter. Returns an error in case something fails. \n * If the error is null, then the result is always object.\n * Each key of the result object is the name of a measured factor and the value is an array of two elements (both of \n * them floats between 0.0 and 1.0): the first is the value of the estimated factor, and the second is the weight of \n * this factor in the overall average.\n */\nexports.estimate = function(entry, callback)\n{\n    if (!entry || !entry.name)\n    {\n        log.error('null entry or entry without name: ' + JSON.stringify(entry));\n        return callback(JSON.stringify(entry) + ' is null or has no name');\n    }\n    var name = entry.name;\n    var estimation = {\n        versions: [0, 1]\n    };\n    var registryUrl = 'http://registry.npmjs.org/' + utils.urlEncodeRepoName(name);\n    log.debug('Estimating versions with URL: %s', registryUrl);\n    requestLib.get(registryUrl, true, function(error, response, body)\n    {\n        if (error)\n        {\n            return callback ('Could not read registry for ' + name + ' (' + registryUrl + '): ' + error);\n        }\n        var registryResponse;\n        try\n        {\n            registryResponse = JSON.parse(body);\n        }\n        catch(exception)\n        {\n            return callback('Could not parse ' + name + ' registry response: ' + exception);\n        }\n        if (!registryResponse.versions)\n        {\n            return callback(null, estimation);\n        }\n        var totalVersions = registryResponse.versions.countProperties();\n        log.debug('Versions %s', totalVersions);\n        estimation.versions = [1 - 1 / totalVersions, 1];\n        return callback(null, estimation);\n    });\n};\n\n/************************************************\n **************** UNIT TESTS ********************\n ************************************************/\nfunction testEstimateInvalidEntry(callback)\n{\n    exports.estimate({}, function (error, estimation) {\n        testing.check(estimation, callback);\n        testing.assert(error, 'invalid entry should return an error', callback);\n        testing.success(callback);\n    });\n}\nfunction testEstimateInvalidPackageName(callback)\n{\n    var entry = {\n        name: 'invalid'\n    };\n    // stub requestLib.get\n    requestLib.get = function(url, shouldCache, internalCallback) {\n        return internalCallback('error');\n    };\n    exports.estimate(entry, function (error, estimation) {\n        testing.check(estimation, callback);\n        testing.assert(error, 'invalid repo should return an error', callback);\n        testing.success(callback);\n    });\n}\n\nfunction testEstimateInvalidJsonReturnedByRegistry(callback)\n{\n    var entry = {\n        name: 'valid'\n    };\n    // stub requestLib.get\n    requestLib.get = function(url, shouldCache, internalCallback) {\n        return internalCallback(null, null, 'invalid_json');\n    };\n    exports.estimate(entry, function (error, estimation) {\n        testing.check(estimation, callback);\n        testing.assert(error, 'if registry returns an error, the factor should return an error', callback);\n        testing.success(callback);\n    });\n}\n\nfunction testEstimateValidEntryNoVersions(callback)\n{\n    var entry = {\n        name: 'valid'\n    };\n    // stub requestLib.get\n    requestLib.get = function(url, shouldCache, internalCallback) {\n        var response = {};\n        return internalCallback(null, null, JSON.stringify(response));\n    };\n    exports.estimate(entry, function (error, estimation) {\n        testing.check(error, callback);\n        testing.assertEquals(estimation.versions[0], 0, 'wrong quality for this repo', callback);\n        testing.success(callback);\n    });\n}\n\nfunction testEstimateValidEntry(callback)\n{\n    var entry = {\n        name: 'valid'\n    };\n    // stub requestLib.get\n    requestLib.get = function(url, shouldCache, internalCallback) {\n        var response = {versions: {version1: {},version2: {}}};\n        return internalCallback(null, null, JSON.stringify(response));\n    };\n    exports.estimate(entry, function (error, estimation) {\n        testing.check(error, callback);\n        testing.assertEquals(estimation.versions[0], 0.5, 'wrong quality for this repo', callback);\n        testing.success(callback);\n    });\n}\n\n /**\n * Run all tests.\n */\nexports.test = function(callback)\n{\n    testing.run([\n        testEstimateInvalidEntry,\n        testEstimateInvalidPackageName,\n        testEstimateInvalidJsonReturnedByRegistry,\n        testEstimateValidEntryNoVersions,\n        testEstimateValidEntry\n    ], function (error, result) {\n        cache.clearInterval();\n        return callback(error, result);\n    });\n};\n\n// run tests if invoked directly\nif (__filename == process.argv[1])\n{\n    exports.test(testing.show);\n}\n"
  },
  {
    "path": "lib/packages.js",
    "content": "'use strict';\n\n// requires\nvar Log = require('log');\nvar testing = require('testing');\nvar db = require('./db.js');\nvar utils = require('./utils.js');\nvar cache = require('./cache.js');\nvar requestLib = require('./cached-request.js');\nvar config = require('../config.js');\n\n// globals\nvar packagesCollection;\nvar pendingCollection;\nvar log = new Log(config.logLevel);\n\n\nexports.setTestMode = function(callback)\n{\n\tdb.setTestMode();\n\tdb.reconnect(function(error)\n\t{\n\t\tif (error)\n\t\t{\n\t\t\treturn callback(error);\n\t\t}\n\t\tpackagesCollection = null;\n\t\tpendingCollection = null;\n\t\treturn callback(null);\n\t});\n};\n\nexports.unsetTestMode = function(callback)\n{\n\tdb.unsetTestMode();\n\tdb.reconnect(function(error)\n\t{\n\t\tif (error)\n\t\t{\n\t\t\treturn callback(error);\n\t\t}\n\t\tpackagesCollection = null;\n\t\tpendingCollection = null;\n\t\treturn callback(null);\n\t});\n};\n\nfunction openCollection(callback)\n{\n\tif (packagesCollection)\n\t{\n\t\treturn callback(null, packagesCollection);\n\t}\n\tdb.addCallback(function(error, result)\n\t{\n\t\tif (error)\n\t\t{\n\t\t\treturn callback('Could not access database: ' + error);\n\t\t}\n\t\tpackagesCollection = result.collection(config.packagesCollection);\n\t\tif (packagesCollection)\n\t\t{\n\t\t\treturn callback(null, packagesCollection);\n\t\t}\n\t\tresult.createCollection(config.packagesCollection, function(error)\n\t\t{\n\t\t\tif (error)\n\t\t\t{\n\t\t\t\treturn callback(error);\n\t\t\t}\n\t\t\treturn callback(null, result.collection(config.packagesCollection));\n\t\t});\n\t});\n}\n\nfunction testOpenCollection(callback)\n{\n\tpackagesCollection = null;\n\tdb.setTestMode();\n\tdb.reconnect(function(error)\n\t{\n\t\ttesting.check(error, 'Could not set test mode', callback);\n\t\t// init\n\t\topenCollection(function(error, collection)\n\t\t{\n\t\t\ttesting.check(error, 'Could not open collection', callback);\n\t\t\ttesting.assert(collection, 'Did not open collection', callback);\n\t\t\ttesting.success(callback);\n\t\t});\n\t});\n}\n\nfunction openPendingCollection(callback)\n{\n\tif (pendingCollection)\n\t{\n\t\treturn callback(null, pendingCollection);\n\t}\n\tdb.addCallback(function(error, result)\n\t{\n\t\tif (error)\n\t\t{\n\t\t\treturn callback('Could not access database: ' + error);\n\t\t}\n\t\tpendingCollection = result.collection(config.pendingCollection);\n\t\tif (pendingCollection)\n\t\t{\n\t\t\treturn callback(null, pendingCollection);\n\t\t}\n\t\tresult.createCollection(config.pendingCollection, function(error)\n\t\t{\n\t\t\tif (error)\n\t\t\t{\n\t\t\t\treturn callback(error);\n\t\t\t}\n\t\t\treturn callback(null, result.collection(config.pendingCollection));\n\t\t});\n\t});\n}\n\nfunction testOpenPendingCollection(callback)\n{\n\tpendingCollection = null;\n\tdb.setTestMode();\n\tdb.reconnect(function(error)\n\t{\n\t\ttesting.check(error, 'Could not set test mode', callback);\n\t\t// init\n\t\topenPendingCollection(function(error, collection)\n\t\t{\n\t\t\ttesting.check(error, 'Could not open collection', callback);\n\t\t\ttesting.assert(collection, 'Did not open collection', callback);\n\t\t\ttesting.success(callback);\n\t\t});\n\t});\n}\n\nexports.update = function(object, callback)\n{\n\topenCollection(function(error, collection)\n\t{\n\t\tif (error)\n\t\t{\n\t\t\tlog.error('Could not open collection: %s', error);\n\t\t\treturn callback('database not available');\n\t\t}\n\t\tcollection.update({name: object.name}, {'$set': object}, {upsert: true, w: 1}, function(error, result)\n\t\t{\n\t\t\tif (error)\n\t\t\t{\n\t\t\t\tlog.error('Could not update package %s: %s', object.name, error);\n\t\t\t\treturn callback('database not available');\n\t\t\t}\n\t\t\treturn callback(null, result);\n\t\t});\n\t});\n};\n\nexports.updatePending = function(object, callback)\n{\n\topenPendingCollection(function(error, collection)\n\t{\n\t\tif (error)\n\t\t{\n\t\t\tlog.error('Could not open pending collection: %s', error);\n\t\t\treturn callback('database not available');\n\t\t}\n\t\tcollection.update({name: object.name}, {'$set': object}, {upsert: true, w: 1}, function(error, result)\n\t\t{\n\t\t\tif (error)\n\t\t\t{\n\t\t\t\tlog.error('Could not update pending package %s: %s', object.name, error);\n\t\t\t\treturn callback('database not available');\n\t\t\t}\n\t\t\treturn callback(null, result);\n\t\t});\n\t});\n};\n\n\nexports.find = function(name, callback)\n{\n\topenCollection(function(error, collection)\n\t{\n\t\tif (error)\n\t\t{\n\t\t\tlog.error('Could not open collection: %s', error);\n\t\t\treturn callback('database not available');\n\t\t}\n\t\tcollection.findOne({name: name}, function(error, result)\n\t\t{\n\t\t\tif (error)\n\t\t\t{\n\t\t\t\tlog.error('Could not read package %s: %s', name, error);\n\t\t\t\treturn callback('database not available');\n\t\t\t}\n\t\t\treturn callback(null, result);\n\t\t});\n\t});\n};\n\nfunction testFind(callback)\n{\n\tvar name = 'test_package';\n\tvar value = '187349';\n\tvar object = {\n\t\tname: name,\n\t\tvalue: value,\n\t};\n\tpackagesCollection = null;\n\texports.update(object, function(error)\n\t{\n\t\ttesting.check(error, 'Could not save object', callback);\n\t\texports.find(name, function(error, result)\n\t\t{\n\t\t\ttesting.check(error, 'Could not find package', callback);\n\t\t\ttesting.assert(result, 'Did not find package', callback);\n\t\t\ttesting.assertEquals(result.value, value, 'Invalid value', callback);\n\t\t\ttesting.success(callback);\n\t\t});\n\t});\n}\n\nexports.findPending = function(name, callback)\n{\n\topenPendingCollection(function(error, collection)\n\t{\n\t\tif (error)\n\t\t{\n\t\t\tlog.error('Could not open collection: %s', error);\n\t\t\treturn callback('database not available');\n\t\t}\n\t\tcollection.findOne({name: name}, function(error, result)\n\t\t{\n\t\t\tif (error)\n\t\t\t{\n\t\t\t\tlog.error('Could not read package %s: %s', name, error);\n\t\t\t\treturn callback('database not available');\n\t\t\t}\n\t\t\treturn callback(null, result);\n\t\t});\n\t});\n};\n\nfunction testFindPending(callback)\n{\n\tvar name = 'test_package';\n\tvar value = '187349';\n\tvar object = {\n\t\tname: name,\n\t\tvalue: value,\n\t};\n\tpendingCollection = null;\n\texports.updatePending(object, function(error)\n\t{\n\t\ttesting.check(error, 'Could not save object', callback);\n\t\texports.findPending(name, function(error, result)\n\t\t{\n\t\t\ttesting.check(error, 'Could not find package', callback);\n\t\t\ttesting.assert(result, 'Did not find package', callback);\n\t\t\ttesting.assertEquals(result.value, value, 'Invalid value', callback);\n\t\t\ttesting.success(callback);\n\t\t});\n\t});\n}\n\n/**\n * Finds a package in the npm registry by name.\n * @param name[required]: the name of the npm package\n * @param callback[required]: a function(error, result) to be called when finished\n * @return This method returns through the callback parameter. Returns an error if the name is null or empty. It also returns an error if the request to npm registry fails\n * Returns an error if the package was not found. Returns a proper entry {name, repository, description} if it was\n */\nexports.findInNpmRegistry = function (name, callback) \n{\n\tif (!name)\n\t{\n\t\treturn callback('name is null or empty');\n\t}\n\tvar registryUrl = 'http://registry.npmjs.org/' + utils.urlEncodeRepoName(name);\n\t// perform request\n\trequestLib.get(registryUrl, true, function(error, getResponse, body)\n    {\n        if (error)\n        {\n            return callback(error);\n        }\n        var registryResponse;\n        // empty body should return null result\n        if (body.length === 0) {\n        \treturn callback(error, null);\n        }\n        // parse body\n        try\n        {\n            registryResponse = JSON.parse(body);\n        }\n        catch(exception)\n        {\n            return callback(exception);\n        }\n        var result = {\n            name: registryResponse.name,\n            repository: registryResponse.repository,\n            description: registryResponse.description\n        };\n        return callback(null, result);\n    });\n};\n\nfunction testFindInNpmRegistryNullName(callback) \n{\n\texports.findInNpmRegistry(null, function (error, result) {\n\t\ttesting.check(result, callback);\n\t\ttesting.assert(error, 'no error returned in null name', callback);\n\t\ttesting.success(callback);\n\t});\n}\n\nfunction testFindInNpmRegistryEmptyName(callback) \n{\n\texports.findInNpmRegistry('', function (error, result) {\n\t\ttesting.check(result, callback);\n\t\ttesting.assert(error, 'no error returned in empty-named package', callback);\n\t\ttesting.success(callback);\n\t});\n}\n\nfunction testFindInNpmRegistryErrorResponse(callback) \n{\n\t//stub requestLib.get\n\tvar restoreRequestLibGet = requestLib.get;\n\trequestLib.get = function (url, shouldCache, internalCallback) {\n\t\tinternalCallback({check:true});\n\t};\n\texports.findInNpmRegistry('test', function (error, result) {\n\t\ttesting.check(result, callback);\n\t\ttesting.assert(error, 'no error returned when request returned error', callback);\n\t\ttesting.assert(error.check, 'wrong error returned', callback);\n\t\t//restore requestLib.get\n\t\trequestLib.get = restoreRequestLibGet;\n\t\ttesting.success(callback);\n\t});\n}\n\nfunction testFindInNpmRegistryEmptyResponse(callback) \n{\n\t//stub requestLib.get\n\tvar restoreRequestLibGet = requestLib.get;\n\trequestLib.get = function (url, shouldCache, internalCallback) {\n\t\tinternalCallback(null, null, '');\n\t};\n\texports.findInNpmRegistry('test', function (error, result) {\n\t\ttesting.check(error, callback);\n\t\ttesting.check(result, callback);\n\t\t//restore requestLib.get\n\t\trequestLib.get = restoreRequestLibGet;\n\t\ttesting.success(callback);\n\t});\n}\n\nfunction testFindInNpmRegistryErrorInvalidJsonResponse(callback) \n{\n\t//stub requestLib.get\n\tvar restoreRequestLibGet = requestLib.get;\n\trequestLib.get = function (url, shouldCache, internalCallback) {\n\t\tinternalCallback(null, null, 'invalid_json');\n\t};\n\texports.findInNpmRegistry('test', function (error, result) {\n\t\ttesting.check(result, callback);\n\t\ttesting.assert(error, 'no error returned when request returned invalid json', callback);\n\t\t//restore requestLib.get\n\t\trequestLib.get = restoreRequestLibGet;\n\t\ttesting.success(callback);\n\t});\n}\n\nfunction testFindInNpmRegistryValidResponse(callback) \n{\n\t//stub requestLib.get\n\tvar restoreRequestLibGet = requestLib.get;\n\trequestLib.get = function (url, shouldCache, internalCallback) {\n\t\tinternalCallback(null, null, '{\"name\":\"testName\",\"repository\":\"testRepository\",\"description\":\"testDescription\"}');\n\t};\n\texports.findInNpmRegistry('test', function (error, result) {\n\t\ttesting.check(error, callback);\n\t\ttesting.assertEquals(result.name, 'testName', 'wrong name in response for valid request', callback);\n\t\ttesting.assertEquals(result.repository, 'testRepository', 'wrong repository in response for valid request', callback);\n\t\ttesting.assertEquals(result.description, 'testDescription', 'wrong description in response for valid request', callback);\n\t\t//restore requestLib.get\n\t\trequestLib.get = restoreRequestLibGet;\n\t\ttesting.success(callback);\n\t});\n}\n\nexports.listAll = function(callback)\n{\n\topenCollection(function(error, collection)\n\t{\n\t\tif (error)\n\t\t{\n\t\t\tlog.error('Could not open collection: %s', error);\n\t\t\treturn callback('database not available');\n\t\t}\n\t\tcollection.find({}, {name: true}).toArray(function(error, result)\n\t\t{\n\t\t\tif (error)\n\t\t\t{\n\t\t\t\tlog.error('Could not list packages: %s', error);\n\t\t\t\treturn callback('database not available');\n\t\t\t}\n\t\t\treturn callback(null, result);\n\t\t});\n\t});\n};\n\nfunction testListAll(callback)\n{\n\tpackagesCollection = null;\n\texports.listAll(function(error, result)\n\t{\n\t\ttesting.check(error, 'Could not list packages', callback);\n\t\ttesting.assert(result, 'Did not list packages', callback);\n\t\ttesting.success(callback);\n\t});\n}\n\nexports.listAllPending = function(callback)\n{\n\topenPendingCollection(function(error, collection)\n\t{\n\t\tif (error)\n\t\t{\n\t\t\tlog.error('Could not open collection: %s', error);\n\t\t\treturn callback('database not available');\n\t\t}\n\t\tcollection.find().toArray(function(error, result)\n\t\t{\n\t\t\tif (error)\n\t\t\t{\n\t\t\t\tlog.error('Could not list packages: %s', error);\n\t\t\t\treturn callback('database not available');\n\t\t\t}\n\t\t\treturn callback(null, result);\n\t\t});\n\t});\n};\n\nfunction testListAllPending(callback)\n{\n\tpendingCollection = null;\n\texports.listAllPending(function(error, result)\n\t{\n\t\ttesting.check(error, 'Could not list packages', callback);\n\t\ttesting.assert(result, 'Did not list packages', callback);\n\t\ttesting.success(callback);\n\t});\n}\n\nexports.remove = function(name, callback)\n{\n\topenCollection(function(error, collection)\n\t{\n\t\tif (error)\n\t\t{\n\t\t\tlog.error('Could not open collection: %s', error);\n\t\t\treturn callback('database not available');\n\t\t}\n\t\tcollection.remove({name: name}, {w: 1}, callback);\n\t});\n};\n\nfunction testRemove(callback)\n{\n\tvar name = 'to_remove';\n\tvar object = {\n\t\tname: name,\n\t};\n\tpackagesCollection = null;\n\texports.update(object, function(error)\n\t{\n\t\ttesting.check(error, 'Could not save object', callback);\n\t\texports.find(name, function(error, result)\n\t\t{\n\t\t\ttesting.check(error, 'Could not find package', callback);\n\t\t\ttesting.assert(result, 'Did not find package', callback);\n\t\t\texports.remove(name, function(error)\n\t\t\t{\n\t\t\t\ttesting.check(error, 'Could not remove package', callback);\n\t\t\t\texports.find(name, function(error, result)\n\t\t\t\t{\n\t\t\t\t\ttesting.check(error, 'Could not find package again', callback);\n\t\t\t\t\ttesting.assert(!result, 'Should not find package', callback);\n\t\t\t\t\ttesting.success(callback);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t});\n}\n\nexports.removePending = function(name, callback)\n{\n\topenPendingCollection(function(error, collection)\n\t{\n\t\tif (error)\n\t\t{\n\t\t\tlog.error('Could not open collection: %s', error);\n\t\t\treturn callback('database not available');\n\t\t}\n\t\tcollection.remove({name: name}, {w: 1}, callback);\n\t});\n};\n\nfunction testRemovePending(callback)\n{\n\tvar name = 'to_remove';\n\tvar object = {\n\t\tname: name,\n\t};\n\tpendingCollection = null;\n\texports.updatePending(object, function(error)\n\t{\n\t\ttesting.check(error, 'Could not save object', callback);\n\t\texports.findPending(name, function(error, result)\n\t\t{\n\t\t\ttesting.check(error, 'Could not find package', callback);\n\t\t\ttesting.assert(result, 'Did not find package', callback);\n\t\t\texports.removePending(name, function(error)\n\t\t\t{\n\t\t\t\ttesting.check(error, 'Could not remove package', callback);\n\t\t\t\texports.findPending(name, function(error, result)\n\t\t\t\t{\n\t\t\t\t\ttesting.check(error, 'Could not find package again', callback);\n\t\t\t\t\ttesting.assert(!result, 'Should not find package', callback);\n\t\t\t\t\ttesting.success(callback);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t});\n}\n\nexports.close = function(callback)\n{\n\tdb.close(callback);\n};\n\nfunction testClose(callback)\n{\n\texports.close(callback);\n}\n\n/**\n * Run all tests.\n */\nexports.test = function(callback) {\n\ttesting.run([\n\t\ttestOpenCollection,\n\t\ttestOpenPendingCollection,\n\t\ttestFind,\n\t\ttestFindPending,\n\t\ttestListAll,\n\t\ttestListAllPending,\n\t\ttestRemove,\n\t\ttestRemovePending,\n\t\ttestFindInNpmRegistryNullName,\n\t\ttestFindInNpmRegistryEmptyName,\n\t\ttestFindInNpmRegistryErrorResponse,\n\t\ttestFindInNpmRegistryEmptyResponse,\n\t\ttestFindInNpmRegistryErrorInvalidJsonResponse,\n\t\ttestFindInNpmRegistryValidResponse,\n\t\ttestClose\n\t], function (error, result) {\n\t\tcache.clearInterval();\n\t\treturn callback(error, result);\n\t});\n};\n\n// start tests if invoked directly\nif (__filename == process.argv[1]) {\n\texports.test(testing.show);\n}\n\n"
  },
  {
    "path": "lib/server.js",
    "content": "#!/usr/bin/env node\n'use strict';\n\n/**\n * Serve que quality of a required package using mongodb\n * (C) 2015 Diego Lafuente.\n */\n\n// requires\nrequire('prototypes');\nvar path = require('path');\nvar config = require('../config.js');\nvar express = require('express');\nvar badges = require('./badges.js');\nvar estimator = require('./estimation.js');\nvar async = require('async');\nvar moment = require('moment');\nvar packages = require('./packages.js');\nvar Log = require('log');\nvar requestLib = require('request')\n\n// globals\nvar log = new Log(config.logLevel);\nvar server;\n\nexports.startServer = function(port, callback) {\n\tif (typeof port === 'function') {\n\t\t// no port\n\t\tcallback = port;\n\t\tport = config.expressPort;\n\t}\n\tvar app = express();\n\t// Static files\n\tapp.use(express.static(path.join(__dirname, '..', 'app')));\n\t// Enable JSONP\n\tapp.set('jsonp callback', true);\n\t// GET requests\n\tapp.get('/package/:package', serve);\n\tapp.get('/packages', servePackagesList);\n    app.get('/badge/:package', serveBadge);\n    app.get('/shield/:package', serveShield);\n\t// serve\n\tserver = app.listen(port, callback);\n};\n\nexports.stopServer = function(callback) {\n\tif (!server) {\n\t\tlog.info('No server to close');\n\t\treturn callback(null);\n\t}\n\tserver.close(function() {\n\t\tlog.info('Server closed');\n\t\tcallback(null);\n\t});\n};\n\nfunction serveBadge(request, response) {\n\tconst packageParam = request.params['package']\n\tvar packageName = packageParam.replace(/.png$/, '');\n\tfindPackage(packageName, function(error, result) {\n\t\tif (error) {\n\t\t\treturn response.status(503).send({error: 'database not available'});\n\t\t}\n\t\tif (!result) {\n\t\t\treturn response.status(403).send({error: 'package ' + packageName + ' not found'});\n\t\t}\n\t\tvar size = parseInt(request.query.size) || 1;\n\t\tvar quality = (result.quality || 0) * 100\n\t\tif (quality < 0) {\n\t\t\tquality = 0\n\t\t}\n\t\tbadges.compileBadge(packageName, quality.toFixed(2), size, function (error, png) {\n\t\t\tif (error) {\n\t\t\t\treturn response.status(503).send({error: 'database not available'});\n\t\t\t}\n\t\t\tresponse.setHeader('Content-type', 'image/png');\n\t\t\tresponse.send(png);\n\t\t\tcountVisit('https://packagequality.com/badge/' + packageParam, request)\n\t\t});\n\t});\n}\n\nfunction serveShield(request, response) {\n\tconst packageParam = request.params['package']\n\tvar packageName = packageParam.substringUpToLast('.');\n\tfindPackage(packageName, function(error, result) {\n\t\tif (error)\n\t\t{\n\t\t\treturn response.status(503).send({error: 'database not available'});\n\t\t}\n\t\tif (!result) {\n\t\t\treturn response.status(403).send({error: 'package ' + packageName + ' not found'});\n\t\t}\n\t\tvar queryString = request.url.substringFrom('?');\n\t\tvar score = Math.round((result.quality || 0) * 100);\n\t\tbadges.retrieveShield(packageName, score, queryString, function (error, svg) {\n\t\t\tif (error) {\n\t\t\t\treturn response.status(503).send({error: 'database not available'});\n\t\t\t}\n\t\t\tresponse.setHeader('Content-type', 'image/svg+xml');\n\t\t\tresponse.send(svg);\n\t\t\tcountVisit('https://packagequality.com/shield/' + packageParam, request)\n\t\t});\n\t});\n}\n\nfunction findPackage(packageName, callback) {\n\tpackages.find(packageName, function(error, result) {\n\t\tif (error) {\n\t\t\treturn callback(error)\n\t\t}\n\t\tif (result) {\n\t\t\treturn callback(null, result)\n\t\t}\n\t\treturn readPackage(packageName, callback)\n\t})\n}\n\nfunction servePackagesList (request, response) {\n\tresponse.setHeader('Access-Control-Allow-Origin', '*');\n\tpackages.listAll(function(error, result) {\n\t\tif (error) {\n\t\t\treturn response.status(503).send({error: 'database not available'});\n\t\t}\n\t\tvar packages = (result || []).map(function (pkg) {\n\t\t\treturn pkg.name;\n\t\t});\n\t\tresponse.send(packages);\n\t});\n}\n\nfunction serve (request, response) {\n\tresponse.setHeader('Access-Control-Allow-Origin', '*');\n\tvar npmPackage = request.params.package;\n\treadPackage(npmPackage, function(error, estimation) {\n\t\tif (error) {\n\t\t\treturn response.status(403).send({error: error});\n\t\t}\n\t\tresponse.jsonp(estimation);\n\t\tcountVisit('https://packagequality.com/' + npmPackage, request)\n\t})\n}\n\nfunction readPackage(npmPackage, callback) {\n\tvar mainStream = [];\n\t// look for the package in the registry\n\tmainStream.push(function (callback) {\n\t\tpackages.findInNpmRegistry(npmPackage, function (error, result) {\n\t\t\tif (error) {\n\t\t\t\tlog.debug('npm registry error', error);\n\t\t\t\treturn callback(error);\n\t\t\t}\n\t\t\tif (!result) {\n\t\t\t\tpackages.remove(npmPackage, function(){});\n\t\t\t\treturn callback('package ' + npmPackage + ' not found.');\n\t\t\t}\n\t\t\treturn callback(null, result);\n\t\t});\n\t});\n\t// find the package in mongo\n\tmainStream.push(function (entry, callback) {\n\t\tpackages.find(entry.name, function(error, dbRecord) {\n\t\t\tif (error || !dbRecord) {\n\t\t\t\t// not found,  go to next step\n\t\t\t\treturn callback(null, entry, dbRecord, /*stop?*/ false);\n\t\t\t}\n\t\t\t// package found, return first\n\t\t\tcallback(null, entry, dbRecord, /*stop?*/ true);\n\t\t\t// check if expired\n\t\t\tvar now = moment();\n\t\t\tvar lastUpdated = moment(dbRecord.lastUpdated);\n\t\t\tif (now.diff(lastUpdated, 'seconds') > config.packageExpiration) {\n\t\t\t\t// expired, add to pending\n\t\t\t\tpackages.updatePending(entry, function() {});\n\t\t\t}\n\t\t});\n\t});\n\t// estimate quality or return\n\tmainStream.push(function (entry, result, stop, callback) {\n\t\t// stop?\n\t\tif (stop) {\n\t\t\treturn callback(null, entry, result, stop);\n\t\t}\n\t\t// estimate\n\t\testimator.estimate(entry, function(error, estimation)\n        {\n            if (error) {\n            \t// at least one factor returned an error. Add entry to the pendingCollection\n            \tpackages.updatePending(entry, function() {});\n                // return result if it exists, the error otherwise\n                if (result) {\n                \treturn callback(null, entry, result, /*stop*/ true);\n                }\n                return callback(error);\n            }\n            return callback(null, entry, estimator.addQuality(estimation), /*stop?*/ false);\n        });\n\t});\n\t// update database with most recent estimation\n\tmainStream.push(function (entry, estimation, stop, callback) {\n\t\t// stop?\n\t\tif (stop) {\n\t\t\treturn callback(null, estimation);\n\t\t}\n\t\tpackages.update(estimation, function (error) {\n\t\t\tif (error) {\n\t\t\t\t// something happened while trying to update the packages collection. Add to pending\n\t\t\t\tpackages.updatePending(entry, function() {});\n\t\t\t}\n\t\t\treturn callback(null, estimation);\n\t\t});\n\t});\n\t// run mainStream\n\tasync.waterfall(mainStream, callback)\n}\n\nfunction countVisit(url, request) {\n\tconst userAgent = request.headers['user-agent']\n\tconst visitUrl = 'https://librecounter.org/count?url=' + url + '&userAgent=' + userAgent\n\trequestLib.get(visitUrl, function(error) {\n\t\tif (error) {\n\t\t\tconsole.error('Could not count visit', error)\n\t\t}\n\t})\n}\n\n"
  },
  {
    "path": "lib/update.js",
    "content": "#!/usr/bin/env node\n'use strict';\n\n/**\n * Update only pending packages (those in the pending collection)\n * (C) 2015 Diego Lafuente.\n */\n\n// requires\nrequire('prototypes');\nvar config = require('../config.js');\nvar packages = require('../lib/packages.js');\nvar estimator = require('../lib/estimation.js');\nvar async = require('async');\nvar moment = require('moment');\nvar packages = require('../lib/packages');\nvar Log = require('log');\nvar testing = require('testing');\n\n// globals\nvar log = new Log(config.logLevel);\nvar limit = config.limit;\n\n/**\n * Go over all the packages in pending collection and update them.\n * The only constraint is the 5000 requests per hour allowed by the GitHub API\n * @param callback[required]: a function(error, result) with the results of the process\n */\nexports.goOver = function(callback)\n{\n\tpackages.listAllPending(function (error, pending) {\n\t\tif (error) {\n\t\t\treturn callback(error);\n\t\t}\n\t\tvar numberOfPackages = pending.length;\n\t\tlimit = (limit === null) || (numberOfPackages < limit) ? numberOfPackages : limit;\n\t\tvar chunks = [];\n\t\tfor (var j = 0; j < Math.ceil(numberOfPackages/limit); j++)\n\t\t{\n\t\t\tchunks.push([]);\n\t\t}\n\t\tvar packageCount = 0;\n\t\tpending.forEach(function (entry)\n\t\t{\n\t\t\tvar index = Math.floor(packageCount/limit);\n\t\t\tchunks[index].push(getEstimator(entry));\n\t\t\tpackageCount++;\n\t\t});\n\t\tlog.debug('number of chunks: ' + chunks.length);\n\t\tvar series = [];\n\t\twhile (chunks.length)\n\t\t{\n\t\t\tseries.push(getChunkProcessor(chunks.shift()));\n\t\t}\n\t\tlog.debug('series has length ' + series.length);\n\t\tasync.series(series, function(error)\n\t\t{\n\t\t\tif (error)\n\t\t\t{\n\t\t\t\tcallback(error);\n\t\t\t}\n\t\t\tcallback(null, series.length);\n\t\t});\n\t});\n};\n\nfunction getEstimator(entry)\n{\n\treturn function(callback)\n\t{\n\t\testimator.estimate(entry, function (error, estimation)\n\t\t{\n\t\t\tif (error)\n\t\t\t{\n\t\t\t\tlog.error('error estimating: ' + entry.name + ':' + JSON.stringify(error));\n\t\t\t\treturn callback(null);\n\t\t\t}\n\t\t\testimation.lastUpdated = moment().format();\n\t\t\t// update database and remove pending\n\t\t\tpackages.update(estimator.addQuality(estimation), function(error)\n\t\t\t{\n\t\t\t\tif (error)\n\t\t\t\t{\n\t\t\t\t\tlog.error('Package ' + estimation.name + ' could not be upserted in the database: ' + JSON.stringify(error));\n\t\t\t\t}\n\t\t\t\t// remove entry from pending\n\t\t\t\tpackages.removePending(estimation.name, function() {\n\t\t\t\t\treturn callback(null, estimation);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t};\n}\n\nfunction getChunkProcessor(chunk)\n{\n\treturn function(callback)\n\t{\n\t\tlog.info('About to process chunk: ' + chunk.length);\n\t\tasync.parallel(chunk, function(error, estimations)\n\t\t{\n\t\t\tvar kos = estimations.filter(function(estimation) {\n\t\t\t\treturn estimation === undefined;\n\t\t\t}).length;\n\t\t\tvar oks = estimations.length - kos;\n\t\t\tlog.info('Chunk processed. OKs: ' + oks + '. ERRORS: ' + kos);\n\n\t\t\treturn callback(null);\n\t\t});\n\t};\n}\n\n/************************************************\n **************** UNIT TESTS ********************\n ************************************************/\nfunction testEstimatorError(callback)\n{\n\t\tvar newEntry = {name: 'newEntry'};\n\t\t// stubs\n\t\testimator = {\n\t\t\testimate: function(entry, internalCallback) {\n\t\t\t\ttesting.assertEquals(entry.name, newEntry.name, 'wrong entry passed to estimate', callback);\n\t\t\t\treturn internalCallback('some crazy error');\n\t\t\t}\n\t\t};\n\t\tpackages.setTestMode(function(error)\n\t\t{\n\t\t\ttesting.check(error, callback);\n\t\t\tvar theEstimator = getEstimator(newEntry);\n\t\t\ttheEstimator(function(error, estimation) {\n\t\t\t\ttesting.check(error, callback);\n\t\t\t\ttesting.assert(estimation === undefined, 'error should return undefined estimation', callback);\n\t\t\t\ttesting.success(callback);\n\t\t\t});\n\t\t});\n}\n\nfunction testEstimatorSuccess(callback)\n{\n\t\tvar newEntry = {name: 'newEntry'};\n\t\tvar now = moment();\n\t\t// stubs\n\t\tvar restoreEstimator = estimator;\n\t\testimator = {\n\t\t\testimate: function(entry, internalCallback) {\n\t\t\t\ttesting.assertEquals(entry.name, newEntry.name, 'wrong entry passed to estimate', callback);\n\t\t\t\treturn internalCallback(null, {name:'testpackage'});\n\t\t\t},\n\t\t\taddQuality: function(estimation) {\n\t\t\t\treturn estimation;\n\t\t\t}\n\t\t};\n\t\tvar restoreMoment = moment;\n\t\tmoment = function () \n\t\t{\n\t\t\treturn now;\n\t\t};\n\t\tpackages.setTestMode(function(error)\n\t\t{\n\t\t\ttesting.check(error, callback);\n\t\t\tvar theEstimator = getEstimator(newEntry);\n\t\t\ttheEstimator(function(error, estimation) {\n\t\t\t\ttesting.check(error, callback);\n\t\t\t\ttesting.assertEquals(estimation.lastUpdated, now.format(), 'wrong estimation lastUpdate returned by the estimator', callback);\n\t\t\t\tmoment = restoreMoment;\n\t\t\t\testimator = restoreEstimator;\n\t\t\t\ttesting.success(callback);\n\t\t\t});\n\t\t});\n}\n\nfunction testClose(callback)\n{\n\tpackages.close(callback);\n}\n\n/**\n * Run all tests.\n */\nexports.test = function(callback)\n{\n\ttesting.run([\n\t\ttestEstimatorError,\n\t\ttestEstimatorSuccess,\n\t\ttestClose,\n\t], callback);\n};\n\n// run tests if invoked directly\nif (__filename == process.argv[1])\n{\n\texports.test(testing.show);\n}\n\n"
  },
  {
    "path": "lib/utils.js",
    "content": "'use strict';\nvar testing = require('testing');\n\nexports.urlEncodeRepoName = function(name) {\n  return name.replace(/\\//g, '%2F');\n};\n\n/************************************************\n **************** UNIT TESTS ********************\n ************************************************/\nfunction testUrlEncodeRepoName(callback)\n{\n  var result = exports.urlEncodeRepoName('kkfu');\n  testing.assertEquals(result, 'kkfu', 'wrong result for regular string');\n  result = exports.urlEncodeRepoName('@storybook/react');\n  testing.assertEquals(result, '@storybook%2Freact', 'wrong result for scoped string');\n  result = exports.urlEncodeRepoName('@storybook/react/kkfu');\n  testing.assertEquals(result, '@storybook%2Freact%2Fkkfu', 'wrong result for multi-scoped string');\n  testing.success(callback);\n}\n\n/**\n *  * Run all tests.\n *   */\nexports.test = function(callback)\n{\n  testing.run([\n      testUrlEncodeRepoName\n  ], 10000, callback);\n};\n\n// run tests if invoked directly\nif (__filename == process.argv[1])\n{\n  exports.test(testing.show);\n}\n\n"
  },
  {
    "path": "package.json",
    "content": "{\n\t\"name\": \"package-quality\",\n\t\"version\": \"0.3.4\",\n\t\"description\": \"Estimate the quality of a package.\",\n\t\"homepage\": \"https://github.com/alexfernandez/package-quality\",\n\t\"contributors\": [\n\t\t\"Alex Fernández <alexfernandeznpm@gmail.com>\",\n\t\t\"Sergio García Mondaray <sgmonda@gmail.com>\",\n\t\t\"Diego Lafuente <tufosa@gmail.com>\"\n\t],\n\t\"license\": \"MIT\",\n\t\"main\": \"index.js\",\n\t\"repository\": {\n\t\t\"type\": \"git\",\n\t\t\"url\": \"https://github.com/alexfernandez/package-quality\"\n\t},\n\t\"dependencies\": {\n\t\t\"async\": \"2.6.4\",\n\t\t\"basic-request\": \"*\",\n\t\t\"canvas\": \"^3.2.1\",\n\t\t\"express\": \"^4.16.4\",\n\t\t\"grunt\": \"^1.0.3\",\n\t\t\"grunt-contrib-jshint\": \"^3.2.0\",\n\t\t\"honeycomb-beeline\": \"^4.2.0\",\n\t\t\"log\": \"1.4.0\",\n\t\t\"moment\": \"^2.24.0\",\n\t\t\"mongodb\": \"^3.6.3\",\n\t\t\"prototypes\": \"^2.3.5\",\n\t\t\"request\": \"*\",\n\t\t\"testing\": \"^1.1.0\"\n\t},\n\t\"keywords\": [\n\t\t\"package\",\n\t\t\"quality\",\n\t\t\"measurement\",\n\t\t\"package quality\",\n\t\t\"estimation\",\n\t\t\"npm\",\n\t\t\"registry\",\n\t\t\"npm registry\"\n\t],\n\t\"engines\": {\n\t\t\"node\": \"*\"\n\t},\n\t\"bin\": {\n\t\t\"all\": \"bin/all.js\"\n\t},\n\t\"preferGlobal\": true,\n\t\"scripts\": {\n\t\t\"test\": \"node test.js\",\n\t\t\"start\": \"node bin/app.js\"\n\t},\n\t\"private\": false\n}\n"
  },
  {
    "path": "server/nginx-packagequality.conf",
    "content": "server {\n\tlisten 80;\n\tserver_name packagequality.com *.packagequality.com;\n\taccess_log /var/log/nginx/access.log;\n\terror_log /var/log/nginx/error.log;\n\tlocation / {\n\t\tproxy_pass http://127.0.0.1:8080;\n\t}\n\n    listen 443 ssl; # managed by Certbot\nssl_certificate /etc/letsencrypt/live/packagequality.com/fullchain.pem; # managed by Certbot\nssl_certificate_key /etc/letsencrypt/live/packagequality.com/privkey.pem; # managed by Certbot\n    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot\n\n\n\n}\n"
  },
  {
    "path": "server/upstart-package-quality.conf",
    "content": "#!upstart\ndescription \"Package quality server\"\nauthor    \"Diego Lafuente <dlafuente@tuitravel-ad.com>\"\n\nstart on local-filesystems and net-device-up IFACE=eth0\nstop on shutdown\n\nrespawn\nrespawn limit 60 1\n\nenv HOME_FOLDER=/home/ubuntu\nenv BASE_USER=ubuntu\n\nkill timeout 20\n\nscript\n\tLOG_FILE=$HOME_FOLDER/log/package-quality-server.log\n\tcd $HOME_FOLDER/package-quality\n\texec sudo -u $BASE_USER node bin/app.js >> $LOG_FILE 2>&1\nend script\n\n"
  },
  {
    "path": "test/gulp-filter.json",
    "content": "{\n    \"name\" : \"gulp-filter\",\n    \"source\" : \"npm\",\n    \"created\" : \"2015-02-16T20:56:10+00:00\",\n    \"lastUpdated\" : \"2015-02-17T15:59:01+00:00\",\n    \"nextUpdate\" : \"2015-02-17T15:59:01+00:00\",\n    \"timesUpdated\" : 1,\n    \"repoTotalIssues\" : [\n        \"-Infinity\",\n        1\n    ],\n    \"repoOpenIssues\" : [\n        1,\n        1\n    ],\n    \"repoLongOpenIssues\" : [\n        1,\n        1\n    ],\n    \"versions\" : [\n        0.9375,\n        1\n    ],\n    \"downloads\" : [\n        0.9999973556026845,\n        1\n    ]\n}"
  },
  {
    "path": "test/test_entry.json",
    "content": "{\n    \"name\":\"loadtest\",\n    \"description\":\"Run load tests for your web application. Mostly ab-compatible interface, with an option to force requests per second. Includes an API for automated load testing.\",\n    \"dist-tags\":{\"latest\":\"1.2.6\"},\n    \"maintainers\":[{\"name\":\"alexfernandez\",\"email\":\"alexfernandeznpm@gmail.com\"}],\n    \"repository\":{\n        \"type\":\"git\",\n        \"url\":\"https://github.com/alexfernandez/loadtest\"\n        },\n    \"readmeFilename\":\"README.md\",\n    \"homepage\":\"https://github.com/alexfernandez/loadtest\",\n    \"keywords\":[\"testing\",\"test\",\"load test\",\"load testing\",\"http\",\"performance\",\"black box\"],\n    \"contributors\":[{\"name\":\"Alex Fernández\",\"email\":\"alexfernandeznpm@gmail.com\"}],\n    \"bugs\":{\"url\":\"https://github.com/alexfernandez/loadtest/issues\"},\n    \"license\":\"MIT\",\n    \"users\":{\"capablemonkey\":true,\"kikobeats\":true,\"nebulon\":true,\"hellboy81\":true,\"deadlink\":true,\"acjohnso25\":true,\"vdsabev\":true,\"fdezromero\":true},\n    \"time\":{\"modified\":\"2015-01-16T00:32:59.797Z\"},\n    \"versions\":{\"1.2.6\":\"latest\"}\n}\n"
  },
  {
    "path": "test.js",
    "content": "'use strict';\n\n/**\n * Run package tests.\n * (C) 2014 Alex Fernández.\n */\n\n// requires\nvar testing = require('testing');\nvar Log = require('log');\n\n// globals\nvar log = new Log('info');\n\n\n/**\n * Run all module tests.\n */\nexports.test = function(callback)\n{\n\tlog.debug('Running tests');\n\tvar tests = {};\n\tvar libs = ['estimation', 'badges', 'cache', 'cached-request', 'utils'];\n    var factors = ['issues', 'versions', 'downloads'];\n\tlibs.forEach(function(lib)\n\t{\n\t\ttests[lib] = require('./lib/' + lib + '.js').test;\n\t});\n    factors.forEach(function(factor)\n    {\n        tests[factor] = require('./lib/factors/' + factor + '.js').test;\n    });\n\ttesting.run(tests, 4200, callback);\n};\n\n// run tests if invoked directly\nif (__filename == process.argv[1])\n{\n\texports.test(testing.show);\n}\n\n"
  },
  {
    "path": "update.sh",
    "content": "#!/bin/bash\n# Update packages\nHOME=/home/ubuntu\nUSER=ubuntu\nDIR=$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd )\n\ncd $DIR/bin\n\nsudo -u $USER node update.js >> $HOME/log/package-quality-update.log\n\n"
  }
]