diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..81cd922
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,94 @@
+# Created by https://www.gitignore.io/api/git,node,bower
+
+### Bower ###
+bower_components
+.bower-cache
+.bower-registry
+.bower-tmp
+
+### Git ###
+*.orig
+
+### Node ###
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# Runtime data
+pids
+*.pid
+*.seed
+*.pid.lock
+
+# Directory for instrumented libs generated by jscoverage/JSCover
+lib-cov
+
+# Coverage directory used by tools like istanbul
+coverage
+
+# nyc test coverage
+.nyc_output
+
+# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
+.grunt
+
+# Bower dependency directory (https://bower.io/)
+
+# node-waf configuration
+.lock-wscript
+
+# Compiled binary addons (http://nodejs.org/api/addons.html)
+build/Release
+
+# Dependency directories
+node_modules/
+jspm_packages/
+
+# Typescript v1 declaration files
+typings/
+
+# Optional npm cache directory
+.npm
+
+# Optional eslint cache
+.eslintcache
+
+# Optional REPL history
+.node_repl_history
+
+# Output of 'npm pack'
+*.tgz
+
+# Yarn Integrity file
+.yarn-integrity
+
+# dotenv environment variables file
+.env
+
+# End of https://www.gitignore.io/api/git,node,bower
+
+# composer vendor...
+/vendor/
+
+# webpack HMR chunks...
+/dist/tmp
+
+
+# editorconfig file
+.editorconfig
+
+
+# ignore lock files from composer + npm
+package-lock.json
+composer.lock
+
+#tmp folder in basedir
+/tmp/
+
+
+
+
+
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..1ef1374
--- /dev/null
+++ b/README.md
@@ -0,0 +1,108 @@
+# OZwpDeV
+Simple Admin Panel for creating sandbox Wordpress and WP development plugs for altering admin settings using WP-CLI with PHP.
+
+## Features
+* [WP-CLI](http://wp-cli.org) with PHP
+ * Find all WP installations in root
+ * Update WP core and plugins
+ * Create WP sandbox with your default settings
+ * Edit WP with your default settings (config, options, plugins, themes and user)
+* Bootstrap 4 with [Start Bootstrap - SB Admin Template](https://startbootstrap.com/template-categories/all/)
+* Jquery everywhere with ajax calls to WP-CLI
+* Fontawesome, Sweetalert2, busy-load, tablesorter
+* Bundled and browser-synced with Webpack
+* Composer for parsedown, phpdotenv and php-array-group-by
+
+## Installation
+
+ Clone or download from Github.
+
+to build the webpack bundle:
+
+ $ npm run
+to build with webpack and run in safari with BrowserSync + HotModuleReplacement (_for chrome replace safari with chrome_):
+
+ $ npm run safari
+
+
+### assumptions
+ - Localhost is the Root directory of all your WP installs
+ - There is at least one WP installation in the Root
+ - You will install all new WP sites in the Root directory
+ - You have the pre-requisites as described below
+
+### pre-requisites:
+This app runs only in Mac with cli commands executed by Terminal.app.
+
+basically, you need to:
+
+ 1. Setup export $PATH variables, esp. if you're running **MAMP**.
+ 2. Install the latest version of **npm** and run install in the app directory.
+ 3. Install the latest version of **composer** *_(recommended globally)_* and run install in the app directory.
+ 4. Install the latest version of **wp-cli** *_(recommended globally)_*.
+
+#### MAMP setup
+If you're running PHP on MAMP, a **_.bash_profile_** adjustment needed. Exporting Path as best practice is as below. You may copy and paste these settings in your file. I am running MAMP version 5.6.31. But any version is extracted by the script.
+```
+### MAMP version (5.6.31)
+## ls /Applications/MAMP/bin/php/ | sort -n | tail -2 | head -1
+## /Applications/MAMP/bin/php/php5.6.31/bin
+## export PATH=/Applications/MAMP/Library/bin:$PATH
+PHP_VERSION=$(ls /Applications/MAMP/bin/php/ | sort -n | tail -2 | head -1)
+export PATH=/Applications/MAMP/bin/php/${PHP_VERSION}/bin:$PATH
+```
+You can echo your PATH by `$ echo $PATH` in your Terminal window. This path info will be crucial for running wp-cli commands. Please copy and save this path info in your **_.env_** file.
+
+#### npm
+You need npm to install all dependencies, including composer.
+Since you're on a Mac environment, you have probably a version of npm + node installed in your system. For updating your versions and further upgrading options, please visit [docs.nmpjs.com](https://docs.npmjs.com/getting-started/installing-node)
+
+For the dependencies listed in package.json, run `$ npm install` in your admin folder with Terminal.app
+
+******
+#### composer
+Composer can be installed by the instructions in its site [getcomposer.org](https://getcomposer.org/doc/00-intro.md#installation-linux-unix-osx) and I highly recommend to install it **Globally**.
+
+Composer dependencies are hooked in config.php. To install and create the vendor folder, in your Terminal.app (and of course in the install directory of the app) run `$ composer install` .
+*****
+#### wp-cli
+Installing wp-cli is well documented in its site: [wp-cli](https://wp-cli.org/#installing). If you're lucky with previous installs of npm and composer, this will run like a charm.
+
+#### wp-cli / packages
+OZwpDeV uses packages from wp-cli, which you may find the index of packages here: [wp-cli/packages](http://wp-cli.org/package-index/).
+##### wp-cli/find-command
+Find WordPress installations on the filesystem.
+###### Installation:
+ $ wp package install wp-cli/find-command
+You may encounter memory problems and you can find solutions [here](https://make.wordpress.org/cli/handbook/common-issues/#php-fatal-error-allowed-memory-size-of-999999-bytes-exhausted-tried-to-allocate-99-bytes). Script below works for me:
+
+ $ php -d memory_limit=512M "$(which wp)" package install wp-cli/find-command
+*****
+##### wp-cli/admin-command
+Opens wp-admin in default browser
+###### Installation:
+ $ wp package install wp-cli/admin-command
+You may encounter memory problems and you can find solutions [here](https://make.wordpress.org/cli/handbook/common-issues/#php-fatal-error-allowed-memory-size-of-999999-bytes-exhausted-tried-to-allocate-99-bytes). Script below works for me:
+
+ $ php -d memory_limit=650M "$(which wp)" package install wp-cli/admin-command
+*****
+## dotenv - site settings
+- config.php immediately creates a **_.env_** file in the root folder from a sample.env file.
+ - **EXPORT_PATH**
+ this environmental variable should be received from Terminal.app by typing `$ echo $PATH` which is the export path variable in your .bash_profile. Copy the output and paste in **_.env_** file directly.
+ - **mysql_PATH**
+ this is for _'env: mysql: No such file or directory'_ error, which occurs i.e. with WP Config command.
+ - **rooturl**
+ Where you run this app (Usually localhost)
+ - **DB parameters**
+ Database parameters: DB_HOST, DB_USER and DB_PASS.
+ - **WP admin user info**
+ Your admin credentials: admin_user, admin_mail, admin_password, display_name and description (Bio).
+
+
+## main idea
+ code is fun...
+
+
+
+> Written with [StackEdit](https://stackedit.io/).
\ No newline at end of file
diff --git a/composer.json b/composer.json
new file mode 100644
index 0000000..e6dbdd1
--- /dev/null
+++ b/composer.json
@@ -0,0 +1,17 @@
+{
+ "name": "ozinclouds/wpdevdash",
+ "description":"Wordpress Development Dashboard for localhosts",
+ "type":"project",
+ "lincense":"MIT",
+ "authors": [
+ {
+ "name": "ozgurkalan",
+ "email": "ozgurkalan@gmail.com"
+ }
+ ],
+ "require": {
+ "erusev/parsedown": "^1.6",
+ "vlucas/phpdotenv": "^2.4",
+ "mcaskill/php-array-group-by": "^1.0"
+ }
+}
diff --git a/config.php b/config.php
new file mode 100644
index 0000000..a5f4062
--- /dev/null
+++ b/config.php
@@ -0,0 +1,86 @@
+load();
+
+
+define('ExportPath', 'export PATH="' . $_ENV["EXPORT_PATH"] . '"');
+
+
+define( 'DB_HOST', $_ENV["DB_HOST"] ); // set database host
+define( 'DB_USER', $_ENV["DB_USER"] ); // set database user
+define( 'DB_PASS', $_ENV["DB_PASS"] ); // set database password
+
+if(!isset($_ENV["rooturl"])){
+ define('rooturl',$_ENV["rooturl"]);
+} else {
+ define('rooturl',"http://localhost");
+}
+
+
+if(!file_exists(basedir . "tmp")){
+ mkdir(basedir . "tmp");
+}
+
+
+ ?>
\ No newline at end of file
diff --git a/defaults.json b/defaults.json
new file mode 100644
index 0000000..dfc00eb
--- /dev/null
+++ b/defaults.json
@@ -0,0 +1,333 @@
+{
+ "options": [
+ {
+ "title": "WPLANG",
+ "group": "basic",
+ "desc": "Settings > General > Site Language",
+ "comment": "defines the language of WP site. en_EN is empty default.",
+ "default": "tr_TR"
+ },
+ {
+ "title": "gmt_offset",
+ "group": "basic",
+ "desc": "Settings > General > Timezone ",
+ "comment": "WP default: UTC+0",
+ "default": 3
+ },
+ {
+ "title": "start_of_week",
+ "group": "basic",
+ "desc": "Settings > General > Week Starts On ",
+ "comment": "WP default: 1 (Monday) // 0-6 ",
+ "default": 1
+ },
+ {
+ "title": "date_format",
+ "group": "basic",
+ "desc": "Settings > General > Date Format ",
+ "comment": "WP default: F J, Y",
+ "default": "d/m/Y"
+ },
+ {
+ "title": "time_format",
+ "group": "basic",
+ "desc": "Settings > General > Time Format ",
+ "comment": "WP default: g:i a",
+ "default": "H:i"
+ },
+ {
+ "title": "permalink_structure",
+ "group": "basic",
+ "desc": "Settings > Permalinks > Permalink Settings",
+ "comment": "WP default: plain",
+ "default": "/%postname%-%post_id%.htm"
+ },
+ {
+ "title": "category_base",
+ "group": "basic",
+ "desc": "Settings > Permalinks > Tag Base ",
+ "comment": "WP default is empty",
+ "default": "/konu"
+ },
+ {
+ "title": "tag_base",
+ "group": "basic",
+ "desc": "Settings > Permalinks > Category Base ",
+ "comment": "WP default is empty",
+ "default": "/etiketler"
+ },
+ {
+ "title": "uploads_use_yearmonth_folders",
+ "group": "basic",
+ "desc": "Settings > Media > Uploading Files ",
+ "comment": "WP default: 1 (Organize my uploads into month- and year-based folders)",
+ "default": 0
+ }
+ ],
+ "config": [
+ {
+ "title": "WP_LANG",
+ "group": "LANG",
+ "desc": "Config file constant defining Language",
+ "comment": "WP default is en_EN",
+ "default": "tr_TR",
+ "options":["default","en_EN","en_GB","tr_TR","de_DE"],
+ "type":"text"
+ }
+ ],
+ "users":[
+ {
+ "title":"display_name",
+ "group":"get",
+ "desc":"Display name publicly as",
+ "comment":"reads from .env file, if exits",
+ "default":".env",
+ "type":"text"
+ },
+ {
+ "title":"locale",
+ "group":"meta",
+ "desc":"language",
+ "comment":"admin panel language only, default is site language(blank)",
+ "default":"en_EN",
+ "options":["default","en_EN","en_GB","tr_TR","de_DE"],
+ "type":"text"
+ },
+ {
+ "title":"admin_color",
+ "group":"meta",
+ "desc":"Admin Color Scheme",
+ "comment":"sets color, blank is default",
+ "default":"sunrise",
+ "options":["default","light","blue","coffee","ectoplasm","midnight","ocean","sunrise"],
+ "type":"text"
+ },
+ {
+ "title":"show_admin_bar_front",
+ "group":"meta",
+ "desc":"Toolbar",
+ "comment":"Show Toolbar when viewing site",
+ "default":"false",
+ "type":"boolean"
+ },
+ {
+ "title":"show_welcome_panel",
+ "group":"meta",
+ "desc":"Show welcome panel",
+ "comment":"dashboard welcome panel",
+ "default":"0",
+ "options":["0","1"],
+ "type":"text"
+ },
+ {
+ "title":"description",
+ "group":"meta",
+ "desc":"Biographical Info",
+ "comment":"reads from .env file, if exits",
+ "default":".env",
+ "type":"textarea"
+ }
+ ],
+ "themes":[
+ {
+ "title":"twentyseventeen",
+ "default":"twentyseventeen",
+ "group":"default",
+ "desc":"2017 WP Theme",
+ "comment":"WP Default Theme"
+ },
+ {
+ "title":"twentysixteen",
+ "default":"twentysixteen",
+ "group":"default",
+ "desc":"2016 WP Theme",
+ "comment":"WP Default Theme"
+ },
+ {
+ "title":"twentyfifteen",
+ "default":"twentyfifteen",
+ "group":"default",
+ "desc":"2015 WP Theme",
+ "comment":"WP Default Theme"
+ }
+ ],
+ "plugins": [
+ {
+ "title": "akismet",
+ "default": "akismet",
+ "group": "security",
+ "desc": "protect blog from spam",
+ "comment": "needs an API key"
+ },
+ {
+ "title": "woocommerce",
+ "default": "woocommerce",
+ "group": "woo",
+ "desc": "eCommerce toolkit",
+ "comment": "standard eBiz Plugin"
+ },
+ {
+ "title": "all-in-one-seo-pack",
+ "default": "all-in-one-seo-pack",
+ "group": "seo",
+ "desc": "Out-of-the-box SEO",
+ "comment": "All-in-One, incl XLM sitemaps and custom post type seo "
+ },
+ {
+ "title":"broken-link-checker",
+ "default":"broken-link-checker",
+ "group":"basic",
+ "desc":"Checks your blog for broken links and missing images",
+ "comment":"shows broken links in dashboard"
+ },
+ {
+ "title":"wordfence",
+ "default":"wordfence",
+ "group":"security",
+ "desc":"Anti-virus, Firewall and Malware Scan",
+ "comment":"essential for WP security"
+ },
+ {
+ "title":"regenerate-thumbnails",
+ "default":"regenerate-thumbnails",
+ "group":"image",
+ "desc":"Regenerate the thumbnails",
+ "comment":"Useful when changing image sizes or theme"
+ },
+ {
+ "title":"simple-image-sizes",
+ "default":"simple-image-sizes",
+ "group":"image",
+ "desc":"Add options in media setting page for images sizes",
+ "comment":"?need to check if still useful"
+ },
+ {
+ "title":"wordpress-importer",
+ "default":"wordpress-importer",
+ "group":"basic",
+ "desc":"import many fields from a WP export file.",
+ "comment":"good for import sandbox"
+ },
+ {
+ "title":"wp-mail-smtp",
+ "default":"wp-mail-smtp",
+ "group":"mail",
+ "desc":"Reconfigures the wp_mail() function to use SMTP",
+ "comment":"useful for some restricted php servers..."
+ },
+ {
+ "title":"wp-migrate-db-pro",
+ "default":"/Users/ozgurkalan/Documents/DEVOZ/zz_OZ-APP-Paid/WP-Migrate/wp-migrate-db-pro-1.6.1.zip",
+ "group":"database",
+ "desc":"Export, push, and pull to migrate WP databases",
+ "comment":"paid pro version: change 'default' to folder path!"
+ },
+ {
+ "title":"wp-migrate-db-pro-media-files",
+ "default":"/Users/ozgurkalan/Documents/DEVOZ/zz_OZ-APP-Paid/WP-Migrate/wp-migrate-db-pro-media-files-1.4.5.zip",
+ "group":"database",
+ "desc":"WP Migrate DB Pro Media Files",
+ "comment":"An extension to WP Migrate DB Pro, allows the migration of media files."
+ },
+ {
+ "title":"extra-user-details",
+ "default":"extra-user-details",
+ "group":"basic",
+ "desc":"add additional fields to user profile like Facebook, Twitter etc.",
+ "comment":"user social media is accesible"
+ },
+ {
+ "title":"backwpup",
+ "default":"backwpup",
+ "group":"database",
+ "desc":"WP Backup Plugin",
+ "comment":"good for fast backup sql in uploads folders"
+ },
+ {
+ "title":"disable-site",
+ "default":"disable-site",
+ "group":"basic",
+ "desc":"disable website front-end and display a message",
+ "comment":"fast and reliable way to keep under-construction"
+ },
+ {
+ "title":"custom-upload-dir",
+ "default":"custom-upload-dir",
+ "group":"woo",
+ "desc":"keeps uploaded files organized in smart folder structures",
+ "comment":"good for woo product images and uploads"
+ },
+ {
+ "title":"polylang",
+ "default":"polylang",
+ "group":"basic",
+ "desc":"Adds multilingual capability",
+ "comment":"language - multilang plugin"
+ },
+ {
+ "title":"wck-custom-fields-and-custom-post-types-creator",
+ "default":"wck-custom-fields-and-custom-post-types-creator",
+ "group":"woo",
+ "desc":"custom post types, custom taxonomies and custom fields",
+ "comment":"very useful esp. with woo"
+ },
+ {
+ "title":"woocommerce-products-filter",
+ "default":"/Users/ozgurkalan/Documents/DEVOZ/zz_OZ-APP-Paid/codecanyon-11498469-woof-woocommerce-products-filter/woocommerce-products-filter.zip",
+ "group":"woo",
+ "desc":"wooF - wooCommerce Products Filter",
+ "comment":"not the best, but ok for filtering, paid version has some capabilities"
+ },
+ {
+ "title":"wp-optimize",
+ "default":"wp-optimize",
+ "group":"basic",
+ "desc":"optimization plugin",
+ "comment":"cleans up database"
+ },
+ {
+ "title":"simple-lightbox",
+ "default":"simple-lightbox",
+ "group":"image",
+ "desc":"customizable lightbox",
+ "comment":"simple and working"
+ },
+ {
+ "title":"relevanssi",
+ "default":"relevanssi",
+ "group":"woo",
+ "desc":"replaces WP search with a relevance-sorting search",
+ "comment":"good for custom tax search"
+ },
+ {
+ "title":"disable-comments",
+ "default":"disable-comments",
+ "group":"basic",
+ "desc":"globally disable comments",
+ "comment":"can be disabled according to post type"
+ },
+ {
+ "title":"contact-form-7",
+ "default":"contact-form-7",
+ "group":"mail",
+ "desc":"contact form plugin",
+ "comment":"simple and flexible"
+ },
+ {
+ "title":"search-everything",
+ "default":"search-everything",
+ "group":"woo",
+ "desc":"extra serach functionality",
+ "comment":"good for Woo and custom tax-post searches"
+ },
+ {
+ "title":"google-sitemap-generator",
+ "default":"google-sitemap-generator",
+ "group":"seo",
+ "desc":"Google XML Sitemaps",
+ "comment":"improves seo capabilities"
+ }
+
+
+ ]
+}
\ No newline at end of file
diff --git a/dist/defaults.bundle.js b/dist/defaults.bundle.js
new file mode 100644
index 0000000..a5fa30a
--- /dev/null
+++ b/dist/defaults.bundle.js
@@ -0,0 +1,57 @@
+webpackJsonp([6],{
+
+/***/ "./src/defaults.js":
+/***/ (function(module, exports, __webpack_require__) {
+
+/* WEBPACK VAR INJECTION */(function($) {
+
+$(document).on("dblclick", "table[name=table-defaults]", function(e){
+ var title=$(e.target).closest("tr").find("td:eq(0)").text().trim();
+ var defVal=$(e.target).closest("tr").find("td:eq(1)").text().trim();
+ var conf=$(e.target).closest("tr").attr("data-config");
+
+ swal({
+ title:title,
+ content:{
+ element:"input",
+ attributes: {
+ defaultValue: defVal,
+ }
+
+ },
+ dangerMode:true,
+ button: {
+ text: "update!",
+ closeModal: false,
+ cancel:true
+ },
+ }).then((value)=>{
+ $.ajax({
+ url:"settings.defaults.update.php",
+ method:"post",
+ data:{
+ do:"run",
+ run:"update",
+ config:conf,
+ title:title,
+ newValue:value
+ }
+ }).done(
+ swal("updated",title,"success")
+ );
+ });
+});
+/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__("./node_modules/jquery/dist/jquery.js-exposed")))
+
+/***/ }),
+
+/***/ 5:
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = __webpack_require__("./src/defaults.js");
+
+
+/***/ })
+
+},[5]);
+//# sourceMappingURL=defaults.bundle.js.map
\ No newline at end of file
diff --git a/dist/defaults.bundle.js.map b/dist/defaults.bundle.js.map
new file mode 100644
index 0000000..4db3f20
--- /dev/null
+++ b/dist/defaults.bundle.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack:///./src/defaults.js"],"names":[],"mappings":";;;;;;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,GAAG;AACH,CAAC,E","file":"defaults.bundle.js","sourcesContent":["\n\n$(document).on(\"dblclick\", \"table[name=table-defaults]\", function(e){\n\tvar title=$(e.target).closest(\"tr\").find(\"td:eq(0)\").text().trim();\n\tvar defVal=$(e.target).closest(\"tr\").find(\"td:eq(1)\").text().trim();\n\tvar conf=$(e.target).closest(\"tr\").attr(\"data-config\");\n\n\t\tswal({\n\t\t\ttitle:title,\n\t\t\tcontent:{\n\t\t\t\telement:\"input\",\n\t\t\t\tattributes: {\n\t\t\t\t defaultValue: defVal,\n\t\t\t\t }\n\n\t\t\t},\n\t\t\tdangerMode:true,\n\t\t\tbutton: {\n\t\t\ttext: \"update!\",\n\t\t\tcloseModal: false,\n\t\t\tcancel:true\n\t\t\t},\n\t\t}).then((value)=>{\n\t\t\t$.ajax({\n\t\t\t\turl:\"settings.defaults.update.php\",\n\t\t\t\tmethod:\"post\",\n\t\t\t\tdata:{\n\t\t\t\t\tdo:\"run\",\n\t\t\t\t\trun:\"update\",\n\t\t\t\t\tconfig:conf,\n\t\t\t\t\ttitle:title,\n\t\t\t\t\tnewValue:value\n\t\t\t\t}\n\t\t\t}).done(\n\t\t\t\tswal(\"updated\",title,\"success\")\n\t\t\t);\n\t\t});\n});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/defaults.js\n// module id = ./src/defaults.js\n// module chunks = 6"],"sourceRoot":""}
\ No newline at end of file
diff --git a/dist/editwp.bundle.css b/dist/editwp.bundle.css
new file mode 100644
index 0000000..73c735f
--- /dev/null
+++ b/dist/editwp.bundle.css
@@ -0,0 +1,141 @@
+.tablesorter-bootstrap {
+ width: 100%; }
+
+.tablesorter-bootstrap tfoot td, .tablesorter-bootstrap tfoot th, .tablesorter-bootstrap thead td, .tablesorter-bootstrap thead th {
+ font: 14px/20px Arial,Sans-serif;
+ font-weight: 700;
+ padding: 4px;
+ margin: 0 0 18px; }
+
+.tablesorter-bootstrap thead .tablesorter-header {
+ background-position: right 5px center;
+ background-repeat: no-repeat;
+ cursor: pointer;
+ white-space: normal; }
+
+.tablesorter-bootstrap:not(.table-dark) tfoot td, .tablesorter-bootstrap:not(.table-dark) tfoot th, .tablesorter-bootstrap:not(.table-dark) thead:not(.thead-dark) .tablesorter-header {
+ background-color: #eee; }
+
+.tablesorter-bootstrap thead .sorter-false {
+ cursor: default;
+ background-image: none; }
+
+.tablesorter-bootstrap .tablesorter-header-inner {
+ position: relative;
+ padding: 4px 18px 4px 4px; }
+
+.tablesorter-bootstrap .sorter-false .tablesorter-header-inner {
+ padding: 4px; }
+
+.tablesorter-bootstrap thead .tablesorter-headerUnSorted:not(.sorter-false) {
+ background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMiIgaGVpZ2h0PSIxNiIgdmlld0JveD0iMCAwIDE0IDIwIj48cGF0aCBkPSJNMTQgMTNsLTIuNS0yLjVMNyAxNWwtNC41LTQuNUwwIDEzbDcgN3pNMTQgNy41TDExLjUgMTAgNyA1LjUgMi41IDEwIDAgNy41bDctN3oiLz48L3N2Zz4=); }
+
+.tablesorter-bootstrap thead .tablesorter-headerAsc {
+ background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMiIgaGVpZ2h0PSIxMiIgdmlld0JveD0iMCAwIDE0IDE0Ij48cGF0aCBkPSJNMTQgOS41TDExLjUgMTIgNyA3LjUgMi41IDEyIDAgOS41bDctN3oiLz48L3N2Zz4=); }
+
+.tablesorter-bootstrap thead .tablesorter-headerDesc {
+ background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMiIgaGVpZ2h0PSIxMiIgdmlld0JveD0iMCAwIDE0IDE0Ij48cGF0aCBkPSJNMTQgNWwtMi41LTIuNS00LjUgNC41LTQuNS00LjVMMCA1IDcgMTJ6Ii8+PC9zdmc+); }
+
+.tablesorter-bootstrap thead.thead-dark .tablesorter-headerUnSorted:not(.sorter-false), .tablesorter-bootstrap.table-dark thead .tablesorter-headerUnSorted:not(.sorter-false) {
+ background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMiIgaGVpZ2h0PSIxNiIgdmlld0JveD0iMCAwIDE0IDIwIj48cGF0aCBmaWxsPSIjZmZmIiBkPSJNMTQgMTNsLTIuNS0yLjVMNyAxNWwtNC41LTQuNUwwIDEzbDcgN3pNMTQgNy41TDExLjUgMTAgNyA1LjUgMi41IDEwIDAgNy41bDctN3oiLz48L3N2Zz4=); }
+
+.tablesorter-bootstrap thead.thead-dark .tablesorter-headerAsc, .tablesorter-bootstrap.table-dark thead .tablesorter-headerAsc {
+ background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMiIgaGVpZ2h0PSIxMiIgdmlld0JveD0iMCAwIDE0IDE0Ij48cGF0aCBmaWxsPSIjZmZmIiBkPSJNMTQgOS41TDExLjUgMTIgNyA3LjUgMi41IDEyIDAgOS41bDctN3oiLz48L3N2Zz4=); }
+
+.tablesorter-bootstrap thead.thead-dark .tablesorter-headerDesc, .tablesorter-bootstrap.table-dark thead .tablesorter-headerDesc {
+ background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMiIgaGVpZ2h0PSIxMiIgdmlld0JveD0iMCAwIDE0IDE0Ij48cGF0aCBmaWxsPSIjZmZmIiBkPSJNMTQgNWwtMi41LTIuNS00LjUgNC41LTQuNS00LjVMMCA1IDcgMTJ6Ii8+PC9zdmc+); }
+
+.tablesorter-bootstrap:not(.table-dark) > tbody > tr.odd > td, .tablesorter-bootstrap:not(.table-dark) > tbody > tr.tablesorter-hasChildRow.odd:hover ~ tr.tablesorter-hasChildRow.odd ~ .tablesorter-childRow.odd > td {
+ background-color: #f9f9f9; }
+
+.tablesorter-bootstrap:not(.table-dark) > tbody > tr.even:hover > td, .tablesorter-bootstrap:not(.table-dark) > tbody > tr.hover > td, .tablesorter-bootstrap:not(.table-dark) > tbody > tr.odd:hover > td, .tablesorter-bootstrap:not(.table-dark) > tbody > tr.tablesorter-hasChildRow.even:hover ~ .tablesorter-childRow.even > td, .tablesorter-bootstrap:not(.table-dark) > tbody > tr.tablesorter-hasChildRow.odd:hover ~ .tablesorter-childRow.odd > td {
+ background-color: #f5f5f5; }
+
+.tablesorter-bootstrap:not(.table-dark) > tbody > tr.even > td, .tablesorter-bootstrap:not(.table-dark) > tbody > tr.tablesorter-hasChildRow.even:hover ~ tr.tablesorter-hasChildRow.even ~ .tablesorter-childRow.even > td {
+ background-color: #fff; }
+
+.tablesorter-bootstrap .tablesorter-processing {
+ background-image: url(data:image/gif;base64,R0lGODlhFAAUAKEAAO7u7lpaWgAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQBCgACACwAAAAAFAAUAAACQZRvoIDtu1wLQUAlqKTVxqwhXIiBnDg6Y4eyx4lKW5XK7wrLeK3vbq8J2W4T4e1nMhpWrZCTt3xKZ8kgsggdJmUFACH5BAEKAAIALAcAAAALAAcAAAIUVB6ii7jajgCAuUmtovxtXnmdUAAAIfkEAQoAAgAsDQACAAcACwAAAhRUIpmHy/3gUVQAQO9NetuugCFWAAAh+QQBCgACACwNAAcABwALAAACE5QVcZjKbVo6ck2AF95m5/6BSwEAIfkEAQoAAgAsBwANAAsABwAAAhOUH3kr6QaAcSrGWe1VQl+mMUIBACH5BAEKAAIALAIADQALAAcAAAIUlICmh7ncTAgqijkruDiv7n2YUAAAIfkEAQoAAgAsAAAHAAcACwAAAhQUIGmHyedehIoqFXLKfPOAaZdWAAAh+QQFCgACACwAAAIABwALAAACFJQFcJiXb15zLYRl7cla8OtlGGgUADs=);
+ background-position: center center !important;
+ background-repeat: no-repeat !important; }
+
+.tablesorter-bootstrap:not(.table-dark) > tbody > tr.odd td.primary {
+ background-color: #bfbfbf; }
+
+.tablesorter-bootstrap:not(.table-dark) > tbody > tr td.primary, .tablesorter-bootstrap:not(.table-dark) > tbody > tr.even td.primary {
+ background-color: #d9d9d9; }
+
+.tablesorter-bootstrap:not(.table-dark) > tbody > tr.odd td.secondary {
+ background-color: #d9d9d9; }
+
+.tablesorter-bootstrap:not(.table-dark) > tbody > tr td.secondary, .tablesorter-bootstrap:not(.table-dark) > tbody > tr.even td.secondary {
+ background-color: #e6e6e6; }
+
+.tablesorter-bootstrap:not(.table-dark) > tbody > tr.odd td.tertiary {
+ background-color: #e6e6e6; }
+
+.tablesorter-bootstrap:not(.table-dark) > tbody > tr td.tertiary, .tablesorter-bootstrap:not(.table-dark) > tbody > tr.even td.tertiary {
+ background-color: #f2f2f2; }
+
+.tablesorter-bootstrap:not(.table-dark) .caption {
+ background-color: #fff; }
+
+.tablesorter-bootstrap .tablesorter-filter-row input.tablesorter-filter, .tablesorter-bootstrap .tablesorter-filter-row select.tablesorter-filter {
+ width: 98%;
+ margin: 0;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ -webkit-transition: height .1s ease;
+ -moz-transition: height .1s ease;
+ -o-transition: height .1s ease;
+ transition: height .1s ease; }
+
+.tablesorter-bootstrap:not(.table-dark) .tablesorter-filter-row {
+ background-color: #efefef; }
+
+.tablesorter-bootstrap:not(.table-dark) .tablesorter-filter-row input.tablesorter-filter, .tablesorter-bootstrap:not(.table-dark) .tablesorter-filter-row select.tablesorter-filter {
+ color: #333; }
+
+.tablesorter-bootstrap .tablesorter-filter-row .tablesorter-filter.disabled {
+ cursor: not-allowed;
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075) inset;
+ box-sizing: border-box;
+ transition: height .1s ease; }
+
+.tablesorter-bootstrap:not(.table-dark) .tablesorter-filter-row td {
+ line-height: normal;
+ text-align: center;
+ padding: 4px 6px;
+ vertical-align: middle;
+ -webkit-transition: line-height .1s ease;
+ -moz-transition: line-height .1s ease;
+ -o-transition: line-height .1s ease;
+ transition: line-height .1s ease; }
+
+.tablesorter-bootstrap .tablesorter-filter-row.hideme td {
+ padding: 2px;
+ margin: 0;
+ line-height: 0; }
+
+.tablesorter-bootstrap .tablesorter-filter-row.hideme * {
+ height: 1px;
+ min-height: 0;
+ border: 0;
+ padding: 0;
+ margin: 0;
+ /* don't use visibility: hidden because it disables tabbing */
+ opacity: 0; }
+
+.tablesorter .filtered {
+ display: none; }
+
+.tablesorter-bootstrap .tablesorter-pager .pagedisplay {
+ border: 0; }
+
+.tablesorter:not(.table-dark) .tablesorter-errorRow td {
+ text-align: center;
+ cursor: pointer;
+ background-color: #e6bf99; }
+
+/*# sourceMappingURL=editwp.bundle.css.map*/
\ No newline at end of file
diff --git a/dist/editwp.bundle.css.map b/dist/editwp.bundle.css.map
new file mode 100644
index 0000000..310c271
--- /dev/null
+++ b/dist/editwp.bundle.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":[],"names":[],"mappings":"","file":"editwp.bundle.css","sourceRoot":""}
\ No newline at end of file
diff --git a/dist/editwp.bundle.js b/dist/editwp.bundle.js
new file mode 100644
index 0000000..29e178d
--- /dev/null
+++ b/dist/editwp.bundle.js
@@ -0,0 +1,4504 @@
+webpackJsonp([1],{
+
+/***/ "./node_modules/tablesorter/dist/css/theme.bootstrap_4.min.css":
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+
+/***/ "./node_modules/tablesorter/dist/js/jquery.tablesorter.js":
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function(factory) {
+ if (true) {
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__("./node_modules/jquery/dist/jquery.js-exposed")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
+ __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
+ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+ } else if (typeof module === 'object' && typeof module.exports === 'object') {
+ module.exports = factory(require('jquery'));
+ } else {
+ factory(jQuery);
+ }
+}(function(jQuery) {
+
+/*! TableSorter (FORK) v2.30.1 *//*
+* Client-side table sorting with ease!
+* @requires jQuery v1.2.6+
+*
+* Copyright (c) 2007 Christian Bach
+* fork maintained by Rob Garrison
+*
+* Examples and original docs at: http://tablesorter.com
+* Dual licensed under the MIT and GPL licenses:
+* http://www.opensource.org/licenses/mit-license.php
+* http://www.gnu.org/licenses/gpl.html
+*
+* @type jQuery
+* @name tablesorter (FORK)
+* @cat Plugins/Tablesorter
+* @author Christian Bach - christian.bach@polyester.se
+* @contributor Rob Garrison - https://github.com/Mottie/tablesorter
+* @docs (fork) - https://mottie.github.io/tablesorter/docs/
+*/
+/*jshint browser:true, jquery:true, unused:false, expr: true */
+;( function( $ ) {
+ 'use strict';
+ var ts = $.tablesorter = {
+
+ version : '2.30.1',
+
+ parsers : [],
+ widgets : [],
+ defaults : {
+
+ // *** appearance
+ theme : 'default', // adds tablesorter-{theme} to the table for styling
+ widthFixed : false, // adds colgroup to fix widths of columns
+ showProcessing : false, // show an indeterminate timer icon in the header when the table is sorted or filtered.
+
+ headerTemplate : '{content}',// header layout template (HTML ok); {content} = innerHTML, {icon} = // class from cssIcon
+ onRenderTemplate : null, // function( index, template ) { return template; }, // template is a string
+ onRenderHeader : null, // function( index ) {}, // nothing to return
+
+ // *** functionality
+ cancelSelection : true, // prevent text selection in the header
+ tabIndex : true, // add tabindex to header for keyboard accessibility
+ dateFormat : 'mmddyyyy', // other options: 'ddmmyyy' or 'yyyymmdd'
+ sortMultiSortKey : 'shiftKey', // key used to select additional columns
+ sortResetKey : 'ctrlKey', // key used to remove sorting on a column
+ usNumberFormat : true, // false for German '1.234.567,89' or French '1 234 567,89'
+ delayInit : false, // if false, the parsed table contents will not update until the first sort
+ serverSideSorting: false, // if true, server-side sorting should be performed because client-side sorting will be disabled, but the ui and events will still be used.
+ resort : true, // default setting to trigger a resort after an 'update', 'addRows', 'updateCell', etc has completed
+
+ // *** sort options
+ headers : {}, // set sorter, string, empty, locked order, sortInitialOrder, filter, etc.
+ ignoreCase : true, // ignore case while sorting
+ sortForce : null, // column(s) first sorted; always applied
+ sortList : [], // Initial sort order; applied initially; updated when manually sorted
+ sortAppend : null, // column(s) sorted last; always applied
+ sortStable : false, // when sorting two rows with exactly the same content, the original sort order is maintained
+
+ sortInitialOrder : 'asc', // sort direction on first click
+ sortLocaleCompare: false, // replace equivalent character (accented characters)
+ sortReset : false, // third click on the header will reset column to default - unsorted
+ sortRestart : false, // restart sort to 'sortInitialOrder' when clicking on previously unsorted columns
+
+ emptyTo : 'bottom', // sort empty cell to bottom, top, none, zero, emptyMax, emptyMin
+ stringTo : 'max', // sort strings in numerical column as max, min, top, bottom, zero
+ duplicateSpan : true, // colspan cells in the tbody will have duplicated content in the cache for each spanned column
+ textExtraction : 'basic', // text extraction method/function - function( node, table, cellIndex ) {}
+ textAttribute : 'data-text',// data-attribute that contains alternate cell text (used in default textExtraction function)
+ textSorter : null, // choose overall or specific column sorter function( a, b, direction, table, columnIndex ) [alt: ts.sortText]
+ numberSorter : null, // choose overall numeric sorter function( a, b, direction, maxColumnValue )
+
+ // *** widget options
+ initWidgets : true, // apply widgets on tablesorter initialization
+ widgetClass : 'widget-{name}', // table class name template to match to include a widget
+ widgets : [], // method to add widgets, e.g. widgets: ['zebra']
+ widgetOptions : {
+ zebra : [ 'even', 'odd' ] // zebra widget alternating row class names
+ },
+
+ // *** callbacks
+ initialized : null, // function( table ) {},
+
+ // *** extra css class names
+ tableClass : '',
+ cssAsc : '',
+ cssDesc : '',
+ cssNone : '',
+ cssHeader : '',
+ cssHeaderRow : '',
+ cssProcessing : '', // processing icon applied to header during sort/filter
+
+ cssChildRow : 'tablesorter-childRow', // class name indiciating that a row is to be attached to its parent
+ cssInfoBlock : 'tablesorter-infoOnly', // don't sort tbody with this class name (only one class name allowed here!)
+ cssNoSort : 'tablesorter-noSort', // class name added to element inside header; clicking on it won't cause a sort
+ cssIgnoreRow : 'tablesorter-ignoreRow',// header row to ignore; cells within this row will not be added to c.$headers
+
+ cssIcon : 'tablesorter-icon', // if this class does not exist, the {icon} will not be added from the headerTemplate
+ cssIconNone : '', // class name added to the icon when there is no column sort
+ cssIconAsc : '', // class name added to the icon when the column has an ascending sort
+ cssIconDesc : '', // class name added to the icon when the column has a descending sort
+ cssIconDisabled : '', // class name added to the icon when the column has a disabled sort
+
+ // *** events
+ pointerClick : 'click',
+ pointerDown : 'mousedown',
+ pointerUp : 'mouseup',
+
+ // *** selectors
+ selectorHeaders : '> thead th, > thead td',
+ selectorSort : 'th, td', // jQuery selector of content within selectorHeaders that is clickable to trigger a sort
+ selectorRemove : '.remove-me',
+
+ // *** advanced
+ debug : false,
+
+ // *** Internal variables
+ headerList: [],
+ empties: {},
+ strings: {},
+ parsers: [],
+
+ // *** parser options for validator; values must be falsy!
+ globalize: 0,
+ imgAttr: 0
+
+ // removed: widgetZebra: { css: ['even', 'odd'] }
+
+ },
+
+ // internal css classes - these will ALWAYS be added to
+ // the table and MUST only contain one class name - fixes #381
+ css : {
+ table : 'tablesorter',
+ cssHasChild: 'tablesorter-hasChildRow',
+ childRow : 'tablesorter-childRow',
+ colgroup : 'tablesorter-colgroup',
+ header : 'tablesorter-header',
+ headerRow : 'tablesorter-headerRow',
+ headerIn : 'tablesorter-header-inner',
+ icon : 'tablesorter-icon',
+ processing : 'tablesorter-processing',
+ sortAsc : 'tablesorter-headerAsc',
+ sortDesc : 'tablesorter-headerDesc',
+ sortNone : 'tablesorter-headerUnSorted'
+ },
+
+ // labels applied to sortable headers for accessibility (aria) support
+ language : {
+ sortAsc : 'Ascending sort applied, ',
+ sortDesc : 'Descending sort applied, ',
+ sortNone : 'No sort applied, ',
+ sortDisabled : 'sorting is disabled',
+ nextAsc : 'activate to apply an ascending sort',
+ nextDesc : 'activate to apply a descending sort',
+ nextNone : 'activate to remove the sort'
+ },
+
+ regex : {
+ templateContent : /\{content\}/g,
+ templateIcon : /\{icon\}/g,
+ templateName : /\{name\}/i,
+ spaces : /\s+/g,
+ nonWord : /\W/g,
+ formElements : /(input|select|button|textarea)/i,
+
+ // *** sort functions ***
+ // regex used in natural sort
+ // chunk/tokenize numbers & letters
+ chunk : /(^([+\-]?(?:\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?)?$|^0x[0-9a-f]+$|\d+)/gi,
+ // replace chunks @ ends
+ chunks : /(^\\0|\\0$)/,
+ hex : /^0x[0-9a-f]+$/i,
+
+ // *** formatFloat ***
+ comma : /,/g,
+ digitNonUS : /[\s|\.]/g,
+ digitNegativeTest : /^\s*\([.\d]+\)/,
+ digitNegativeReplace : /^\s*\(([.\d]+)\)/,
+
+ // *** isDigit ***
+ digitTest : /^[\-+(]?\d+[)]?$/,
+ digitReplace : /[,.'"\s]/g
+
+ },
+
+ // digit sort, text location
+ string : {
+ max : 1,
+ min : -1,
+ emptymin : 1,
+ emptymax : -1,
+ zero : 0,
+ none : 0,
+ 'null' : 0,
+ top : true,
+ bottom : false
+ },
+
+ keyCodes : {
+ enter : 13
+ },
+
+ // placeholder date parser data (globalize)
+ dates : {},
+
+ // These methods can be applied on table.config instance
+ instanceMethods : {},
+
+ /*
+ ▄█████ ██████ ██████ ██ ██ █████▄
+ ▀█▄ ██▄▄ ██ ██ ██ ██▄▄██
+ ▀█▄ ██▀▀ ██ ██ ██ ██▀▀▀
+ █████▀ ██████ ██ ▀████▀ ██
+ */
+
+ setup : function( table, c ) {
+ // if no thead or tbody, or tablesorter is already present, quit
+ if ( !table || !table.tHead || table.tBodies.length === 0 || table.hasInitialized === true ) {
+ if ( ts.debug(c, 'core') ) {
+ if ( table.hasInitialized ) {
+ console.warn( 'Stopping initialization. Tablesorter has already been initialized' );
+ } else {
+ console.error( 'Stopping initialization! No table, thead or tbody', table );
+ }
+ }
+ return;
+ }
+
+ var tmp = '',
+ $table = $( table ),
+ meta = $.metadata;
+ // initialization flag
+ table.hasInitialized = false;
+ // table is being processed flag
+ table.isProcessing = true;
+ // make sure to store the config object
+ table.config = c;
+ // save the settings where they read
+ $.data( table, 'tablesorter', c );
+ if ( ts.debug(c, 'core') ) {
+ console[ console.group ? 'group' : 'log' ]( 'Initializing tablesorter v' + ts.version );
+ $.data( table, 'startoveralltimer', new Date() );
+ }
+
+ // removing this in version 3 (only supports jQuery 1.7+)
+ c.supportsDataObject = ( function( version ) {
+ version[ 0 ] = parseInt( version[ 0 ], 10 );
+ return ( version[ 0 ] > 1 ) || ( version[ 0 ] === 1 && parseInt( version[ 1 ], 10 ) >= 4 );
+ })( $.fn.jquery.split( '.' ) );
+ // ensure case insensitivity
+ c.emptyTo = c.emptyTo.toLowerCase();
+ c.stringTo = c.stringTo.toLowerCase();
+ c.last = { sortList : [], clickedIndex : -1 };
+ // add table theme class only if there isn't already one there
+ if ( !/tablesorter\-/.test( $table.attr( 'class' ) ) ) {
+ tmp = ( c.theme !== '' ? ' tablesorter-' + c.theme : '' );
+ }
+
+ // give the table a unique id, which will be used in namespace binding
+ if ( !c.namespace ) {
+ c.namespace = '.tablesorter' + Math.random().toString( 16 ).slice( 2 );
+ } else {
+ // make sure namespace starts with a period & doesn't have weird characters
+ c.namespace = '.' + c.namespace.replace( ts.regex.nonWord, '' );
+ }
+
+ c.table = table;
+ c.$table = $table
+ // add namespace to table to allow bindings on extra elements to target
+ // the parent table (e.g. parser-input-select)
+ .addClass( ts.css.table + ' ' + c.tableClass + tmp + ' ' + c.namespace.slice(1) )
+ .attr( 'role', 'grid' );
+ c.$headers = $table.find( c.selectorHeaders );
+
+ c.$table.children().children( 'tr' ).attr( 'role', 'row' );
+ c.$tbodies = $table.children( 'tbody:not(.' + c.cssInfoBlock + ')' ).attr({
+ 'aria-live' : 'polite',
+ 'aria-relevant' : 'all'
+ });
+ if ( c.$table.children( 'caption' ).length ) {
+ tmp = c.$table.children( 'caption' )[ 0 ];
+ if ( !tmp.id ) { tmp.id = c.namespace.slice( 1 ) + 'caption'; }
+ c.$table.attr( 'aria-labelledby', tmp.id );
+ }
+ c.widgetInit = {}; // keep a list of initialized widgets
+ // change textExtraction via data-attribute
+ c.textExtraction = c.$table.attr( 'data-text-extraction' ) || c.textExtraction || 'basic';
+ // build headers
+ ts.buildHeaders( c );
+ // fixate columns if the users supplies the fixedWidth option
+ // do this after theme has been applied
+ ts.fixColumnWidth( table );
+ // add widgets from class name
+ ts.addWidgetFromClass( table );
+ // add widget options before parsing (e.g. grouping widget has parser settings)
+ ts.applyWidgetOptions( table );
+ // try to auto detect column type, and store in tables config
+ ts.setupParsers( c );
+ // start total row count at zero
+ c.totalRows = 0;
+ // only validate options while debugging. See #1528
+ if (c.debug) {
+ ts.validateOptions( c );
+ }
+ // build the cache for the tbody cells
+ // delayInit will delay building the cache until the user starts a sort
+ if ( !c.delayInit ) { ts.buildCache( c ); }
+ // bind all header events and methods
+ ts.bindEvents( table, c.$headers, true );
+ ts.bindMethods( c );
+ // get sort list from jQuery data or metadata
+ // in jQuery < 1.4, an error occurs when calling $table.data()
+ if ( c.supportsDataObject && typeof $table.data().sortlist !== 'undefined' ) {
+ c.sortList = $table.data().sortlist;
+ } else if ( meta && ( $table.metadata() && $table.metadata().sortlist ) ) {
+ c.sortList = $table.metadata().sortlist;
+ }
+ // apply widget init code
+ ts.applyWidget( table, true );
+ // if user has supplied a sort list to constructor
+ if ( c.sortList.length > 0 ) {
+ ts.sortOn( c, c.sortList, {}, !c.initWidgets );
+ } else {
+ ts.setHeadersCss( c );
+ if ( c.initWidgets ) {
+ // apply widget format
+ ts.applyWidget( table, false );
+ }
+ }
+
+ // show processesing icon
+ if ( c.showProcessing ) {
+ $table
+ .unbind( 'sortBegin' + c.namespace + ' sortEnd' + c.namespace )
+ .bind( 'sortBegin' + c.namespace + ' sortEnd' + c.namespace, function( e ) {
+ clearTimeout( c.timerProcessing );
+ ts.isProcessing( table );
+ if ( e.type === 'sortBegin' ) {
+ c.timerProcessing = setTimeout( function() {
+ ts.isProcessing( table, true );
+ }, 500 );
+ }
+ });
+ }
+
+ // initialized
+ table.hasInitialized = true;
+ table.isProcessing = false;
+ if ( ts.debug(c, 'core') ) {
+ console.log( 'Overall initialization time:' + ts.benchmark( $.data( table, 'startoveralltimer' ) ) );
+ if ( ts.debug(c, 'core') && console.groupEnd ) { console.groupEnd(); }
+ }
+ $table.triggerHandler( 'tablesorter-initialized', table );
+ if ( typeof c.initialized === 'function' ) {
+ c.initialized( table );
+ }
+ },
+
+ bindMethods : function( c ) {
+ var $table = c.$table,
+ namespace = c.namespace,
+ events = ( 'sortReset update updateRows updateAll updateHeaders addRows updateCell updateComplete ' +
+ 'sorton appendCache updateCache applyWidgetId applyWidgets refreshWidgets destroy mouseup ' +
+ 'mouseleave ' ).split( ' ' )
+ .join( namespace + ' ' );
+ // apply easy methods that trigger bound events
+ $table
+ .unbind( events.replace( ts.regex.spaces, ' ' ) )
+ .bind( 'sortReset' + namespace, function( e, callback ) {
+ e.stopPropagation();
+ // using this.config to ensure functions are getting a non-cached version of the config
+ ts.sortReset( this.config, function( table ) {
+ if (table.isApplyingWidgets) {
+ // multiple triggers in a row... filterReset, then sortReset - see #1361
+ // wait to update widgets
+ setTimeout( function() {
+ ts.applyWidget( table, '', callback );
+ }, 100 );
+ } else {
+ ts.applyWidget( table, '', callback );
+ }
+ });
+ })
+ .bind( 'updateAll' + namespace, function( e, resort, callback ) {
+ e.stopPropagation();
+ ts.updateAll( this.config, resort, callback );
+ })
+ .bind( 'update' + namespace + ' updateRows' + namespace, function( e, resort, callback ) {
+ e.stopPropagation();
+ ts.update( this.config, resort, callback );
+ })
+ .bind( 'updateHeaders' + namespace, function( e, callback ) {
+ e.stopPropagation();
+ ts.updateHeaders( this.config, callback );
+ })
+ .bind( 'updateCell' + namespace, function( e, cell, resort, callback ) {
+ e.stopPropagation();
+ ts.updateCell( this.config, cell, resort, callback );
+ })
+ .bind( 'addRows' + namespace, function( e, $row, resort, callback ) {
+ e.stopPropagation();
+ ts.addRows( this.config, $row, resort, callback );
+ })
+ .bind( 'updateComplete' + namespace, function() {
+ this.isUpdating = false;
+ })
+ .bind( 'sorton' + namespace, function( e, list, callback, init ) {
+ e.stopPropagation();
+ ts.sortOn( this.config, list, callback, init );
+ })
+ .bind( 'appendCache' + namespace, function( e, callback, init ) {
+ e.stopPropagation();
+ ts.appendCache( this.config, init );
+ if ( $.isFunction( callback ) ) {
+ callback( this );
+ }
+ })
+ // $tbodies variable is used by the tbody sorting widget
+ .bind( 'updateCache' + namespace, function( e, callback, $tbodies ) {
+ e.stopPropagation();
+ ts.updateCache( this.config, callback, $tbodies );
+ })
+ .bind( 'applyWidgetId' + namespace, function( e, id ) {
+ e.stopPropagation();
+ ts.applyWidgetId( this, id );
+ })
+ .bind( 'applyWidgets' + namespace, function( e, callback ) {
+ e.stopPropagation();
+ // apply widgets (false = not initializing)
+ ts.applyWidget( this, false, callback );
+ })
+ .bind( 'refreshWidgets' + namespace, function( e, all, dontapply ) {
+ e.stopPropagation();
+ ts.refreshWidgets( this, all, dontapply );
+ })
+ .bind( 'removeWidget' + namespace, function( e, name, refreshing ) {
+ e.stopPropagation();
+ ts.removeWidget( this, name, refreshing );
+ })
+ .bind( 'destroy' + namespace, function( e, removeClasses, callback ) {
+ e.stopPropagation();
+ ts.destroy( this, removeClasses, callback );
+ })
+ .bind( 'resetToLoadState' + namespace, function( e ) {
+ e.stopPropagation();
+ // remove all widgets
+ ts.removeWidget( this, true, false );
+ var tmp = $.extend( true, {}, c.originalSettings );
+ // restore original settings; this clears out current settings, but does not clear
+ // values saved to storage.
+ c = $.extend( true, {}, ts.defaults, tmp );
+ c.originalSettings = tmp;
+ this.hasInitialized = false;
+ // setup the entire table again
+ ts.setup( this, c );
+ });
+ },
+
+ bindEvents : function( table, $headers, core ) {
+ table = $( table )[ 0 ];
+ var tmp,
+ c = table.config,
+ namespace = c.namespace,
+ downTarget = null;
+ if ( core !== true ) {
+ $headers.addClass( namespace.slice( 1 ) + '_extra_headers' );
+ tmp = ts.getClosest( $headers, 'table' );
+ if ( tmp.length && tmp[ 0 ].nodeName === 'TABLE' && tmp[ 0 ] !== table ) {
+ $( tmp[ 0 ] ).addClass( namespace.slice( 1 ) + '_extra_table' );
+ }
+ }
+ tmp = ( c.pointerDown + ' ' + c.pointerUp + ' ' + c.pointerClick + ' sort keyup ' )
+ .replace( ts.regex.spaces, ' ' )
+ .split( ' ' )
+ .join( namespace + ' ' );
+ // apply event handling to headers and/or additional headers (stickyheaders, scroller, etc)
+ $headers
+ // http://stackoverflow.com/questions/5312849/jquery-find-self;
+ .find( c.selectorSort )
+ .add( $headers.filter( c.selectorSort ) )
+ .unbind( tmp )
+ .bind( tmp, function( e, external ) {
+ var $cell, cell, temp,
+ $target = $( e.target ),
+ // wrap event type in spaces, so the match doesn't trigger on inner words
+ type = ' ' + e.type + ' ';
+ // only recognize left clicks
+ if ( ( ( e.which || e.button ) !== 1 && !type.match( ' ' + c.pointerClick + ' | sort | keyup ' ) ) ||
+ // allow pressing enter
+ ( type === ' keyup ' && e.which !== ts.keyCodes.enter ) ||
+ // allow triggering a click event (e.which is undefined) & ignore physical clicks
+ ( type.match( ' ' + c.pointerClick + ' ' ) && typeof e.which !== 'undefined' ) ) {
+ return;
+ }
+ // ignore mouseup if mousedown wasn't on the same target
+ if ( type.match( ' ' + c.pointerUp + ' ' ) && downTarget !== e.target && external !== true ) {
+ return;
+ }
+ // set target on mousedown
+ if ( type.match( ' ' + c.pointerDown + ' ' ) ) {
+ downTarget = e.target;
+ // preventDefault needed or jQuery v1.3.2 and older throws an
+ // "Uncaught TypeError: handler.apply is not a function" error
+ temp = $target.jquery.split( '.' );
+ if ( temp[ 0 ] === '1' && temp[ 1 ] < 4 ) { e.preventDefault(); }
+ return;
+ }
+ downTarget = null;
+ // prevent sort being triggered on form elements
+ if ( ts.regex.formElements.test( e.target.nodeName ) ||
+ // nosort class name, or elements within a nosort container
+ $target.hasClass( c.cssNoSort ) || $target.parents( '.' + c.cssNoSort ).length > 0 ||
+ // elements within a button
+ $target.parents( 'button' ).length > 0 ) {
+ return !c.cancelSelection;
+ }
+ if ( c.delayInit && ts.isEmptyObject( c.cache ) ) {
+ ts.buildCache( c );
+ }
+ $cell = ts.getClosest( $( this ), '.' + ts.css.header );
+ // reference original table headers and find the same cell
+ // don't use $headers or IE8 throws an error - see #987
+ temp = $headers.index( $cell );
+ c.last.clickedIndex = ( temp < 0 ) ? $cell.attr( 'data-column' ) : temp;
+ // use column index if $headers is undefined
+ cell = c.$headers[ c.last.clickedIndex ];
+ if ( cell && !cell.sortDisabled ) {
+ ts.initSort( c, cell, e );
+ }
+ });
+ if ( c.cancelSelection ) {
+ // cancel selection
+ $headers
+ .attr( 'unselectable', 'on' )
+ .bind( 'selectstart', false )
+ .css({
+ 'user-select' : 'none',
+ 'MozUserSelect' : 'none' // not needed for jQuery 1.8+
+ });
+ }
+ },
+
+ buildHeaders : function( c ) {
+ var $temp, icon, timer, indx;
+ c.headerList = [];
+ c.headerContent = [];
+ c.sortVars = [];
+ if ( ts.debug(c, 'core') ) {
+ timer = new Date();
+ }
+ // children tr in tfoot - see issue #196 & #547
+ // don't pass table.config to computeColumnIndex here - widgets (math) pass it to "quickly" index tbody cells
+ c.columns = ts.computeColumnIndex( c.$table.children( 'thead, tfoot' ).children( 'tr' ) );
+ // add icon if cssIcon option exists
+ icon = c.cssIcon ?
+ '' :
+ '';
+ // redefine c.$headers here in case of an updateAll that replaces or adds an entire header cell - see #683
+ c.$headers = $( $.map( c.$table.find( c.selectorHeaders ), function( elem, index ) {
+ var configHeaders, header, column, template, tmp,
+ $elem = $( elem );
+ // ignore cell (don't add it to c.$headers) if row has ignoreRow class
+ if ( ts.getClosest( $elem, 'tr' ).hasClass( c.cssIgnoreRow ) ) { return; }
+ // transfer data-column to element if not th/td - #1459
+ if ( !/(th|td)/i.test( elem.nodeName ) ) {
+ tmp = ts.getClosest( $elem, 'th, td' );
+ $elem.attr( 'data-column', tmp.attr( 'data-column' ) );
+ }
+ // make sure to get header cell & not column indexed cell
+ configHeaders = ts.getColumnData( c.table, c.headers, index, true );
+ // save original header content
+ c.headerContent[ index ] = $elem.html();
+ // if headerTemplate is empty, don't reformat the header cell
+ if ( c.headerTemplate !== '' && !$elem.find( '.' + ts.css.headerIn ).length ) {
+ // set up header template
+ template = c.headerTemplate
+ .replace( ts.regex.templateContent, $elem.html() )
+ .replace( ts.regex.templateIcon, $elem.find( '.' + ts.css.icon ).length ? '' : icon );
+ if ( c.onRenderTemplate ) {
+ header = c.onRenderTemplate.apply( $elem, [ index, template ] );
+ // only change t if something is returned
+ if ( header && typeof header === 'string' ) {
+ template = header;
+ }
+ }
+ $elem.html( '
' ); // faster than wrapInner
+ }
+ if ( c.onRenderHeader ) {
+ c.onRenderHeader.apply( $elem, [ index, c, c.$table ] );
+ }
+ column = parseInt( $elem.attr( 'data-column' ), 10 );
+ elem.column = column;
+ tmp = ts.getOrder( ts.getData( $elem, configHeaders, 'sortInitialOrder' ) || c.sortInitialOrder );
+ // this may get updated numerous times if there are multiple rows
+ c.sortVars[ column ] = {
+ count : -1, // set to -1 because clicking on the header automatically adds one
+ order: tmp ?
+ ( c.sortReset ? [ 1, 0, 2 ] : [ 1, 0 ] ) : // desc, asc, unsorted
+ ( c.sortReset ? [ 0, 1, 2 ] : [ 0, 1 ] ), // asc, desc, unsorted
+ lockedOrder : false
+ };
+ tmp = ts.getData( $elem, configHeaders, 'lockedOrder' ) || false;
+ if ( typeof tmp !== 'undefined' && tmp !== false ) {
+ c.sortVars[ column ].lockedOrder = true;
+ c.sortVars[ column ].order = ts.getOrder( tmp ) ? [ 1, 1 ] : [ 0, 0 ];
+ }
+ // add cell to headerList
+ c.headerList[ index ] = elem;
+ $elem.addClass( ts.css.header + ' ' + c.cssHeader );
+ // add to parent in case there are multiple rows
+ ts.getClosest( $elem, 'tr' )
+ .addClass( ts.css.headerRow + ' ' + c.cssHeaderRow )
+ .attr( 'role', 'row' );
+ // allow keyboard cursor to focus on element
+ if ( c.tabIndex ) {
+ $elem.attr( 'tabindex', 0 );
+ }
+ return elem;
+ }) );
+ // cache headers per column
+ c.$headerIndexed = [];
+ for ( indx = 0; indx < c.columns; indx++ ) {
+ // colspan in header making a column undefined
+ if ( ts.isEmptyObject( c.sortVars[ indx ] ) ) {
+ c.sortVars[ indx ] = {};
+ }
+ // Use c.$headers.parent() in case selectorHeaders doesn't point to the th/td
+ $temp = c.$headers.filter( '[data-column="' + indx + '"]' );
+ // target sortable column cells, unless there are none, then use non-sortable cells
+ // .last() added in jQuery 1.4; use .filter(':last') to maintain compatibility with jQuery v1.2.6
+ c.$headerIndexed[ indx ] = $temp.length ?
+ $temp.not( '.sorter-false' ).length ?
+ $temp.not( '.sorter-false' ).filter( ':last' ) :
+ $temp.filter( ':last' ) :
+ $();
+ }
+ c.$table.find( c.selectorHeaders ).attr({
+ scope: 'col',
+ role : 'columnheader'
+ });
+ // enable/disable sorting
+ ts.updateHeader( c );
+ if ( ts.debug(c, 'core') ) {
+ console.log( 'Built headers:' + ts.benchmark( timer ) );
+ console.log( c.$headers );
+ }
+ },
+
+ // Use it to add a set of methods to table.config which will be available for all tables.
+ // This should be done before table initialization
+ addInstanceMethods : function( methods ) {
+ $.extend( ts.instanceMethods, methods );
+ },
+
+ /*
+ █████▄ ▄████▄ █████▄ ▄█████ ██████ █████▄ ▄█████
+ ██▄▄██ ██▄▄██ ██▄▄██ ▀█▄ ██▄▄ ██▄▄██ ▀█▄
+ ██▀▀▀ ██▀▀██ ██▀██ ▀█▄ ██▀▀ ██▀██ ▀█▄
+ ██ ██ ██ ██ ██ █████▀ ██████ ██ ██ █████▀
+ */
+ setupParsers : function( c, $tbodies ) {
+ var rows, list, span, max, colIndex, indx, header, configHeaders,
+ noParser, parser, extractor, time, tbody, len,
+ table = c.table,
+ tbodyIndex = 0,
+ debug = ts.debug(c, 'core'),
+ debugOutput = {};
+ // update table bodies in case we start with an empty table
+ c.$tbodies = c.$table.children( 'tbody:not(.' + c.cssInfoBlock + ')' );
+ tbody = typeof $tbodies === 'undefined' ? c.$tbodies : $tbodies;
+ len = tbody.length;
+ if ( len === 0 ) {
+ return debug ? console.warn( 'Warning: *Empty table!* Not building a parser cache' ) : '';
+ } else if ( debug ) {
+ time = new Date();
+ console[ console.group ? 'group' : 'log' ]( 'Detecting parsers for each column' );
+ }
+ list = {
+ extractors: [],
+ parsers: []
+ };
+ while ( tbodyIndex < len ) {
+ rows = tbody[ tbodyIndex ].rows;
+ if ( rows.length ) {
+ colIndex = 0;
+ max = c.columns;
+ for ( indx = 0; indx < max; indx++ ) {
+ header = c.$headerIndexed[ colIndex ];
+ if ( header && header.length ) {
+ // get column indexed table cell; adding true parameter fixes #1362 but
+ // it would break backwards compatibility...
+ configHeaders = ts.getColumnData( table, c.headers, colIndex ); // , true );
+ // get column parser/extractor
+ extractor = ts.getParserById( ts.getData( header, configHeaders, 'extractor' ) );
+ parser = ts.getParserById( ts.getData( header, configHeaders, 'sorter' ) );
+ noParser = ts.getData( header, configHeaders, 'parser' ) === 'false';
+ // empty cells behaviour - keeping emptyToBottom for backwards compatibility
+ c.empties[colIndex] = (
+ ts.getData( header, configHeaders, 'empty' ) ||
+ c.emptyTo || ( c.emptyToBottom ? 'bottom' : 'top' ) ).toLowerCase();
+ // text strings behaviour in numerical sorts
+ c.strings[colIndex] = (
+ ts.getData( header, configHeaders, 'string' ) ||
+ c.stringTo ||
+ 'max' ).toLowerCase();
+ if ( noParser ) {
+ parser = ts.getParserById( 'no-parser' );
+ }
+ if ( !extractor ) {
+ // For now, maybe detect someday
+ extractor = false;
+ }
+ if ( !parser ) {
+ parser = ts.detectParserForColumn( c, rows, -1, colIndex );
+ }
+ if ( debug ) {
+ debugOutput[ '(' + colIndex + ') ' + header.text() ] = {
+ parser : parser.id,
+ extractor : extractor ? extractor.id : 'none',
+ string : c.strings[ colIndex ],
+ empty : c.empties[ colIndex ]
+ };
+ }
+ list.parsers[ colIndex ] = parser;
+ list.extractors[ colIndex ] = extractor;
+ span = header[ 0 ].colSpan - 1;
+ if ( span > 0 ) {
+ colIndex += span;
+ max += span;
+ while ( span + 1 > 0 ) {
+ // set colspan columns to use the same parsers & extractors
+ list.parsers[ colIndex - span ] = parser;
+ list.extractors[ colIndex - span ] = extractor;
+ span--;
+ }
+ }
+ }
+ colIndex++;
+ }
+ }
+ tbodyIndex += ( list.parsers.length ) ? len : 1;
+ }
+ if ( debug ) {
+ if ( !ts.isEmptyObject( debugOutput ) ) {
+ console[ console.table ? 'table' : 'log' ]( debugOutput );
+ } else {
+ console.warn( ' No parsers detected!' );
+ }
+ console.log( 'Completed detecting parsers' + ts.benchmark( time ) );
+ if ( console.groupEnd ) { console.groupEnd(); }
+ }
+ c.parsers = list.parsers;
+ c.extractors = list.extractors;
+ },
+
+ addParser : function( parser ) {
+ var indx,
+ len = ts.parsers.length,
+ add = true;
+ for ( indx = 0; indx < len; indx++ ) {
+ if ( ts.parsers[ indx ].id.toLowerCase() === parser.id.toLowerCase() ) {
+ add = false;
+ }
+ }
+ if ( add ) {
+ ts.parsers[ ts.parsers.length ] = parser;
+ }
+ },
+
+ getParserById : function( name ) {
+ /*jshint eqeqeq:false */ // eslint-disable-next-line eqeqeq
+ if ( name == 'false' ) { return false; }
+ var indx,
+ len = ts.parsers.length;
+ for ( indx = 0; indx < len; indx++ ) {
+ if ( ts.parsers[ indx ].id.toLowerCase() === ( name.toString() ).toLowerCase() ) {
+ return ts.parsers[ indx ];
+ }
+ }
+ return false;
+ },
+
+ detectParserForColumn : function( c, rows, rowIndex, cellIndex ) {
+ var cur, $node, row,
+ indx = ts.parsers.length,
+ node = false,
+ nodeValue = '',
+ debug = ts.debug(c, 'core'),
+ keepLooking = true;
+ while ( nodeValue === '' && keepLooking ) {
+ rowIndex++;
+ row = rows[ rowIndex ];
+ // stop looking after 50 empty rows
+ if ( row && rowIndex < 50 ) {
+ if ( row.className.indexOf( ts.cssIgnoreRow ) < 0 ) {
+ node = rows[ rowIndex ].cells[ cellIndex ];
+ nodeValue = ts.getElementText( c, node, cellIndex );
+ $node = $( node );
+ if ( debug ) {
+ console.log( 'Checking if value was empty on row ' + rowIndex + ', column: ' +
+ cellIndex + ': "' + nodeValue + '"' );
+ }
+ }
+ } else {
+ keepLooking = false;
+ }
+ }
+ while ( --indx >= 0 ) {
+ cur = ts.parsers[ indx ];
+ // ignore the default text parser because it will always be true
+ if ( cur && cur.id !== 'text' && cur.is && cur.is( nodeValue, c.table, node, $node ) ) {
+ return cur;
+ }
+ }
+ // nothing found, return the generic parser (text)
+ return ts.getParserById( 'text' );
+ },
+
+ getElementText : function( c, node, cellIndex ) {
+ if ( !node ) { return ''; }
+ var tmp,
+ extract = c.textExtraction || '',
+ // node could be a jquery object
+ // http://jsperf.com/jquery-vs-instanceof-jquery/2
+ $node = node.jquery ? node : $( node );
+ if ( typeof extract === 'string' ) {
+ // check data-attribute first when set to 'basic'; don't use node.innerText - it's really slow!
+ // http://www.kellegous.com/j/2013/02/27/innertext-vs-textcontent/
+ if ( extract === 'basic' && typeof ( tmp = $node.attr( c.textAttribute ) ) !== 'undefined' ) {
+ return $.trim( tmp );
+ }
+ return $.trim( node.textContent || $node.text() );
+ } else {
+ if ( typeof extract === 'function' ) {
+ return $.trim( extract( $node[ 0 ], c.table, cellIndex ) );
+ } else if ( typeof ( tmp = ts.getColumnData( c.table, extract, cellIndex ) ) === 'function' ) {
+ return $.trim( tmp( $node[ 0 ], c.table, cellIndex ) );
+ }
+ }
+ // fallback
+ return $.trim( $node[ 0 ].textContent || $node.text() );
+ },
+
+ // centralized function to extract/parse cell contents
+ getParsedText : function( c, cell, colIndex, txt ) {
+ if ( typeof txt === 'undefined' ) {
+ txt = ts.getElementText( c, cell, colIndex );
+ }
+ // if no parser, make sure to return the txt
+ var val = '' + txt,
+ parser = c.parsers[ colIndex ],
+ extractor = c.extractors[ colIndex ];
+ if ( parser ) {
+ // do extract before parsing, if there is one
+ if ( extractor && typeof extractor.format === 'function' ) {
+ txt = extractor.format( txt, c.table, cell, colIndex );
+ }
+ // allow parsing if the string is empty, previously parsing would change it to zero,
+ // in case the parser needs to extract data from the table cell attributes
+ val = parser.id === 'no-parser' ? '' :
+ // make sure txt is a string (extractor may have converted it)
+ parser.format( '' + txt, c.table, cell, colIndex );
+ if ( c.ignoreCase && typeof val === 'string' ) {
+ val = val.toLowerCase();
+ }
+ }
+ return val;
+ },
+
+ /*
+ ▄████▄ ▄████▄ ▄████▄ ██ ██ ██████
+ ██ ▀▀ ██▄▄██ ██ ▀▀ ██▄▄██ ██▄▄
+ ██ ▄▄ ██▀▀██ ██ ▄▄ ██▀▀██ ██▀▀
+ ▀████▀ ██ ██ ▀████▀ ██ ██ ██████
+ */
+ buildCache : function( c, callback, $tbodies ) {
+ var cache, val, txt, rowIndex, colIndex, tbodyIndex, $tbody, $row,
+ cols, $cells, cell, cacheTime, totalRows, rowData, prevRowData,
+ colMax, span, cacheIndex, hasParser, max, len, index,
+ table = c.table,
+ parsers = c.parsers,
+ debug = ts.debug(c, 'core');
+ // update tbody variable
+ c.$tbodies = c.$table.children( 'tbody:not(.' + c.cssInfoBlock + ')' );
+ $tbody = typeof $tbodies === 'undefined' ? c.$tbodies : $tbodies,
+ c.cache = {};
+ c.totalRows = 0;
+ // if no parsers found, return - it's an empty table.
+ if ( !parsers ) {
+ return debug ? console.warn( 'Warning: *Empty table!* Not building a cache' ) : '';
+ }
+ if ( debug ) {
+ cacheTime = new Date();
+ }
+ // processing icon
+ if ( c.showProcessing ) {
+ ts.isProcessing( table, true );
+ }
+ for ( tbodyIndex = 0; tbodyIndex < $tbody.length; tbodyIndex++ ) {
+ colMax = []; // column max value per tbody
+ cache = c.cache[ tbodyIndex ] = {
+ normalized: [] // array of normalized row data; last entry contains 'rowData' above
+ // colMax: # // added at the end
+ };
+
+ totalRows = ( $tbody[ tbodyIndex ] && $tbody[ tbodyIndex ].rows.length ) || 0;
+ for ( rowIndex = 0; rowIndex < totalRows; ++rowIndex ) {
+ rowData = {
+ // order: original row order #
+ // $row : jQuery Object[]
+ child: [], // child row text (filter widget)
+ raw: [] // original row text
+ };
+ /** Add the table data to main data array */
+ $row = $( $tbody[ tbodyIndex ].rows[ rowIndex ] );
+ cols = [];
+ // ignore "remove-me" rows
+ if ( $row.hasClass( c.selectorRemove.slice(1) ) ) {
+ continue;
+ }
+ // if this is a child row, add it to the last row's children and continue to the next row
+ // ignore child row class, if it is the first row
+ if ( $row.hasClass( c.cssChildRow ) && rowIndex !== 0 ) {
+ len = cache.normalized.length - 1;
+ prevRowData = cache.normalized[ len ][ c.columns ];
+ prevRowData.$row = prevRowData.$row.add( $row );
+ // add 'hasChild' class name to parent row
+ if ( !$row.prev().hasClass( c.cssChildRow ) ) {
+ $row.prev().addClass( ts.css.cssHasChild );
+ }
+ // save child row content (un-parsed!)
+ $cells = $row.children( 'th, td' );
+ len = prevRowData.child.length;
+ prevRowData.child[ len ] = [];
+ // child row content does not account for colspans/rowspans; so indexing may be off
+ cacheIndex = 0;
+ max = c.columns;
+ for ( colIndex = 0; colIndex < max; colIndex++ ) {
+ cell = $cells[ colIndex ];
+ if ( cell ) {
+ prevRowData.child[ len ][ colIndex ] = ts.getParsedText( c, cell, colIndex );
+ span = $cells[ colIndex ].colSpan - 1;
+ if ( span > 0 ) {
+ cacheIndex += span;
+ max += span;
+ }
+ }
+ cacheIndex++;
+ }
+ // go to the next for loop
+ continue;
+ }
+ rowData.$row = $row;
+ rowData.order = rowIndex; // add original row position to rowCache
+ cacheIndex = 0;
+ max = c.columns;
+ for ( colIndex = 0; colIndex < max; ++colIndex ) {
+ cell = $row[ 0 ].cells[ colIndex ];
+ if ( cell && cacheIndex < c.columns ) {
+ hasParser = typeof parsers[ cacheIndex ] !== 'undefined';
+ if ( !hasParser && debug ) {
+ console.warn( 'No parser found for row: ' + rowIndex + ', column: ' + colIndex +
+ '; cell containing: "' + $(cell).text() + '"; does it have a header?' );
+ }
+ val = ts.getElementText( c, cell, cacheIndex );
+ rowData.raw[ cacheIndex ] = val; // save original row text
+ // save raw column text even if there is no parser set
+ txt = ts.getParsedText( c, cell, cacheIndex, val );
+ cols[ cacheIndex ] = txt;
+ if ( hasParser && ( parsers[ cacheIndex ].type || '' ).toLowerCase() === 'numeric' ) {
+ // determine column max value (ignore sign)
+ colMax[ cacheIndex ] = Math.max( Math.abs( txt ) || 0, colMax[ cacheIndex ] || 0 );
+ }
+ // allow colSpan in tbody
+ span = cell.colSpan - 1;
+ if ( span > 0 ) {
+ index = 0;
+ while ( index <= span ) {
+ // duplicate text (or not) to spanned columns
+ // instead of setting duplicate span to empty string, use textExtraction to try to get a value
+ // see http://stackoverflow.com/q/36449711/145346
+ txt = c.duplicateSpan || index === 0 ?
+ val :
+ typeof c.textExtraction !== 'string' ?
+ ts.getElementText( c, cell, cacheIndex + index ) || '' :
+ '';
+ rowData.raw[ cacheIndex + index ] = txt;
+ cols[ cacheIndex + index ] = txt;
+ index++;
+ }
+ cacheIndex += span;
+ max += span;
+ }
+ }
+ cacheIndex++;
+ }
+ // ensure rowData is always in the same location (after the last column)
+ cols[ c.columns ] = rowData;
+ cache.normalized[ cache.normalized.length ] = cols;
+ }
+ cache.colMax = colMax;
+ // total up rows, not including child rows
+ c.totalRows += cache.normalized.length;
+
+ }
+ if ( c.showProcessing ) {
+ ts.isProcessing( table ); // remove processing icon
+ }
+ if ( debug ) {
+ len = Math.min( 5, c.cache[ 0 ].normalized.length );
+ console[ console.group ? 'group' : 'log' ]( 'Building cache for ' + c.totalRows +
+ ' rows (showing ' + len + ' rows in log) and ' + c.columns + ' columns' +
+ ts.benchmark( cacheTime ) );
+ val = {};
+ for ( colIndex = 0; colIndex < c.columns; colIndex++ ) {
+ for ( cacheIndex = 0; cacheIndex < len; cacheIndex++ ) {
+ if ( !val[ 'row: ' + cacheIndex ] ) {
+ val[ 'row: ' + cacheIndex ] = {};
+ }
+ val[ 'row: ' + cacheIndex ][ c.$headerIndexed[ colIndex ].text() ] =
+ c.cache[ 0 ].normalized[ cacheIndex ][ colIndex ];
+ }
+ }
+ console[ console.table ? 'table' : 'log' ]( val );
+ if ( console.groupEnd ) { console.groupEnd(); }
+ }
+ if ( $.isFunction( callback ) ) {
+ callback( table );
+ }
+ },
+
+ getColumnText : function( table, column, callback, rowFilter ) {
+ table = $( table )[0];
+ var tbodyIndex, rowIndex, cache, row, tbodyLen, rowLen, raw, parsed, $cell, result,
+ hasCallback = typeof callback === 'function',
+ allColumns = column === 'all',
+ data = { raw : [], parsed: [], $cell: [] },
+ c = table.config;
+ if ( ts.isEmptyObject( c ) ) {
+ if ( ts.debug(c, 'core') ) {
+ console.warn( 'No cache found - aborting getColumnText function!' );
+ }
+ } else {
+ tbodyLen = c.$tbodies.length;
+ for ( tbodyIndex = 0; tbodyIndex < tbodyLen; tbodyIndex++ ) {
+ cache = c.cache[ tbodyIndex ].normalized;
+ rowLen = cache.length;
+ for ( rowIndex = 0; rowIndex < rowLen; rowIndex++ ) {
+ row = cache[ rowIndex ];
+ if ( rowFilter && !row[ c.columns ].$row.is( rowFilter ) ) {
+ continue;
+ }
+ result = true;
+ parsed = ( allColumns ) ? row.slice( 0, c.columns ) : row[ column ];
+ row = row[ c.columns ];
+ raw = ( allColumns ) ? row.raw : row.raw[ column ];
+ $cell = ( allColumns ) ? row.$row.children() : row.$row.children().eq( column );
+ if ( hasCallback ) {
+ result = callback({
+ tbodyIndex : tbodyIndex,
+ rowIndex : rowIndex,
+ parsed : parsed,
+ raw : raw,
+ $row : row.$row,
+ $cell : $cell
+ });
+ }
+ if ( result !== false ) {
+ data.parsed[ data.parsed.length ] = parsed;
+ data.raw[ data.raw.length ] = raw;
+ data.$cell[ data.$cell.length ] = $cell;
+ }
+ }
+ }
+ // return everything
+ return data;
+ }
+ },
+
+ /*
+ ██ ██ █████▄ █████▄ ▄████▄ ██████ ██████
+ ██ ██ ██▄▄██ ██ ██ ██▄▄██ ██ ██▄▄
+ ██ ██ ██▀▀▀ ██ ██ ██▀▀██ ██ ██▀▀
+ ▀████▀ ██ █████▀ ██ ██ ██ ██████
+ */
+ setHeadersCss : function( c ) {
+ var indx, column,
+ list = c.sortList,
+ len = list.length,
+ none = ts.css.sortNone + ' ' + c.cssNone,
+ css = [ ts.css.sortAsc + ' ' + c.cssAsc, ts.css.sortDesc + ' ' + c.cssDesc ],
+ cssIcon = [ c.cssIconAsc, c.cssIconDesc, c.cssIconNone ],
+ aria = [ 'ascending', 'descending' ],
+ updateColumnSort = function($el, index) {
+ $el
+ .removeClass( none )
+ .addClass( css[ index ] )
+ .attr( 'aria-sort', aria[ index ] )
+ .find( '.' + ts.css.icon )
+ .removeClass( cssIcon[ 2 ] )
+ .addClass( cssIcon[ index ] );
+ },
+ // find the footer
+ $extras = c.$table
+ .find( 'tfoot tr' )
+ .children( 'td, th' )
+ .add( $( c.namespace + '_extra_headers' ) )
+ .removeClass( css.join( ' ' ) ),
+ // remove all header information
+ $sorted = c.$headers
+ .add( $( 'thead ' + c.namespace + '_extra_headers' ) )
+ .removeClass( css.join( ' ' ) )
+ .addClass( none )
+ .attr( 'aria-sort', 'none' )
+ .find( '.' + ts.css.icon )
+ .removeClass( cssIcon.join( ' ' ) )
+ .end();
+ // add css none to all sortable headers
+ $sorted
+ .not( '.sorter-false' )
+ .find( '.' + ts.css.icon )
+ .addClass( cssIcon[ 2 ] );
+ // add disabled css icon class
+ if ( c.cssIconDisabled ) {
+ $sorted
+ .filter( '.sorter-false' )
+ .find( '.' + ts.css.icon )
+ .addClass( c.cssIconDisabled );
+ }
+ for ( indx = 0; indx < len; indx++ ) {
+ // direction = 2 means reset!
+ if ( list[ indx ][ 1 ] !== 2 ) {
+ // multicolumn sorting updating - see #1005
+ // .not(function() {}) needs jQuery 1.4
+ // filter(function(i, el) {}) <- el is undefined in jQuery v1.2.6
+ $sorted = c.$headers.filter( function( i ) {
+ // only include headers that are in the sortList (this includes colspans)
+ var include = true,
+ $el = c.$headers.eq( i ),
+ col = parseInt( $el.attr( 'data-column' ), 10 ),
+ end = col + ts.getClosest( $el, 'th, td' )[0].colSpan;
+ for ( ; col < end; col++ ) {
+ include = include ? include || ts.isValueInArray( col, c.sortList ) > -1 : false;
+ }
+ return include;
+ });
+
+ // choose the :last in case there are nested columns
+ $sorted = $sorted
+ .not( '.sorter-false' )
+ .filter( '[data-column="' + list[ indx ][ 0 ] + '"]' + ( len === 1 ? ':last' : '' ) );
+ if ( $sorted.length ) {
+ for ( column = 0; column < $sorted.length; column++ ) {
+ if ( !$sorted[ column ].sortDisabled ) {
+ updateColumnSort( $sorted.eq( column ), list[ indx ][ 1 ] );
+ }
+ }
+ }
+ // add sorted class to footer & extra headers, if they exist
+ if ( $extras.length ) {
+ updateColumnSort( $extras.filter( '[data-column="' + list[ indx ][ 0 ] + '"]' ), list[ indx ][ 1 ] );
+ }
+ }
+ }
+ // add verbose aria labels
+ len = c.$headers.length;
+ for ( indx = 0; indx < len; indx++ ) {
+ ts.setColumnAriaLabel( c, c.$headers.eq( indx ) );
+ }
+ },
+
+ getClosest : function( $el, selector ) {
+ // jQuery v1.2.6 doesn't have closest()
+ if ( $.fn.closest ) {
+ return $el.closest( selector );
+ }
+ return $el.is( selector ) ?
+ $el :
+ $el.parents( selector ).filter( ':first' );
+ },
+
+ // nextSort (optional), lets you disable next sort text
+ setColumnAriaLabel : function( c, $header, nextSort ) {
+ if ( $header.length ) {
+ var column = parseInt( $header.attr( 'data-column' ), 10 ),
+ vars = c.sortVars[ column ],
+ tmp = $header.hasClass( ts.css.sortAsc ) ?
+ 'sortAsc' :
+ $header.hasClass( ts.css.sortDesc ) ? 'sortDesc' : 'sortNone',
+ txt = $.trim( $header.text() ) + ': ' + ts.language[ tmp ];
+ if ( $header.hasClass( 'sorter-false' ) || nextSort === false ) {
+ txt += ts.language.sortDisabled;
+ } else {
+ tmp = ( vars.count + 1 ) % vars.order.length;
+ nextSort = vars.order[ tmp ];
+ // if nextSort
+ txt += ts.language[ nextSort === 0 ? 'nextAsc' : nextSort === 1 ? 'nextDesc' : 'nextNone' ];
+ }
+ $header.attr( 'aria-label', txt );
+ }
+ },
+
+ updateHeader : function( c ) {
+ var index, isDisabled, $header, col,
+ table = c.table,
+ len = c.$headers.length;
+ for ( index = 0; index < len; index++ ) {
+ $header = c.$headers.eq( index );
+ col = ts.getColumnData( table, c.headers, index, true );
+ // add 'sorter-false' class if 'parser-false' is set
+ isDisabled = ts.getData( $header, col, 'sorter' ) === 'false' || ts.getData( $header, col, 'parser' ) === 'false';
+ ts.setColumnSort( c, $header, isDisabled );
+ }
+ },
+
+ setColumnSort : function( c, $header, isDisabled ) {
+ var id = c.table.id;
+ $header[ 0 ].sortDisabled = isDisabled;
+ $header[ isDisabled ? 'addClass' : 'removeClass' ]( 'sorter-false' )
+ .attr( 'aria-disabled', '' + isDisabled );
+ // disable tab index on disabled cells
+ if ( c.tabIndex ) {
+ if ( isDisabled ) {
+ $header.removeAttr( 'tabindex' );
+ } else {
+ $header.attr( 'tabindex', '0' );
+ }
+ }
+ // aria-controls - requires table ID
+ if ( id ) {
+ if ( isDisabled ) {
+ $header.removeAttr( 'aria-controls' );
+ } else {
+ $header.attr( 'aria-controls', id );
+ }
+ }
+ },
+
+ updateHeaderSortCount : function( c, list ) {
+ var col, dir, group, indx, primary, temp, val, order,
+ sortList = list || c.sortList,
+ len = sortList.length;
+ c.sortList = [];
+ for ( indx = 0; indx < len; indx++ ) {
+ val = sortList[ indx ];
+ // ensure all sortList values are numeric - fixes #127
+ col = parseInt( val[ 0 ], 10 );
+ // prevents error if sorton array is wrong
+ if ( col < c.columns ) {
+
+ // set order if not already defined - due to colspan header without associated header cell
+ // adding this check prevents a javascript error
+ if ( !c.sortVars[ col ].order ) {
+ if ( ts.getOrder( c.sortInitialOrder ) ) {
+ order = c.sortReset ? [ 1, 0, 2 ] : [ 1, 0 ];
+ } else {
+ order = c.sortReset ? [ 0, 1, 2 ] : [ 0, 1 ];
+ }
+ c.sortVars[ col ].order = order;
+ c.sortVars[ col ].count = 0;
+ }
+
+ order = c.sortVars[ col ].order;
+ dir = ( '' + val[ 1 ] ).match( /^(1|d|s|o|n)/ );
+ dir = dir ? dir[ 0 ] : '';
+ // 0/(a)sc (default), 1/(d)esc, (s)ame, (o)pposite, (n)ext
+ switch ( dir ) {
+ case '1' : case 'd' : // descending
+ dir = 1;
+ break;
+ case 's' : // same direction (as primary column)
+ // if primary sort is set to 's', make it ascending
+ dir = primary || 0;
+ break;
+ case 'o' :
+ temp = order[ ( primary || 0 ) % order.length ];
+ // opposite of primary column; but resets if primary resets
+ dir = temp === 0 ? 1 : temp === 1 ? 0 : 2;
+ break;
+ case 'n' :
+ dir = order[ ( ++c.sortVars[ col ].count ) % order.length ];
+ break;
+ default : // ascending
+ dir = 0;
+ break;
+ }
+ primary = indx === 0 ? dir : primary;
+ group = [ col, parseInt( dir, 10 ) || 0 ];
+ c.sortList[ c.sortList.length ] = group;
+ dir = $.inArray( group[ 1 ], order ); // fixes issue #167
+ c.sortVars[ col ].count = dir >= 0 ? dir : group[ 1 ] % order.length;
+ }
+ }
+ },
+
+ updateAll : function( c, resort, callback ) {
+ var table = c.table;
+ table.isUpdating = true;
+ ts.refreshWidgets( table, true, true );
+ ts.buildHeaders( c );
+ ts.bindEvents( table, c.$headers, true );
+ ts.bindMethods( c );
+ ts.commonUpdate( c, resort, callback );
+ },
+
+ update : function( c, resort, callback ) {
+ var table = c.table;
+ table.isUpdating = true;
+ // update sorting (if enabled/disabled)
+ ts.updateHeader( c );
+ ts.commonUpdate( c, resort, callback );
+ },
+
+ // simple header update - see #989
+ updateHeaders : function( c, callback ) {
+ c.table.isUpdating = true;
+ ts.buildHeaders( c );
+ ts.bindEvents( c.table, c.$headers, true );
+ ts.resortComplete( c, callback );
+ },
+
+ updateCell : function( c, cell, resort, callback ) {
+ // updateCell for child rows is a mess - we'll ignore them for now
+ // eventually I'll break out the "update" row cache code to make everything consistent
+ if ( $( cell ).closest( 'tr' ).hasClass( c.cssChildRow ) ) {
+ console.warn('Tablesorter Warning! "updateCell" for child row content has been disabled, use "update" instead');
+ return;
+ }
+ if ( ts.isEmptyObject( c.cache ) ) {
+ // empty table, do an update instead - fixes #1099
+ ts.updateHeader( c );
+ ts.commonUpdate( c, resort, callback );
+ return;
+ }
+ c.table.isUpdating = true;
+ c.$table.find( c.selectorRemove ).remove();
+ // get position from the dom
+ var tmp, indx, row, icell, cache, len,
+ $tbodies = c.$tbodies,
+ $cell = $( cell ),
+ // update cache - format: function( s, table, cell, cellIndex )
+ // no closest in jQuery v1.2.6
+ tbodyIndex = $tbodies.index( ts.getClosest( $cell, 'tbody' ) ),
+ tbcache = c.cache[ tbodyIndex ],
+ $row = ts.getClosest( $cell, 'tr' );
+ cell = $cell[ 0 ]; // in case cell is a jQuery object
+ // tbody may not exist if update is initialized while tbody is removed for processing
+ if ( $tbodies.length && tbodyIndex >= 0 ) {
+ row = $tbodies.eq( tbodyIndex ).find( 'tr' ).not( '.' + c.cssChildRow ).index( $row );
+ cache = tbcache.normalized[ row ];
+ len = $row[ 0 ].cells.length;
+ if ( len !== c.columns ) {
+ // colspan in here somewhere!
+ icell = 0;
+ tmp = false;
+ for ( indx = 0; indx < len; indx++ ) {
+ if ( !tmp && $row[ 0 ].cells[ indx ] !== cell ) {
+ icell += $row[ 0 ].cells[ indx ].colSpan;
+ } else {
+ tmp = true;
+ }
+ }
+ } else {
+ icell = $cell.index();
+ }
+ tmp = ts.getElementText( c, cell, icell ); // raw
+ cache[ c.columns ].raw[ icell ] = tmp;
+ tmp = ts.getParsedText( c, cell, icell, tmp );
+ cache[ icell ] = tmp; // parsed
+ if ( ( c.parsers[ icell ].type || '' ).toLowerCase() === 'numeric' ) {
+ // update column max value (ignore sign)
+ tbcache.colMax[ icell ] = Math.max( Math.abs( tmp ) || 0, tbcache.colMax[ icell ] || 0 );
+ }
+ tmp = resort !== 'undefined' ? resort : c.resort;
+ if ( tmp !== false ) {
+ // widgets will be reapplied
+ ts.checkResort( c, tmp, callback );
+ } else {
+ // don't reapply widgets is resort is false, just in case it causes
+ // problems with element focus
+ ts.resortComplete( c, callback );
+ }
+ } else {
+ if ( ts.debug(c, 'core') ) {
+ console.error( 'updateCell aborted, tbody missing or not within the indicated table' );
+ }
+ c.table.isUpdating = false;
+ }
+ },
+
+ addRows : function( c, $row, resort, callback ) {
+ var txt, val, tbodyIndex, rowIndex, rows, cellIndex, len, order,
+ cacheIndex, rowData, cells, cell, span,
+ // allow passing a row string if only one non-info tbody exists in the table
+ valid = typeof $row === 'string' && c.$tbodies.length === 1 && / 0 ) {
+ cacheIndex += span;
+ }
+ cacheIndex++;
+ }
+ // add the row data to the end
+ cells[ c.columns ] = rowData;
+ // update cache
+ c.cache[ tbodyIndex ].normalized[ order ] = cells;
+ }
+ // resort using current settings
+ ts.checkResort( c, resort, callback );
+ }
+ },
+
+ updateCache : function( c, callback, $tbodies ) {
+ // rebuild parsers
+ if ( !( c.parsers && c.parsers.length ) ) {
+ ts.setupParsers( c, $tbodies );
+ }
+ // rebuild the cache map
+ ts.buildCache( c, callback, $tbodies );
+ },
+
+ // init flag (true) used by pager plugin to prevent widget application
+ // renamed from appendToTable
+ appendCache : function( c, init ) {
+ var parsed, totalRows, $tbody, $curTbody, rowIndex, tbodyIndex, appendTime,
+ table = c.table,
+ $tbodies = c.$tbodies,
+ rows = [],
+ cache = c.cache;
+ // empty table - fixes #206/#346
+ if ( ts.isEmptyObject( cache ) ) {
+ // run pager appender in case the table was just emptied
+ return c.appender ? c.appender( table, rows ) :
+ table.isUpdating ? c.$table.triggerHandler( 'updateComplete', table ) : ''; // Fixes #532
+ }
+ if ( ts.debug(c, 'core') ) {
+ appendTime = new Date();
+ }
+ for ( tbodyIndex = 0; tbodyIndex < $tbodies.length; tbodyIndex++ ) {
+ $tbody = $tbodies.eq( tbodyIndex );
+ if ( $tbody.length ) {
+ // detach tbody for manipulation
+ $curTbody = ts.processTbody( table, $tbody, true );
+ parsed = cache[ tbodyIndex ].normalized;
+ totalRows = parsed.length;
+ for ( rowIndex = 0; rowIndex < totalRows; rowIndex++ ) {
+ rows[rows.length] = parsed[ rowIndex ][ c.columns ].$row;
+ // removeRows used by the pager plugin; don't render if using ajax - fixes #411
+ if ( !c.appender || ( c.pager && !c.pager.removeRows && !c.pager.ajax ) ) {
+ $curTbody.append( parsed[ rowIndex ][ c.columns ].$row );
+ }
+ }
+ // restore tbody
+ ts.processTbody( table, $curTbody, false );
+ }
+ }
+ if ( c.appender ) {
+ c.appender( table, rows );
+ }
+ if ( ts.debug(c, 'core') ) {
+ console.log( 'Rebuilt table' + ts.benchmark( appendTime ) );
+ }
+ // apply table widgets; but not before ajax completes
+ if ( !init && !c.appender ) {
+ ts.applyWidget( table );
+ }
+ if ( table.isUpdating ) {
+ c.$table.triggerHandler( 'updateComplete', table );
+ }
+ },
+
+ commonUpdate : function( c, resort, callback ) {
+ // remove rows/elements before update
+ c.$table.find( c.selectorRemove ).remove();
+ // rebuild parsers
+ ts.setupParsers( c );
+ // rebuild the cache map
+ ts.buildCache( c );
+ ts.checkResort( c, resort, callback );
+ },
+
+ /*
+ ▄█████ ▄████▄ █████▄ ██████ ██ █████▄ ▄████▄
+ ▀█▄ ██ ██ ██▄▄██ ██ ██ ██ ██ ██ ▄▄▄
+ ▀█▄ ██ ██ ██▀██ ██ ██ ██ ██ ██ ▀██
+ █████▀ ▀████▀ ██ ██ ██ ██ ██ ██ ▀████▀
+ */
+ initSort : function( c, cell, event ) {
+ if ( c.table.isUpdating ) {
+ // let any updates complete before initializing a sort
+ return setTimeout( function() {
+ ts.initSort( c, cell, event );
+ }, 50 );
+ }
+
+ var arry, indx, headerIndx, dir, temp, tmp, $header,
+ notMultiSort = !event[ c.sortMultiSortKey ],
+ table = c.table,
+ len = c.$headers.length,
+ th = ts.getClosest( $( cell ), 'th, td' ),
+ col = parseInt( th.attr( 'data-column' ), 10 ),
+ order = c.sortVars[ col ].order;
+ th = th[0];
+ // Only call sortStart if sorting is enabled
+ c.$table.triggerHandler( 'sortStart', table );
+ // get current column sort order
+ tmp = ( c.sortVars[ col ].count + 1 ) % order.length;
+ c.sortVars[ col ].count = event[ c.sortResetKey ] ? 2 : tmp;
+ // reset all sorts on non-current column - issue #30
+ if ( c.sortRestart ) {
+ for ( headerIndx = 0; headerIndx < len; headerIndx++ ) {
+ $header = c.$headers.eq( headerIndx );
+ tmp = parseInt( $header.attr( 'data-column' ), 10 );
+ // only reset counts on columns that weren't just clicked on and if not included in a multisort
+ if ( col !== tmp && ( notMultiSort || $header.hasClass( ts.css.sortNone ) ) ) {
+ c.sortVars[ tmp ].count = -1;
+ }
+ }
+ }
+ // user only wants to sort on one column
+ if ( notMultiSort ) {
+ // flush the sort list
+ c.sortList = [];
+ c.last.sortList = [];
+ if ( c.sortForce !== null ) {
+ arry = c.sortForce;
+ for ( indx = 0; indx < arry.length; indx++ ) {
+ if ( arry[ indx ][ 0 ] !== col ) {
+ c.sortList[ c.sortList.length ] = arry[ indx ];
+ }
+ }
+ }
+ // add column to sort list
+ dir = order[ c.sortVars[ col ].count ];
+ if ( dir < 2 ) {
+ c.sortList[ c.sortList.length ] = [ col, dir ];
+ // add other columns if header spans across multiple
+ if ( th.colSpan > 1 ) {
+ for ( indx = 1; indx < th.colSpan; indx++ ) {
+ c.sortList[ c.sortList.length ] = [ col + indx, dir ];
+ // update count on columns in colSpan
+ c.sortVars[ col + indx ].count = $.inArray( dir, order );
+ }
+ }
+ }
+ // multi column sorting
+ } else {
+ // get rid of the sortAppend before adding more - fixes issue #115 & #523
+ c.sortList = $.extend( [], c.last.sortList );
+
+ // the user has clicked on an already sorted column
+ if ( ts.isValueInArray( col, c.sortList ) >= 0 ) {
+ // reverse the sorting direction
+ for ( indx = 0; indx < c.sortList.length; indx++ ) {
+ tmp = c.sortList[ indx ];
+ if ( tmp[ 0 ] === col ) {
+ // order.count seems to be incorrect when compared to cell.count
+ tmp[ 1 ] = order[ c.sortVars[ col ].count ];
+ if ( tmp[1] === 2 ) {
+ c.sortList.splice( indx, 1 );
+ c.sortVars[ col ].count = -1;
+ }
+ }
+ }
+ } else {
+ // add column to sort list array
+ dir = order[ c.sortVars[ col ].count ];
+ if ( dir < 2 ) {
+ c.sortList[ c.sortList.length ] = [ col, dir ];
+ // add other columns if header spans across multiple
+ if ( th.colSpan > 1 ) {
+ for ( indx = 1; indx < th.colSpan; indx++ ) {
+ c.sortList[ c.sortList.length ] = [ col + indx, dir ];
+ // update count on columns in colSpan
+ c.sortVars[ col + indx ].count = $.inArray( dir, order );
+ }
+ }
+ }
+ }
+ }
+ // save sort before applying sortAppend
+ c.last.sortList = $.extend( [], c.sortList );
+ if ( c.sortList.length && c.sortAppend ) {
+ arry = $.isArray( c.sortAppend ) ? c.sortAppend : c.sortAppend[ c.sortList[ 0 ][ 0 ] ];
+ if ( !ts.isEmptyObject( arry ) ) {
+ for ( indx = 0; indx < arry.length; indx++ ) {
+ if ( arry[ indx ][ 0 ] !== col && ts.isValueInArray( arry[ indx ][ 0 ], c.sortList ) < 0 ) {
+ dir = arry[ indx ][ 1 ];
+ temp = ( '' + dir ).match( /^(a|d|s|o|n)/ );
+ if ( temp ) {
+ tmp = c.sortList[ 0 ][ 1 ];
+ switch ( temp[ 0 ] ) {
+ case 'd' :
+ dir = 1;
+ break;
+ case 's' :
+ dir = tmp;
+ break;
+ case 'o' :
+ dir = tmp === 0 ? 1 : 0;
+ break;
+ case 'n' :
+ dir = ( tmp + 1 ) % order.length;
+ break;
+ default:
+ dir = 0;
+ break;
+ }
+ }
+ c.sortList[ c.sortList.length ] = [ arry[ indx ][ 0 ], dir ];
+ }
+ }
+ }
+ }
+ // sortBegin event triggered immediately before the sort
+ c.$table.triggerHandler( 'sortBegin', table );
+ // setTimeout needed so the processing icon shows up
+ setTimeout( function() {
+ // set css for headers
+ ts.setHeadersCss( c );
+ ts.multisort( c );
+ ts.appendCache( c );
+ c.$table.triggerHandler( 'sortBeforeEnd', table );
+ c.$table.triggerHandler( 'sortEnd', table );
+ }, 1 );
+ },
+
+ // sort multiple columns
+ multisort : function( c ) { /*jshint loopfunc:true */
+ var tbodyIndex, sortTime, colMax, rows, tmp,
+ table = c.table,
+ sorter = [],
+ dir = 0,
+ textSorter = c.textSorter || '',
+ sortList = c.sortList,
+ sortLen = sortList.length,
+ len = c.$tbodies.length;
+ if ( c.serverSideSorting || ts.isEmptyObject( c.cache ) ) {
+ // empty table - fixes #206/#346
+ return;
+ }
+ if ( ts.debug(c, 'core') ) { sortTime = new Date(); }
+ // cache textSorter to optimize speed
+ if ( typeof textSorter === 'object' ) {
+ colMax = c.columns;
+ while ( colMax-- ) {
+ tmp = ts.getColumnData( table, textSorter, colMax );
+ if ( typeof tmp === 'function' ) {
+ sorter[ colMax ] = tmp;
+ }
+ }
+ }
+ for ( tbodyIndex = 0; tbodyIndex < len; tbodyIndex++ ) {
+ colMax = c.cache[ tbodyIndex ].colMax;
+ rows = c.cache[ tbodyIndex ].normalized;
+
+ rows.sort( function( a, b ) {
+ var sortIndex, num, col, order, sort, x, y;
+ // rows is undefined here in IE, so don't use it!
+ for ( sortIndex = 0; sortIndex < sortLen; sortIndex++ ) {
+ col = sortList[ sortIndex ][ 0 ];
+ order = sortList[ sortIndex ][ 1 ];
+ // sort direction, true = asc, false = desc
+ dir = order === 0;
+
+ if ( c.sortStable && a[ col ] === b[ col ] && sortLen === 1 ) {
+ return a[ c.columns ].order - b[ c.columns ].order;
+ }
+
+ // fallback to natural sort since it is more robust
+ num = /n/i.test( ts.getSortType( c.parsers, col ) );
+ if ( num && c.strings[ col ] ) {
+ // sort strings in numerical columns
+ if ( typeof ( ts.string[ c.strings[ col ] ] ) === 'boolean' ) {
+ num = ( dir ? 1 : -1 ) * ( ts.string[ c.strings[ col ] ] ? -1 : 1 );
+ } else {
+ num = ( c.strings[ col ] ) ? ts.string[ c.strings[ col ] ] || 0 : 0;
+ }
+ // fall back to built-in numeric sort
+ // var sort = $.tablesorter['sort' + s]( a[col], b[col], dir, colMax[col], table );
+ sort = c.numberSorter ? c.numberSorter( a[ col ], b[ col ], dir, colMax[ col ], table ) :
+ ts[ 'sortNumeric' + ( dir ? 'Asc' : 'Desc' ) ]( a[ col ], b[ col ], num, colMax[ col ], col, c );
+ } else {
+ // set a & b depending on sort direction
+ x = dir ? a : b;
+ y = dir ? b : a;
+ // text sort function
+ if ( typeof textSorter === 'function' ) {
+ // custom OVERALL text sorter
+ sort = textSorter( x[ col ], y[ col ], dir, col, table );
+ } else if ( typeof sorter[ col ] === 'function' ) {
+ // custom text sorter for a SPECIFIC COLUMN
+ sort = sorter[ col ]( x[ col ], y[ col ], dir, col, table );
+ } else {
+ // fall back to natural sort
+ sort = ts[ 'sortNatural' + ( dir ? 'Asc' : 'Desc' ) ]( a[ col ], b[ col ], col, c );
+ }
+ }
+ if ( sort ) { return sort; }
+ }
+ return a[ c.columns ].order - b[ c.columns ].order;
+ });
+ }
+ if ( ts.debug(c, 'core') ) {
+ console.log( 'Applying sort ' + sortList.toString() + ts.benchmark( sortTime ) );
+ }
+ },
+
+ resortComplete : function( c, callback ) {
+ if ( c.table.isUpdating ) {
+ c.$table.triggerHandler( 'updateComplete', c.table );
+ }
+ if ( $.isFunction( callback ) ) {
+ callback( c.table );
+ }
+ },
+
+ checkResort : function( c, resort, callback ) {
+ var sortList = $.isArray( resort ) ? resort : c.sortList,
+ // if no resort parameter is passed, fallback to config.resort (true by default)
+ resrt = typeof resort === 'undefined' ? c.resort : resort;
+ // don't try to resort if the table is still processing
+ // this will catch spamming of the updateCell method
+ if ( resrt !== false && !c.serverSideSorting && !c.table.isProcessing ) {
+ if ( sortList.length ) {
+ ts.sortOn( c, sortList, function() {
+ ts.resortComplete( c, callback );
+ }, true );
+ } else {
+ ts.sortReset( c, function() {
+ ts.resortComplete( c, callback );
+ ts.applyWidget( c.table, false );
+ } );
+ }
+ } else {
+ ts.resortComplete( c, callback );
+ ts.applyWidget( c.table, false );
+ }
+ },
+
+ sortOn : function( c, list, callback, init ) {
+ var table = c.table;
+ c.$table.triggerHandler( 'sortStart', table );
+ // update header count index
+ ts.updateHeaderSortCount( c, list );
+ // set css for headers
+ ts.setHeadersCss( c );
+ // fixes #346
+ if ( c.delayInit && ts.isEmptyObject( c.cache ) ) {
+ ts.buildCache( c );
+ }
+ c.$table.triggerHandler( 'sortBegin', table );
+ // sort the table and append it to the dom
+ ts.multisort( c );
+ ts.appendCache( c, init );
+ c.$table.triggerHandler( 'sortBeforeEnd', table );
+ c.$table.triggerHandler( 'sortEnd', table );
+ ts.applyWidget( table );
+ if ( $.isFunction( callback ) ) {
+ callback( table );
+ }
+ },
+
+ sortReset : function( c, callback ) {
+ c.sortList = [];
+ ts.setHeadersCss( c );
+ ts.multisort( c );
+ ts.appendCache( c );
+ var indx;
+ for (indx = 0; indx < c.columns; indx++) {
+ c.sortVars[ indx ].count = -1;
+ }
+ if ( $.isFunction( callback ) ) {
+ callback( c.table );
+ }
+ },
+
+ getSortType : function( parsers, column ) {
+ return ( parsers && parsers[ column ] ) ? parsers[ column ].type || '' : '';
+ },
+
+ getOrder : function( val ) {
+ // look for 'd' in 'desc' order; return true
+ return ( /^d/i.test( val ) || val === 1 );
+ },
+
+ // Natural sort - https://github.com/overset/javascript-natural-sort (date sorting removed)
+ sortNatural : function( a, b ) {
+ if ( a === b ) { return 0; }
+ a = a.toString();
+ b = b.toString();
+ var aNum, bNum, aFloat, bFloat, indx, max,
+ regex = ts.regex;
+ // first try and sort Hex codes
+ if ( regex.hex.test( b ) ) {
+ aNum = parseInt( ( a || '' ).match( regex.hex ), 16 );
+ bNum = parseInt( ( b || '' ).match( regex.hex ), 16 );
+ if ( aNum < bNum ) { return -1; }
+ if ( aNum > bNum ) { return 1; }
+ }
+ // chunk/tokenize
+ aNum = ( a || '' ).replace( regex.chunk, '\\0$1\\0' ).replace( regex.chunks, '' ).split( '\\0' );
+ bNum = ( b || '' ).replace( regex.chunk, '\\0$1\\0' ).replace( regex.chunks, '' ).split( '\\0' );
+ max = Math.max( aNum.length, bNum.length );
+ // natural sorting through split numeric strings and default strings
+ for ( indx = 0; indx < max; indx++ ) {
+ // find floats not starting with '0', string or 0 if not defined
+ aFloat = isNaN( aNum[ indx ] ) ? aNum[ indx ] || 0 : parseFloat( aNum[ indx ] ) || 0;
+ bFloat = isNaN( bNum[ indx ] ) ? bNum[ indx ] || 0 : parseFloat( bNum[ indx ] ) || 0;
+ // handle numeric vs string comparison - number < string - (Kyle Adams)
+ if ( isNaN( aFloat ) !== isNaN( bFloat ) ) { return isNaN( aFloat ) ? 1 : -1; }
+ // rely on string comparison if different types - i.e. '02' < 2 != '02' < '2'
+ if ( typeof aFloat !== typeof bFloat ) {
+ aFloat += '';
+ bFloat += '';
+ }
+ if ( aFloat < bFloat ) { return -1; }
+ if ( aFloat > bFloat ) { return 1; }
+ }
+ return 0;
+ },
+
+ sortNaturalAsc : function( a, b, col, c ) {
+ if ( a === b ) { return 0; }
+ var empty = ts.string[ ( c.empties[ col ] || c.emptyTo ) ];
+ if ( a === '' && empty !== 0 ) { return typeof empty === 'boolean' ? ( empty ? -1 : 1 ) : -empty || -1; }
+ if ( b === '' && empty !== 0 ) { return typeof empty === 'boolean' ? ( empty ? 1 : -1 ) : empty || 1; }
+ return ts.sortNatural( a, b );
+ },
+
+ sortNaturalDesc : function( a, b, col, c ) {
+ if ( a === b ) { return 0; }
+ var empty = ts.string[ ( c.empties[ col ] || c.emptyTo ) ];
+ if ( a === '' && empty !== 0 ) { return typeof empty === 'boolean' ? ( empty ? -1 : 1 ) : empty || 1; }
+ if ( b === '' && empty !== 0 ) { return typeof empty === 'boolean' ? ( empty ? 1 : -1 ) : -empty || -1; }
+ return ts.sortNatural( b, a );
+ },
+
+ // basic alphabetical sort
+ sortText : function( a, b ) {
+ return a > b ? 1 : ( a < b ? -1 : 0 );
+ },
+
+ // return text string value by adding up ascii value
+ // so the text is somewhat sorted when using a digital sort
+ // this is NOT an alphanumeric sort
+ getTextValue : function( val, num, max ) {
+ if ( max ) {
+ // make sure the text value is greater than the max numerical value (max)
+ var indx,
+ len = val ? val.length : 0,
+ n = max + num;
+ for ( indx = 0; indx < len; indx++ ) {
+ n += val.charCodeAt( indx );
+ }
+ return num * n;
+ }
+ return 0;
+ },
+
+ sortNumericAsc : function( a, b, num, max, col, c ) {
+ if ( a === b ) { return 0; }
+ var empty = ts.string[ ( c.empties[ col ] || c.emptyTo ) ];
+ if ( a === '' && empty !== 0 ) { return typeof empty === 'boolean' ? ( empty ? -1 : 1 ) : -empty || -1; }
+ if ( b === '' && empty !== 0 ) { return typeof empty === 'boolean' ? ( empty ? 1 : -1 ) : empty || 1; }
+ if ( isNaN( a ) ) { a = ts.getTextValue( a, num, max ); }
+ if ( isNaN( b ) ) { b = ts.getTextValue( b, num, max ); }
+ return a - b;
+ },
+
+ sortNumericDesc : function( a, b, num, max, col, c ) {
+ if ( a === b ) { return 0; }
+ var empty = ts.string[ ( c.empties[ col ] || c.emptyTo ) ];
+ if ( a === '' && empty !== 0 ) { return typeof empty === 'boolean' ? ( empty ? -1 : 1 ) : empty || 1; }
+ if ( b === '' && empty !== 0 ) { return typeof empty === 'boolean' ? ( empty ? 1 : -1 ) : -empty || -1; }
+ if ( isNaN( a ) ) { a = ts.getTextValue( a, num, max ); }
+ if ( isNaN( b ) ) { b = ts.getTextValue( b, num, max ); }
+ return b - a;
+ },
+
+ sortNumeric : function( a, b ) {
+ return a - b;
+ },
+
+ /*
+ ██ ██ ██ ██ █████▄ ▄████▄ ██████ ██████ ▄█████
+ ██ ██ ██ ██ ██ ██ ██ ▄▄▄ ██▄▄ ██ ▀█▄
+ ██ ██ ██ ██ ██ ██ ██ ▀██ ██▀▀ ██ ▀█▄
+ ███████▀ ██ █████▀ ▀████▀ ██████ ██ █████▀
+ */
+ addWidget : function( widget ) {
+ if ( widget.id && !ts.isEmptyObject( ts.getWidgetById( widget.id ) ) ) {
+ console.warn( '"' + widget.id + '" widget was loaded more than once!' );
+ }
+ ts.widgets[ ts.widgets.length ] = widget;
+ },
+
+ hasWidget : function( $table, name ) {
+ $table = $( $table );
+ return $table.length && $table[ 0 ].config && $table[ 0 ].config.widgetInit[ name ] || false;
+ },
+
+ getWidgetById : function( name ) {
+ var indx, widget,
+ len = ts.widgets.length;
+ for ( indx = 0; indx < len; indx++ ) {
+ widget = ts.widgets[ indx ];
+ if ( widget && widget.id && widget.id.toLowerCase() === name.toLowerCase() ) {
+ return widget;
+ }
+ }
+ },
+
+ applyWidgetOptions : function( table ) {
+ var indx, widget, wo,
+ c = table.config,
+ len = c.widgets.length;
+ if ( len ) {
+ for ( indx = 0; indx < len; indx++ ) {
+ widget = ts.getWidgetById( c.widgets[ indx ] );
+ if ( widget && widget.options ) {
+ wo = $.extend( true, {}, widget.options );
+ c.widgetOptions = $.extend( true, wo, c.widgetOptions );
+ // add widgetOptions to defaults for option validator
+ $.extend( true, ts.defaults.widgetOptions, widget.options );
+ }
+ }
+ }
+ },
+
+ addWidgetFromClass : function( table ) {
+ var len, indx,
+ c = table.config,
+ // look for widgets to apply from table class
+ // don't match from 'ui-widget-content'; use \S instead of \w to include widgets
+ // with dashes in the name, e.g. "widget-test-2" extracts out "test-2"
+ regex = '^' + c.widgetClass.replace( ts.regex.templateName, '(\\S+)+' ) + '$',
+ widgetClass = new RegExp( regex, 'g' ),
+ // split up table class (widget id's can include dashes) - stop using match
+ // otherwise only one widget gets extracted, see #1109
+ widgets = ( table.className || '' ).split( ts.regex.spaces );
+ if ( widgets.length ) {
+ len = widgets.length;
+ for ( indx = 0; indx < len; indx++ ) {
+ if ( widgets[ indx ].match( widgetClass ) ) {
+ c.widgets[ c.widgets.length ] = widgets[ indx ].replace( widgetClass, '$1' );
+ }
+ }
+ }
+ },
+
+ applyWidgetId : function( table, id, init ) {
+ table = $(table)[0];
+ var applied, time, name,
+ c = table.config,
+ wo = c.widgetOptions,
+ debug = ts.debug(c, 'core'),
+ widget = ts.getWidgetById( id );
+ if ( widget ) {
+ name = widget.id;
+ applied = false;
+ // add widget name to option list so it gets reapplied after sorting, filtering, etc
+ if ( $.inArray( name, c.widgets ) < 0 ) {
+ c.widgets[ c.widgets.length ] = name;
+ }
+ if ( debug ) { time = new Date(); }
+
+ if ( init || !( c.widgetInit[ name ] ) ) {
+ // set init flag first to prevent calling init more than once (e.g. pager)
+ c.widgetInit[ name ] = true;
+ if ( table.hasInitialized ) {
+ // don't reapply widget options on tablesorter init
+ ts.applyWidgetOptions( table );
+ }
+ if ( typeof widget.init === 'function' ) {
+ applied = true;
+ if ( debug ) {
+ console[ console.group ? 'group' : 'log' ]( 'Initializing ' + name + ' widget' );
+ }
+ widget.init( table, widget, c, wo );
+ }
+ }
+ if ( !init && typeof widget.format === 'function' ) {
+ applied = true;
+ if ( debug ) {
+ console[ console.group ? 'group' : 'log' ]( 'Updating ' + name + ' widget' );
+ }
+ widget.format( table, c, wo, false );
+ }
+ if ( debug ) {
+ if ( applied ) {
+ console.log( 'Completed ' + ( init ? 'initializing ' : 'applying ' ) + name + ' widget' + ts.benchmark( time ) );
+ if ( console.groupEnd ) { console.groupEnd(); }
+ }
+ }
+ }
+ },
+
+ applyWidget : function( table, init, callback ) {
+ table = $( table )[ 0 ]; // in case this is called externally
+ var indx, len, names, widget, time,
+ c = table.config,
+ debug = ts.debug(c, 'core'),
+ widgets = [];
+ // prevent numerous consecutive widget applications
+ if ( init !== false && table.hasInitialized && ( table.isApplyingWidgets || table.isUpdating ) ) {
+ return;
+ }
+ if ( debug ) { time = new Date(); }
+ ts.addWidgetFromClass( table );
+ // prevent "tablesorter-ready" from firing multiple times in a row
+ clearTimeout( c.timerReady );
+ if ( c.widgets.length ) {
+ table.isApplyingWidgets = true;
+ // ensure unique widget ids
+ c.widgets = $.grep( c.widgets, function( val, index ) {
+ return $.inArray( val, c.widgets ) === index;
+ });
+ names = c.widgets || [];
+ len = names.length;
+ // build widget array & add priority as needed
+ for ( indx = 0; indx < len; indx++ ) {
+ widget = ts.getWidgetById( names[ indx ] );
+ if ( widget && widget.id ) {
+ // set priority to 10 if not defined
+ if ( !widget.priority ) { widget.priority = 10; }
+ widgets[ indx ] = widget;
+ } else if ( debug ) {
+ console.warn( '"' + names[ indx ] + '" was enabled, but the widget code has not been loaded!' );
+ }
+ }
+ // sort widgets by priority
+ widgets.sort( function( a, b ) {
+ return a.priority < b.priority ? -1 : a.priority === b.priority ? 0 : 1;
+ });
+ // add/update selected widgets
+ len = widgets.length;
+ if ( debug ) {
+ console[ console.group ? 'group' : 'log' ]( 'Start ' + ( init ? 'initializing' : 'applying' ) + ' widgets' );
+ }
+ for ( indx = 0; indx < len; indx++ ) {
+ widget = widgets[ indx ];
+ if ( widget && widget.id ) {
+ ts.applyWidgetId( table, widget.id, init );
+ }
+ }
+ if ( debug && console.groupEnd ) { console.groupEnd(); }
+ }
+ c.timerReady = setTimeout( function() {
+ table.isApplyingWidgets = false;
+ $.data( table, 'lastWidgetApplication', new Date() );
+ c.$table.triggerHandler( 'tablesorter-ready' );
+ // callback executed on init only
+ if ( !init && typeof callback === 'function' ) {
+ callback( table );
+ }
+ if ( debug ) {
+ widget = c.widgets.length;
+ console.log( 'Completed ' +
+ ( init === true ? 'initializing ' : 'applying ' ) + widget +
+ ' widget' + ( widget !== 1 ? 's' : '' ) + ts.benchmark( time ) );
+ }
+ }, 10 );
+ },
+
+ removeWidget : function( table, name, refreshing ) {
+ table = $( table )[ 0 ];
+ var index, widget, indx, len,
+ c = table.config;
+ // if name === true, add all widgets from $.tablesorter.widgets
+ if ( name === true ) {
+ name = [];
+ len = ts.widgets.length;
+ for ( indx = 0; indx < len; indx++ ) {
+ widget = ts.widgets[ indx ];
+ if ( widget && widget.id ) {
+ name[ name.length ] = widget.id;
+ }
+ }
+ } else {
+ // name can be either an array of widgets names,
+ // or a space/comma separated list of widget names
+ name = ( $.isArray( name ) ? name.join( ',' ) : name || '' ).toLowerCase().split( /[\s,]+/ );
+ }
+ len = name.length;
+ for ( index = 0; index < len; index++ ) {
+ widget = ts.getWidgetById( name[ index ] );
+ indx = $.inArray( name[ index ], c.widgets );
+ // don't remove the widget from config.widget if refreshing
+ if ( indx >= 0 && refreshing !== true ) {
+ c.widgets.splice( indx, 1 );
+ }
+ if ( widget && widget.remove ) {
+ if ( ts.debug(c, 'core') ) {
+ console.log( ( refreshing ? 'Refreshing' : 'Removing' ) + ' "' + name[ index ] + '" widget' );
+ }
+ widget.remove( table, c, c.widgetOptions, refreshing );
+ c.widgetInit[ name[ index ] ] = false;
+ }
+ }
+ c.$table.triggerHandler( 'widgetRemoveEnd', table );
+ },
+
+ refreshWidgets : function( table, doAll, dontapply ) {
+ table = $( table )[ 0 ]; // see issue #243
+ var indx, widget,
+ c = table.config,
+ curWidgets = c.widgets,
+ widgets = ts.widgets,
+ len = widgets.length,
+ list = [],
+ callback = function( table ) {
+ $( table ).triggerHandler( 'refreshComplete' );
+ };
+ // remove widgets not defined in config.widgets, unless doAll is true
+ for ( indx = 0; indx < len; indx++ ) {
+ widget = widgets[ indx ];
+ if ( widget && widget.id && ( doAll || $.inArray( widget.id, curWidgets ) < 0 ) ) {
+ list[ list.length ] = widget.id;
+ }
+ }
+ ts.removeWidget( table, list.join( ',' ), true );
+ if ( dontapply !== true ) {
+ // call widget init if
+ ts.applyWidget( table, doAll || false, callback );
+ if ( doAll ) {
+ // apply widget format
+ ts.applyWidget( table, false, callback );
+ }
+ } else {
+ callback( table );
+ }
+ },
+
+ /*
+ ██ ██ ██████ ██ ██ ██ ██████ ██ ██████ ▄█████
+ ██ ██ ██ ██ ██ ██ ██ ██ ██▄▄ ▀█▄
+ ██ ██ ██ ██ ██ ██ ██ ██ ██▀▀ ▀█▄
+ ▀████▀ ██ ██ ██████ ██ ██ ██ ██████ █████▀
+ */
+ benchmark : function( diff ) {
+ return ( ' (' + ( new Date().getTime() - diff.getTime() ) + ' ms)' );
+ },
+ // deprecated ts.log
+ log : function() {
+ console.log( arguments );
+ },
+ debug : function(c, name) {
+ return c && (
+ c.debug === true ||
+ typeof c.debug === 'string' && c.debug.indexOf(name) > -1
+ );
+ },
+
+ // $.isEmptyObject from jQuery v1.4
+ isEmptyObject : function( obj ) {
+ /*jshint forin: false */
+ for ( var name in obj ) {
+ return false;
+ }
+ return true;
+ },
+
+ isValueInArray : function( column, arry ) {
+ var indx,
+ len = arry && arry.length || 0;
+ for ( indx = 0; indx < len; indx++ ) {
+ if ( arry[ indx ][ 0 ] === column ) {
+ return indx;
+ }
+ }
+ return -1;
+ },
+
+ formatFloat : function( str, table ) {
+ if ( typeof str !== 'string' || str === '' ) { return str; }
+ // allow using formatFloat without a table; defaults to US number format
+ var num,
+ usFormat = table && table.config ? table.config.usNumberFormat !== false :
+ typeof table !== 'undefined' ? table : true;
+ if ( usFormat ) {
+ // US Format - 1,234,567.89 -> 1234567.89
+ str = str.replace( ts.regex.comma, '' );
+ } else {
+ // German Format = 1.234.567,89 -> 1234567.89
+ // French Format = 1 234 567,89 -> 1234567.89
+ str = str.replace( ts.regex.digitNonUS, '' ).replace( ts.regex.comma, '.' );
+ }
+ if ( ts.regex.digitNegativeTest.test( str ) ) {
+ // make (#) into a negative number -> (10) = -10
+ str = str.replace( ts.regex.digitNegativeReplace, '-$1' );
+ }
+ num = parseFloat( str );
+ // return the text instead of zero
+ return isNaN( num ) ? $.trim( str ) : num;
+ },
+
+ isDigit : function( str ) {
+ // replace all unwanted chars and match
+ return isNaN( str ) ?
+ ts.regex.digitTest.test( str.toString().replace( ts.regex.digitReplace, '' ) ) :
+ str !== '';
+ },
+
+ // computeTableHeaderCellIndexes from:
+ // http://www.javascripttoolbox.com/lib/table/examples.php
+ // http://www.javascripttoolbox.com/temp/table_cellindex.html
+ computeColumnIndex : function( $rows, c ) {
+ var i, j, k, l, cell, cells, rowIndex, rowSpan, colSpan, firstAvailCol,
+ // total columns has been calculated, use it to set the matrixrow
+ columns = c && c.columns || 0,
+ matrix = [],
+ matrixrow = new Array( columns );
+ for ( i = 0; i < $rows.length; i++ ) {
+ cells = $rows[ i ].cells;
+ for ( j = 0; j < cells.length; j++ ) {
+ cell = cells[ j ];
+ rowIndex = i;
+ rowSpan = cell.rowSpan || 1;
+ colSpan = cell.colSpan || 1;
+ if ( typeof matrix[ rowIndex ] === 'undefined' ) {
+ matrix[ rowIndex ] = [];
+ }
+ // Find first available column in the first row
+ for ( k = 0; k < matrix[ rowIndex ].length + 1; k++ ) {
+ if ( typeof matrix[ rowIndex ][ k ] === 'undefined' ) {
+ firstAvailCol = k;
+ break;
+ }
+ }
+ // jscs:disable disallowEmptyBlocks
+ if ( columns && cell.cellIndex === firstAvailCol ) {
+ // don't to anything
+ } else if ( cell.setAttribute ) {
+ // jscs:enable disallowEmptyBlocks
+ // add data-column (setAttribute = IE8+)
+ cell.setAttribute( 'data-column', firstAvailCol );
+ } else {
+ // remove once we drop support for IE7 - 1/12/2016
+ $( cell ).attr( 'data-column', firstAvailCol );
+ }
+ for ( k = rowIndex; k < rowIndex + rowSpan; k++ ) {
+ if ( typeof matrix[ k ] === 'undefined' ) {
+ matrix[ k ] = [];
+ }
+ matrixrow = matrix[ k ];
+ for ( l = firstAvailCol; l < firstAvailCol + colSpan; l++ ) {
+ matrixrow[ l ] = 'x';
+ }
+ }
+ }
+ }
+ ts.checkColumnCount($rows, matrix, matrixrow.length);
+ return matrixrow.length;
+ },
+
+ checkColumnCount : function($rows, matrix, columns) {
+ // this DOES NOT report any tbody column issues, except for the math and
+ // and column selector widgets
+ var i, len,
+ valid = true,
+ cells = [];
+ for ( i = 0; i < matrix.length; i++ ) {
+ // some matrix entries are undefined when testing the footer because
+ // it is using the rowIndex property
+ if ( matrix[i] ) {
+ len = matrix[i].length;
+ if ( matrix[i].length !== columns ) {
+ valid = false;
+ break;
+ }
+ }
+ }
+ if ( !valid ) {
+ $rows.each( function( indx, el ) {
+ var cell = el.parentElement.nodeName;
+ if ( cells.indexOf( cell ) < 0 ) {
+ cells.push( cell );
+ }
+ });
+ console.error(
+ 'Invalid or incorrect number of columns in the ' +
+ cells.join( ' or ' ) + '; expected ' + columns +
+ ', but found ' + len + ' columns'
+ );
+ }
+ },
+
+ // automatically add a colgroup with col elements set to a percentage width
+ fixColumnWidth : function( table ) {
+ table = $( table )[ 0 ];
+ var overallWidth, percent, $tbodies, len, index,
+ c = table.config,
+ $colgroup = c.$table.children( 'colgroup' );
+ // remove plugin-added colgroup, in case we need to refresh the widths
+ if ( $colgroup.length && $colgroup.hasClass( ts.css.colgroup ) ) {
+ $colgroup.remove();
+ }
+ if ( c.widthFixed && c.$table.children( 'colgroup' ).length === 0 ) {
+ $colgroup = $( '' );
+ overallWidth = c.$table.width();
+ // only add col for visible columns - fixes #371
+ $tbodies = c.$tbodies.find( 'tr:first' ).children( ':visible' );
+ len = $tbodies.length;
+ for ( index = 0; index < len; index++ ) {
+ percent = parseInt( ( $tbodies.eq( index ).width() / overallWidth ) * 1000, 10 ) / 10 + '%';
+ $colgroup.append( $( '' ).css( 'width', percent ) );
+ }
+ c.$table.prepend( $colgroup );
+ }
+ },
+
+ // get sorter, string, empty, etc options for each column from
+ // jQuery data, metadata, header option or header class name ('sorter-false')
+ // priority = jQuery data > meta > headers option > header class name
+ getData : function( header, configHeader, key ) {
+ var meta, cl4ss,
+ val = '',
+ $header = $( header );
+ if ( !$header.length ) { return ''; }
+ meta = $.metadata ? $header.metadata() : false;
+ cl4ss = ' ' + ( $header.attr( 'class' ) || '' );
+ if ( typeof $header.data( key ) !== 'undefined' ||
+ typeof $header.data( key.toLowerCase() ) !== 'undefined' ) {
+ // 'data-lockedOrder' is assigned to 'lockedorder'; but 'data-locked-order' is assigned to 'lockedOrder'
+ // 'data-sort-initial-order' is assigned to 'sortInitialOrder'
+ val += $header.data( key ) || $header.data( key.toLowerCase() );
+ } else if ( meta && typeof meta[ key ] !== 'undefined' ) {
+ val += meta[ key ];
+ } else if ( configHeader && typeof configHeader[ key ] !== 'undefined' ) {
+ val += configHeader[ key ];
+ } else if ( cl4ss !== ' ' && cl4ss.match( ' ' + key + '-' ) ) {
+ // include sorter class name 'sorter-text', etc; now works with 'sorter-my-custom-parser'
+ val = cl4ss.match( new RegExp( '\\s' + key + '-([\\w-]+)' ) )[ 1 ] || '';
+ }
+ return $.trim( val );
+ },
+
+ getColumnData : function( table, obj, indx, getCell, $headers ) {
+ if ( typeof obj !== 'object' || obj === null ) {
+ return obj;
+ }
+ table = $( table )[ 0 ];
+ var $header, key,
+ c = table.config,
+ $cells = ( $headers || c.$headers ),
+ // c.$headerIndexed is not defined initially
+ $cell = c.$headerIndexed && c.$headerIndexed[ indx ] ||
+ $cells.find( '[data-column="' + indx + '"]:last' );
+ if ( typeof obj[ indx ] !== 'undefined' ) {
+ return getCell ? obj[ indx ] : obj[ $cells.index( $cell ) ];
+ }
+ for ( key in obj ) {
+ if ( typeof key === 'string' ) {
+ $header = $cell
+ // header cell with class/id
+ .filter( key )
+ // find elements within the header cell with cell/id
+ .add( $cell.find( key ) );
+ if ( $header.length ) {
+ return obj[ key ];
+ }
+ }
+ }
+ return;
+ },
+
+ // *** Process table ***
+ // add processing indicator
+ isProcessing : function( $table, toggle, $headers ) {
+ $table = $( $table );
+ var c = $table[ 0 ].config,
+ // default to all headers
+ $header = $headers || $table.find( '.' + ts.css.header );
+ if ( toggle ) {
+ // don't use sortList if custom $headers used
+ if ( typeof $headers !== 'undefined' && c.sortList.length > 0 ) {
+ // get headers from the sortList
+ $header = $header.filter( function() {
+ // get data-column from attr to keep compatibility with jQuery 1.2.6
+ return this.sortDisabled ?
+ false :
+ ts.isValueInArray( parseFloat( $( this ).attr( 'data-column' ) ), c.sortList ) >= 0;
+ });
+ }
+ $table.add( $header ).addClass( ts.css.processing + ' ' + c.cssProcessing );
+ } else {
+ $table.add( $header ).removeClass( ts.css.processing + ' ' + c.cssProcessing );
+ }
+ },
+
+ // detach tbody but save the position
+ // don't use tbody because there are portions that look for a tbody index (updateCell)
+ processTbody : function( table, $tb, getIt ) {
+ table = $( table )[ 0 ];
+ if ( getIt ) {
+ table.isProcessing = true;
+ $tb.before( '' );
+ return $.fn.detach ? $tb.detach() : $tb.remove();
+ }
+ var holdr = $( table ).find( 'colgroup.tablesorter-savemyplace' );
+ $tb.insertAfter( holdr );
+ holdr.remove();
+ table.isProcessing = false;
+ },
+
+ clearTableBody : function( table ) {
+ $( table )[ 0 ].config.$tbodies.children().detach();
+ },
+
+ // used when replacing accented characters during sorting
+ characterEquivalents : {
+ 'a' : '\u00e1\u00e0\u00e2\u00e3\u00e4\u0105\u00e5', // áàâãäąå
+ 'A' : '\u00c1\u00c0\u00c2\u00c3\u00c4\u0104\u00c5', // ÁÀÂÃÄĄÅ
+ 'c' : '\u00e7\u0107\u010d', // çćč
+ 'C' : '\u00c7\u0106\u010c', // ÇĆČ
+ 'e' : '\u00e9\u00e8\u00ea\u00eb\u011b\u0119', // éèêëěę
+ 'E' : '\u00c9\u00c8\u00ca\u00cb\u011a\u0118', // ÉÈÊËĚĘ
+ 'i' : '\u00ed\u00ec\u0130\u00ee\u00ef\u0131', // íìİîïı
+ 'I' : '\u00cd\u00cc\u0130\u00ce\u00cf', // ÍÌİÎÏ
+ 'o' : '\u00f3\u00f2\u00f4\u00f5\u00f6\u014d', // óòôõöō
+ 'O' : '\u00d3\u00d2\u00d4\u00d5\u00d6\u014c', // ÓÒÔÕÖŌ
+ 'ss': '\u00df', // ß (s sharp)
+ 'SS': '\u1e9e', // ẞ (Capital sharp s)
+ 'u' : '\u00fa\u00f9\u00fb\u00fc\u016f', // úùûüů
+ 'U' : '\u00da\u00d9\u00db\u00dc\u016e' // ÚÙÛÜŮ
+ },
+
+ replaceAccents : function( str ) {
+ var chr,
+ acc = '[',
+ eq = ts.characterEquivalents;
+ if ( !ts.characterRegex ) {
+ ts.characterRegexArray = {};
+ for ( chr in eq ) {
+ if ( typeof chr === 'string' ) {
+ acc += eq[ chr ];
+ ts.characterRegexArray[ chr ] = new RegExp( '[' + eq[ chr ] + ']', 'g' );
+ }
+ }
+ ts.characterRegex = new RegExp( acc + ']' );
+ }
+ if ( ts.characterRegex.test( str ) ) {
+ for ( chr in eq ) {
+ if ( typeof chr === 'string' ) {
+ str = str.replace( ts.characterRegexArray[ chr ], chr );
+ }
+ }
+ }
+ return str;
+ },
+
+ validateOptions : function( c ) {
+ var setting, setting2, typ, timer,
+ // ignore options containing an array
+ ignore = 'headers sortForce sortList sortAppend widgets'.split( ' ' ),
+ orig = c.originalSettings;
+ if ( orig ) {
+ if ( ts.debug(c, 'core') ) {
+ timer = new Date();
+ }
+ for ( setting in orig ) {
+ typ = typeof ts.defaults[setting];
+ if ( typ === 'undefined' ) {
+ console.warn( 'Tablesorter Warning! "table.config.' + setting + '" option not recognized' );
+ } else if ( typ === 'object' ) {
+ for ( setting2 in orig[setting] ) {
+ typ = ts.defaults[setting] && typeof ts.defaults[setting][setting2];
+ if ( $.inArray( setting, ignore ) < 0 && typ === 'undefined' ) {
+ console.warn( 'Tablesorter Warning! "table.config.' + setting + '.' + setting2 + '" option not recognized' );
+ }
+ }
+ }
+ }
+ if ( ts.debug(c, 'core') ) {
+ console.log( 'validate options time:' + ts.benchmark( timer ) );
+ }
+ }
+ },
+
+ // restore headers
+ restoreHeaders : function( table ) {
+ var index, $cell,
+ c = $( table )[ 0 ].config,
+ $headers = c.$table.find( c.selectorHeaders ),
+ len = $headers.length;
+ // don't use c.$headers here in case header cells were swapped
+ for ( index = 0; index < len; index++ ) {
+ $cell = $headers.eq( index );
+ // only restore header cells if it is wrapped
+ // because this is also used by the updateAll method
+ if ( $cell.find( '.' + ts.css.headerIn ).length ) {
+ $cell.html( c.headerContent[ index ] );
+ }
+ }
+ },
+
+ destroy : function( table, removeClasses, callback ) {
+ table = $( table )[ 0 ];
+ if ( !table.hasInitialized ) { return; }
+ // remove all widgets
+ ts.removeWidget( table, true, false );
+ var events,
+ $t = $( table ),
+ c = table.config,
+ $h = $t.find( 'thead:first' ),
+ $r = $h.find( 'tr.' + ts.css.headerRow ).removeClass( ts.css.headerRow + ' ' + c.cssHeaderRow ),
+ $f = $t.find( 'tfoot:first > tr' ).children( 'th, td' );
+ if ( removeClasses === false && $.inArray( 'uitheme', c.widgets ) >= 0 ) {
+ // reapply uitheme classes, in case we want to maintain appearance
+ $t.triggerHandler( 'applyWidgetId', [ 'uitheme' ] );
+ $t.triggerHandler( 'applyWidgetId', [ 'zebra' ] );
+ }
+ // remove widget added rows, just in case
+ $h.find( 'tr' ).not( $r ).remove();
+ // disable tablesorter - not using .unbind( namespace ) because namespacing was
+ // added in jQuery v1.4.3 - see http://api.jquery.com/event.namespace/
+ events = 'sortReset update updateRows updateAll updateHeaders updateCell addRows updateComplete sorton ' +
+ 'appendCache updateCache applyWidgetId applyWidgets refreshWidgets removeWidget destroy mouseup mouseleave ' +
+ 'keypress sortBegin sortEnd resetToLoadState '.split( ' ' )
+ .join( c.namespace + ' ' );
+ $t
+ .removeData( 'tablesorter' )
+ .unbind( events.replace( ts.regex.spaces, ' ' ) );
+ c.$headers
+ .add( $f )
+ .removeClass( [ ts.css.header, c.cssHeader, c.cssAsc, c.cssDesc, ts.css.sortAsc, ts.css.sortDesc, ts.css.sortNone ].join( ' ' ) )
+ .removeAttr( 'data-column' )
+ .removeAttr( 'aria-label' )
+ .attr( 'aria-disabled', 'true' );
+ $r
+ .find( c.selectorSort )
+ .unbind( ( 'mousedown mouseup keypress '.split( ' ' ).join( c.namespace + ' ' ) ).replace( ts.regex.spaces, ' ' ) );
+ ts.restoreHeaders( table );
+ $t.toggleClass( ts.css.table + ' ' + c.tableClass + ' tablesorter-' + c.theme, removeClasses === false );
+ $t.removeClass(c.namespace.slice(1));
+ // clear flag in case the plugin is initialized again
+ table.hasInitialized = false;
+ delete table.config.cache;
+ if ( typeof callback === 'function' ) {
+ callback( table );
+ }
+ if ( ts.debug(c, 'core') ) {
+ console.log( 'tablesorter has been removed' );
+ }
+ }
+
+ };
+
+ $.fn.tablesorter = function( settings ) {
+ return this.each( function() {
+ var table = this,
+ // merge & extend config options
+ c = $.extend( true, {}, ts.defaults, settings, ts.instanceMethods );
+ // save initial settings
+ c.originalSettings = settings;
+ // create a table from data (build table widget)
+ if ( !table.hasInitialized && ts.buildTable && this.nodeName !== 'TABLE' ) {
+ // return the table (in case the original target is the table's container)
+ ts.buildTable( table, c );
+ } else {
+ ts.setup( table, c );
+ }
+ });
+ };
+
+ // set up debug logs
+ if ( !( window.console && window.console.log ) ) {
+ // access $.tablesorter.logs for browsers that don't have a console...
+ ts.logs = [];
+ /*jshint -W020 */
+ console = {};
+ console.log = console.warn = console.error = console.table = function() {
+ var arg = arguments.length > 1 ? arguments : arguments[0];
+ ts.logs[ ts.logs.length ] = { date: Date.now(), log: arg };
+ };
+ }
+
+ // add default parsers
+ ts.addParser({
+ id : 'no-parser',
+ is : function() {
+ return false;
+ },
+ format : function() {
+ return '';
+ },
+ type : 'text'
+ });
+
+ ts.addParser({
+ id : 'text',
+ is : function() {
+ return true;
+ },
+ format : function( str, table ) {
+ var c = table.config;
+ if ( str ) {
+ str = $.trim( c.ignoreCase ? str.toLocaleLowerCase() : str );
+ str = c.sortLocaleCompare ? ts.replaceAccents( str ) : str;
+ }
+ return str;
+ },
+ type : 'text'
+ });
+
+ ts.regex.nondigit = /[^\w,. \-()]/g;
+ ts.addParser({
+ id : 'digit',
+ is : function( str ) {
+ return ts.isDigit( str );
+ },
+ format : function( str, table ) {
+ var num = ts.formatFloat( ( str || '' ).replace( ts.regex.nondigit, '' ), table );
+ return str && typeof num === 'number' ? num :
+ str ? $.trim( str && table.config.ignoreCase ? str.toLocaleLowerCase() : str ) : str;
+ },
+ type : 'numeric'
+ });
+
+ ts.regex.currencyReplace = /[+\-,. ]/g;
+ ts.regex.currencyTest = /^\(?\d+[\u00a3$\u20ac\u00a4\u00a5\u00a2?.]|[\u00a3$\u20ac\u00a4\u00a5\u00a2?.]\d+\)?$/;
+ ts.addParser({
+ id : 'currency',
+ is : function( str ) {
+ str = ( str || '' ).replace( ts.regex.currencyReplace, '' );
+ // test for £$€¤¥¢
+ return ts.regex.currencyTest.test( str );
+ },
+ format : function( str, table ) {
+ var num = ts.formatFloat( ( str || '' ).replace( ts.regex.nondigit, '' ), table );
+ return str && typeof num === 'number' ? num :
+ str ? $.trim( str && table.config.ignoreCase ? str.toLocaleLowerCase() : str ) : str;
+ },
+ type : 'numeric'
+ });
+
+ // too many protocols to add them all https://en.wikipedia.org/wiki/URI_scheme
+ // now, this regex can be updated before initialization
+ ts.regex.urlProtocolTest = /^(https?|ftp|file):\/\//;
+ ts.regex.urlProtocolReplace = /(https?|ftp|file):\/\/(www\.)?/;
+ ts.addParser({
+ id : 'url',
+ is : function( str ) {
+ return ts.regex.urlProtocolTest.test( str );
+ },
+ format : function( str ) {
+ return str ? $.trim( str.replace( ts.regex.urlProtocolReplace, '' ) ) : str;
+ },
+ type : 'text'
+ });
+
+ ts.regex.dash = /-/g;
+ ts.regex.isoDate = /^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}/;
+ ts.addParser({
+ id : 'isoDate',
+ is : function( str ) {
+ return ts.regex.isoDate.test( str );
+ },
+ format : function( str ) {
+ var date = str ? new Date( str.replace( ts.regex.dash, '/' ) ) : str;
+ return date instanceof Date && isFinite( date ) ? date.getTime() : str;
+ },
+ type : 'numeric'
+ });
+
+ ts.regex.percent = /%/g;
+ ts.regex.percentTest = /(\d\s*?%|%\s*?\d)/;
+ ts.addParser({
+ id : 'percent',
+ is : function( str ) {
+ return ts.regex.percentTest.test( str ) && str.length < 15;
+ },
+ format : function( str, table ) {
+ return str ? ts.formatFloat( str.replace( ts.regex.percent, '' ), table ) : str;
+ },
+ type : 'numeric'
+ });
+
+ // added image parser to core v2.17.9
+ ts.addParser({
+ id : 'image',
+ is : function( str, table, node, $node ) {
+ return $node.find( 'img' ).length > 0;
+ },
+ format : function( str, table, cell ) {
+ return $( cell ).find( 'img' ).attr( table.config.imgAttr || 'alt' ) || str;
+ },
+ parsed : true, // filter widget flag
+ type : 'text'
+ });
+
+ ts.regex.dateReplace = /(\S)([AP]M)$/i; // used by usLongDate & time parser
+ ts.regex.usLongDateTest1 = /^[A-Z]{3,10}\.?\s+\d{1,2},?\s+(\d{4})(\s+\d{1,2}:\d{2}(:\d{2})?(\s+[AP]M)?)?$/i;
+ ts.regex.usLongDateTest2 = /^\d{1,2}\s+[A-Z]{3,10}\s+\d{4}/i;
+ ts.addParser({
+ id : 'usLongDate',
+ is : function( str ) {
+ // two digit years are not allowed cross-browser
+ // Jan 01, 2013 12:34:56 PM or 01 Jan 2013
+ return ts.regex.usLongDateTest1.test( str ) || ts.regex.usLongDateTest2.test( str );
+ },
+ format : function( str ) {
+ var date = str ? new Date( str.replace( ts.regex.dateReplace, '$1 $2' ) ) : str;
+ return date instanceof Date && isFinite( date ) ? date.getTime() : str;
+ },
+ type : 'numeric'
+ });
+
+ // testing for ##-##-#### or ####-##-##, so it's not perfect; time can be included
+ ts.regex.shortDateTest = /(^\d{1,2}[\/\s]\d{1,2}[\/\s]\d{4})|(^\d{4}[\/\s]\d{1,2}[\/\s]\d{1,2})/;
+ // escaped "-" because JSHint in Firefox was showing it as an error
+ ts.regex.shortDateReplace = /[\-.,]/g;
+ // XXY covers MDY & DMY formats
+ ts.regex.shortDateXXY = /(\d{1,2})[\/\s](\d{1,2})[\/\s](\d{4})/;
+ ts.regex.shortDateYMD = /(\d{4})[\/\s](\d{1,2})[\/\s](\d{1,2})/;
+ ts.convertFormat = function( dateString, format ) {
+ dateString = ( dateString || '' )
+ .replace( ts.regex.spaces, ' ' )
+ .replace( ts.regex.shortDateReplace, '/' );
+ if ( format === 'mmddyyyy' ) {
+ dateString = dateString.replace( ts.regex.shortDateXXY, '$3/$1/$2' );
+ } else if ( format === 'ddmmyyyy' ) {
+ dateString = dateString.replace( ts.regex.shortDateXXY, '$3/$2/$1' );
+ } else if ( format === 'yyyymmdd' ) {
+ dateString = dateString.replace( ts.regex.shortDateYMD, '$1/$2/$3' );
+ }
+ var date = new Date( dateString );
+ return date instanceof Date && isFinite( date ) ? date.getTime() : '';
+ };
+
+ ts.addParser({
+ id : 'shortDate', // 'mmddyyyy', 'ddmmyyyy' or 'yyyymmdd'
+ is : function( str ) {
+ str = ( str || '' ).replace( ts.regex.spaces, ' ' ).replace( ts.regex.shortDateReplace, '/' );
+ return ts.regex.shortDateTest.test( str );
+ },
+ format : function( str, table, cell, cellIndex ) {
+ if ( str ) {
+ var c = table.config,
+ $header = c.$headerIndexed[ cellIndex ],
+ format = $header.length && $header.data( 'dateFormat' ) ||
+ ts.getData( $header, ts.getColumnData( table, c.headers, cellIndex ), 'dateFormat' ) ||
+ c.dateFormat;
+ // save format because getData can be slow...
+ if ( $header.length ) {
+ $header.data( 'dateFormat', format );
+ }
+ return ts.convertFormat( str, format ) || str;
+ }
+ return str;
+ },
+ type : 'numeric'
+ });
+
+ // match 24 hour time & 12 hours time + am/pm - see http://regexr.com/3c3tk
+ ts.regex.timeTest = /^(0?[1-9]|1[0-2]):([0-5]\d)(\s[AP]M)$|^((?:[01]\d|[2][0-4]):[0-5]\d)$/i;
+ ts.regex.timeMatch = /(0?[1-9]|1[0-2]):([0-5]\d)(\s[AP]M)|((?:[01]\d|[2][0-4]):[0-5]\d)/i;
+ ts.addParser({
+ id : 'time',
+ is : function( str ) {
+ return ts.regex.timeTest.test( str );
+ },
+ format : function( str ) {
+ // isolate time... ignore month, day and year
+ var temp,
+ timePart = ( str || '' ).match( ts.regex.timeMatch ),
+ orig = new Date( str ),
+ // no time component? default to 00:00 by leaving it out, but only if str is defined
+ time = str && ( timePart !== null ? timePart[ 0 ] : '00:00 AM' ),
+ date = time ? new Date( '2000/01/01 ' + time.replace( ts.regex.dateReplace, '$1 $2' ) ) : time;
+ if ( date instanceof Date && isFinite( date ) ) {
+ temp = orig instanceof Date && isFinite( orig ) ? orig.getTime() : 0;
+ // if original string was a valid date, add it to the decimal so the column sorts in some kind of order
+ // luckily new Date() ignores the decimals
+ return temp ? parseFloat( date.getTime() + '.' + orig.getTime() ) : date.getTime();
+ }
+ return str;
+ },
+ type : 'numeric'
+ });
+
+ ts.addParser({
+ id : 'metadata',
+ is : function() {
+ return false;
+ },
+ format : function( str, table, cell ) {
+ var c = table.config,
+ p = ( !c.parserMetadataName ) ? 'sortValue' : c.parserMetadataName;
+ return $( cell ).metadata()[ p ];
+ },
+ type : 'numeric'
+ });
+
+ /*
+ ██████ ██████ █████▄ █████▄ ▄████▄
+ ▄█▀ ██▄▄ ██▄▄██ ██▄▄██ ██▄▄██
+ ▄█▀ ██▀▀ ██▀▀██ ██▀▀█ ██▀▀██
+ ██████ ██████ █████▀ ██ ██ ██ ██
+ */
+ // add default widgets
+ ts.addWidget({
+ id : 'zebra',
+ priority : 90,
+ format : function( table, c, wo ) {
+ var $visibleRows, $row, count, isEven, tbodyIndex, rowIndex, len,
+ child = new RegExp( c.cssChildRow, 'i' ),
+ $tbodies = c.$tbodies.add( $( c.namespace + '_extra_table' ).children( 'tbody:not(.' + c.cssInfoBlock + ')' ) );
+ for ( tbodyIndex = 0; tbodyIndex < $tbodies.length; tbodyIndex++ ) {
+ // loop through the visible rows
+ count = 0;
+ $visibleRows = $tbodies.eq( tbodyIndex ).children( 'tr:visible' ).not( c.selectorRemove );
+ len = $visibleRows.length;
+ for ( rowIndex = 0; rowIndex < len; rowIndex++ ) {
+ $row = $visibleRows.eq( rowIndex );
+ // style child rows the same way the parent row was styled
+ if ( !child.test( $row[ 0 ].className ) ) { count++; }
+ isEven = ( count % 2 === 0 );
+ $row
+ .removeClass( wo.zebra[ isEven ? 1 : 0 ] )
+ .addClass( wo.zebra[ isEven ? 0 : 1 ] );
+ }
+ }
+ },
+ remove : function( table, c, wo, refreshing ) {
+ if ( refreshing ) { return; }
+ var tbodyIndex, $tbody,
+ $tbodies = c.$tbodies,
+ toRemove = ( wo.zebra || [ 'even', 'odd' ] ).join( ' ' );
+ for ( tbodyIndex = 0; tbodyIndex < $tbodies.length; tbodyIndex++ ) {
+ $tbody = ts.processTbody( table, $tbodies.eq( tbodyIndex ), true ); // remove tbody
+ $tbody.children().removeClass( toRemove );
+ ts.processTbody( table, $tbody, false ); // restore tbody
+ }
+ }
+ });
+
+})( jQuery );
+
+return jQuery.tablesorter;
+}));
+
+
+/***/ }),
+
+/***/ "./src/editwp.backup.js":
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (immutable) */ __webpack_exports__["a"] = swal_backup;
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__run_db_export_js__ = __webpack_require__("./src/run.db.export.js");
+
+
+function swal_backup(wpPath, DBname){
+ swal({
+ title:"backup WP",
+ text: "WP backup will be both in \n OZwpDev's basedir /tmp folder and \n WP's upload/ozwpdev folder...",
+ icon: "warning",
+ closeOnClickOutside: false,
+ dangerMode: true,
+ buttons: {
+ cancel: true,
+ confirm: {
+ text: "OK, backup now",
+ value: true,
+ visible: true,
+ className: "bg-danger",
+ closeModal: false
+ }
+ },
+ }).then( (value) => {
+ if(value){
+ return Object(__WEBPACK_IMPORTED_MODULE_0__run_db_export_js__["a" /* runDBexport */])(wpPath, DBname, "tmp");
+ }
+ }).then( (value) => {
+ if(value){
+ return Object(__WEBPACK_IMPORTED_MODULE_0__run_db_export_js__["a" /* runDBexport */])(wpPath, DBname, "wp");
+ } else {
+ swal("WP Backup", "something went wrong!","error");
+ }
+ }).then( (value) => {
+ if(value){
+ swal("WP Backup", "Successful!","success");
+ } else {
+ swal("WP Backup", "process canceled","warning");
+ }
+ });
+
+}//end function
+
+/***/ }),
+
+/***/ "./src/editwp.delete.js":
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (immutable) */ __webpack_exports__["a"] = swal_delete;
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__run_bash_js__ = __webpack_require__("./src/run.bash.js");
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__run_db_delete_js__ = __webpack_require__("./src/run.db.delete.js");
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__run_db_export_js__ = __webpack_require__("./src/run.db.export.js");
+
+
+
+
+function swal_delete(wpName, wpPath, DBname){
+
+ swal({
+ title:"DELETE WP",
+ content:{
+ element:"span",
+ attributes:{
+ className:"alert alert-danger",
+ innerHTML:"Do you want to delete "+wpName+" folder and drop "+DBname+"?",
+ }
+ },
+ dangerMode:true,
+ icon: "warning",
+ closeOnClickOutside: false,
+ buttons: {
+ cancel: true,
+ confirm: {
+ text: "OK, delete everything",
+ value: true,
+ visible: true,
+ className: "bg-danger",
+ closeModal: false
+ }
+ },
+ }).then((value)=>{
+ if(value){
+ return Object(__WEBPACK_IMPORTED_MODULE_2__run_db_export_js__["a" /* runDBexport */])(wpPath, DBname, "tmp");
+ }
+ }).then((value)=>{
+ if(value){
+ return Object(__WEBPACK_IMPORTED_MODULE_1__run_db_delete_js__["a" /* runDBdelete */])(DBname);
+ } else {
+ swal("oops","DB Export \n something went wrong","error");
+ }
+ }).then((value)=>{
+ if(value){
+ return Object(__WEBPACK_IMPORTED_MODULE_0__run_bash_js__["a" /* runBash */])("rm -rf "+wpPath);
+ } else {
+ swal("oops","DB delete \n something went wrong","error");
+ }
+ }).then((value)=>{
+ if(value){
+ swal("DELETED","WP: "+wpName,"success").then((value)=>{
+ window.location="./editwp.php";
+ });
+ } else{
+ swal("oops","process canceled","warning");
+ }
+ });
+
+
+}//end of function
+
+/***/ }),
+
+/***/ "./src/editwp.js":
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* WEBPACK VAR INJECTION */(function($) {/* harmony export (immutable) */ __webpack_exports__["LoadEditTab"] = LoadEditTab;
+/* harmony export (immutable) */ __webpack_exports__["loadMe"] = loadMe;
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__run_wp_lock_js__ = __webpack_require__("./src/run.wp.lock.js");
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__run_finder_js__ = __webpack_require__("./src/run.finder.js");
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__run_wp_config_get_js__ = __webpack_require__("./src/run.wp.config.get.js");
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__run_bash_js__ = __webpack_require__("./src/run.bash.js");
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__editwp_backup_js__ = __webpack_require__("./src/editwp.backup.js");
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__editwp_delete_js__ = __webpack_require__("./src/editwp.delete.js");
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__editwp_tab_config_js__ = __webpack_require__("./src/editwp.tab.config.js");
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__editwp_tab_options_js__ = __webpack_require__("./src/editwp.tab.options.js");
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__editwp_tab_plugins_js__ = __webpack_require__("./src/editwp.tab.plugins.js");
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__editwp_tab_themes_js__ = __webpack_require__("./src/editwp.tab.themes.js");
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__editwp_tab_users_js__ = __webpack_require__("./src/editwp.tab.users.js");
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11_tablesorter_dist_js_jquery_tablesorter_js__ = __webpack_require__("./node_modules/tablesorter/dist/js/jquery.tablesorter.js");
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11_tablesorter_dist_js_jquery_tablesorter_js___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_11_tablesorter_dist_js_jquery_tablesorter_js__);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_12_tablesorter_dist_css_theme_bootstrap_4_min_css__ = __webpack_require__("./node_modules/tablesorter/dist/css/theme.bootstrap_4.min.css");
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_12_tablesorter_dist_css_theme_bootstrap_4_min_css___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_12_tablesorter_dist_css_theme_bootstrap_4_min_css__);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+$(document).ready(function(){
+
+
+ /*********************** select_wp on change ***********************/
+ $("#select_wp").on("change", function(e){
+ window.location= "./editwp.php?wp=" + $(e.target).val();
+ });
+
+ /*********************** wpLock status ***********************/
+ $(function(){
+
+ if($("#select_wp").val()!=="0"){
+ if(Object(__WEBPACK_IMPORTED_MODULE_0__run_wp_lock_js__["a" /* runWPlock */])($("#select_wp").val(), "status")){
+ $("#btn_del_wp").prop("disabled", true)
+ .attr("title", "you cannot delete this wp \n ozwpdev.txt must exists in the wp folder...")
+
+
+ }
+
+ $(".update-tabs tr:eq(1) td:eq(1)").text($("#select_wp").val());
+
+ }
+ });
+
+ /*********************** open WP in finder + open PhpMyAdmin + open WP-ADMIN***********************/
+ $(".update-tabs tr").on("click", function(e){
+ var tr=$(e.target).closest("tr");
+ var txt=$(tr).find("td:eq(1)").text();
+ var wpPath=$(tr).parent().find("td:eq(1)").text();
+ if($(tr).find("td:eq(0) i").hasClass("fa-file")){
+ Object(__WEBPACK_IMPORTED_MODULE_1__run_finder_js__["a" /* runFinder */])(txt);
+ } else if($(tr).find("td:eq(0) i").hasClass("fa-database")) {
+ window.open("http://localhost/phpmyadmin/db_structure.php?db="+txt);
+ } else if($(tr).find("td:eq(0) i").hasClass("fa-user-secret")){
+ Object(__WEBPACK_IMPORTED_MODULE_3__run_bash_js__["a" /* runBash */])("wp admin --path=" + wpPath);
+
+ }
+
+ });
+
+ /*********************** runDBexport - Export DB ***********************/
+ $("#btn_backup_wp").on("click", function(e){
+ var DBname=$(".update-tabs tr:eq(1) td:eq(1)").text();
+ var wpPath=$(".update-tabs tr:eq(0) td:eq(1)").text();
+ Object(__WEBPACK_IMPORTED_MODULE_4__editwp_backup_js__["a" /* swal_backup */])(wpPath, DBname);
+ });
+
+ /*********************** runDELwp - Delete WP ***********************/
+ $("#btn_del_wp").on("click", function(e){
+ var wpPath=$(e.target).attr("data-path");
+ var wpName=$(e.target).attr("data-wp");
+ var DBname=$(".update-tabs tr:eq(1) td:eq(1)").text();
+ Object(__WEBPACK_IMPORTED_MODULE_5__editwp_delete_js__["a" /* swal_delete */])(wpName, wpPath, DBname);
+ });
+
+
+ /*********************** tabs-edit on tab shown ***********************/
+ $(document).find('#tabs-edit a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
+
+ $("#tabs-edit").find("i").removeClass("fa-spin");
+ if($(e.target).attr("href")!=="#home"){
+ $(e.target).find("i").toggleClass('fa-spin');
+
+ var theTab=$(e.target).attr("href").replace("#","");
+ var wpPath=$(".update-tabs tr:eq(0) td:eq(1)").text();
+ $.busyLoadFull("show",{text:"tab loading..."});
+ LoadEditTab(theTab, wpPath).then(()=>{
+ $.busyLoadFull("hide");
+ });
+
+
+
+ }
+
+
+
+ });//tabs-edit on tab shown
+
+
+
+});//end of Document Ready Function
+
+function LoadEditTab(theTab, wpPath){
+
+ var dfd = new $.Deferred();
+
+ $(document).find("#tab-"+theTab).load("editwp.tab."+theTab+".php",{wpPath:wpPath},function(){
+ $('[data-toggle="tooltip"]').tooltip();
+ $(document).find("#tabs-edit i").removeClass("fa-spin");
+ dfd.resolve("done");
+
+ });
+ return dfd.promise();
+}
+
+/*********************** Loads or Reloads the tab contents with a given inner-tab ***********************/
+function loadMe(theTab, what="home"){
+ $('#tabs-edit a[data-toggle="tab"][href="#'+theTab+'"]').tab("show");
+ $.busyLoadFull("show",{text:"tab loading..."});
+ LoadEditTab(theTab,$("table.update-tabs tbody tr:eq(0) td:eq(1)").text().trim()).done(function(){
+
+ $("#tabs-"+theTab+" a[href='#"+theTab+"-"+what+"']").tab("show");
+
+ }).then(()=>{
+ $.busyLoadFull("hide");
+ });
+
+ /*********************** reload tab on dblclick ***********************/
+ $(document).on("dblclick",".card a.nav-link.active",function(e){
+
+ var tabs=$(e.target).attr("href").match(/\w+/ig);
+
+ if(tabs.length>1){
+ loadMe(tabs[0],tabs[1]);
+ swal("reloaded",tabs[0]+"-"+tabs[1],{buttons:false,timer:1000});
+ } else {
+ var tabs=$(e.target).closest(".card").find(".card a.nav-link.active").attr("href").match(/\w+/ig);
+ loadMe(tabs[0],tabs[1]);
+ swal("reloaded",tabs[0]+"-"+tabs[1],{buttons:false,timer:1000});
+ }
+
+ });
+ }
+
+
+
+
+
+/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__("./node_modules/jquery/dist/jquery.js-exposed")))
+
+/***/ }),
+
+/***/ "./src/editwp.tab.config.js":
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__run_bash_js__ = __webpack_require__("./src/run.bash.js");
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__editwp_js__ = __webpack_require__("./src/editwp.js");
+
+
+ /*********************** reload tab contents and inner-tabs ***********************/
+
+ //loadMe("config","lang");
+
+
+$(document).on("shown.bs.tab","#tabs-config",function(e){
+
+ var theTabb=$(e.target).attr("href").match(/\w+/ig)[1];
+
+ if(theTabb=="debug"){
+ //$(e.target).parent().find("i").toggleClass('fa-spin');
+ runDebugValues(e, "get");
+ //$(e.target).parent().find("i").toggleClass('fa-spin');
+ }
+
+});
+
+
+
+/*********************** WP_LANG ***********************/
+$(document).on("change", "#lang-select", function(e){
+
+ var cmd = "wp config set WP_LANG " + $(e.target).val()
+ + " --type=constant "
+ + " --path=" + $(".update-tabs tr:eq(0) td:eq(1)").text();
+ Object(__WEBPACK_IMPORTED_MODULE_0__run_bash_js__["a" /* runBash */])(cmd);
+ swal("config", "WP_LANG = "+ $(e.target).val(), "success");
+});
+
+/*********************** DEBUG GET VALUES ***********************/
+$(document).on("click","#btn-get-debug-values", function(e){
+ runDebugValues(e, "get");
+});
+
+/*********************** DEBUG SET DEFAULT VALUES ***********************/
+$(document).on("click","#btn-set-debug", function(e){
+ runDebugValues(e, "set");
+});
+
+/*********************** DEBUG UNSET DEFAULT VALUES ***********************/
+$(document).on("click","#btn-unset-debug", function(e){
+ runDebugValues(e, "unset");
+});
+
+/*********************** DEBUG DELETE VALUES ***********************/
+$(document).on("click","#btn-del-debug", function(e){
+ runDebugValues(e, "del");
+});
+
+/*********************** DEBUG DELETE single VALUES ***********************/
+$(document).on("click","button[name=btn-del-debug-single]", function(e){
+ var debug=$(e.target).closest("tr").find("td:eq(0)").text();
+ var wpPath=$(e.target).closest("tr").find("td:eq(4) button").attr("data-path");
+ Object(__WEBPACK_IMPORTED_MODULE_0__run_bash_js__["a" /* runBash */])("wp config delete " + debug + " --path=" + wpPath + " --type=constant");
+ runDebugValues(e, "get");
+});
+
+/*********************** Change Debug Value - INPUT ***********************/
+$(document).on("change","input[data-config='debug']", function(e){
+ var valyu=$(e.target).val();
+ var debug=$(e.target).attr("name");
+ var wpPath=$(".update-tabs tr:eq(0) td:eq(1)").text();
+ Object(__WEBPACK_IMPORTED_MODULE_0__run_bash_js__["a" /* runBash */])("wp config set " + debug + " " + valyu + " --type=constant --raw --path=" + wpPath );
+ runDebugValues(e, "get");
+});
+
+
+
+/*********************** function: runDebugValues ***********************/
+function runDebugValues(e, run){
+ $.ajax({
+ url:"editwp.tab.config.debug.php",
+ dataType:"json",
+ method:"post",
+ async: true,
+ data:{
+ do:"run",
+ wp:"debug",
+ run:run,
+ wpPath:$(".update-tabs tr:eq(0) td:eq(1)").text()
+ },
+ beforeSend: function(){
+ $(e.target).parent().find("i").addClass('fa-spin');
+ $(e.target).prop("disabled", true);
+ },
+ success:function(data){
+ $(e.target).parent().find("i").removeClass('fa-spin');
+ $(e.target).prop("disabled", false);
+ if(run=="get"){
+ $("#table-debug").removeClass("invisible");
+ $("#btn-get-debug-values").addClass("invisible");
+ $("#row-set-debug").removeClass("invisible");
+ }
+
+ $.each(data, function(i,v){
+
+ var TR=$("#table-debug tr td").filter(function(){
+ return $(this).text()===i;
+ }).parent()
+
+ switch(v){
+ case "TRUE":
+ TR.find("td:eq(1)").css("color","green");
+ TR.find("td:eq(2) input").prop("checked", "checked");
+ break;
+
+ case "FALSE":
+ TR.find("td:eq(1)").css("color","red");
+ TR.find("td:eq(3) input").prop("checked", "checked");
+ break;
+
+ default:
+ TR.find("td:eq(1)").css("color","darkorange");
+ TR.find("td:eq(2) input").prop("checked", false);
+ TR.find("td:eq(3) input").prop("checked", false);
+ break;
+
+ }
+
+ switch (run){
+ case "set":
+ swal("Debug Set", "all debug default values are set", "success");
+ break;
+ case "unset":
+ swal("Debug UnSet", "all debug default values are unset", "success");
+ break;
+ case "del":
+ swal("Debug Delete", "all debug values are deleted from config.php", "success");
+ }
+
+
+ });
+
+ },
+ error:function(jqXHR,textStatus,errorThrown){
+ swal("oops!", errorThrown, "error");
+ }
+ });
+}//end getDebugValues
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__("./node_modules/jquery/dist/jquery.js-exposed")))
+
+/***/ }),
+
+/***/ "./src/editwp.tab.options.js":
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__run_bash_js__ = __webpack_require__("./src/run.bash.js");
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__editwp_js__ = __webpack_require__("./src/editwp.js");
+
+
+/*********************** reload tab contents and inner-tabs ***********************/
+
+ //loadMe("options","list");
+
+/*********************** search / filter option name ***********************/
+$(document).on("keyup", "#filter-option-table", function(e){
+ var ne=$(e.target);
+ var VaL=ne.val();
+
+ switch(e.which){
+ case 13:
+ $(e.target).blur();
+ break;
+
+ case 27:
+ $(e.target).blur().val("");
+ $("#table-options-all tbody tr").show();
+ break;
+
+ default:
+ if(VaL.length>2){
+ $("#table-options-all tbody tr").hide();
+ $("#table-options-all tbody tr:contains('"+VaL+"')").show();
+ }
+ break;
+ }
+
+});
+
+/*********************** on dbl click option ***********************/
+$(document).on("dblclick","#table-options-all tr", function(e){
+
+ var TR = $(e.target).closest('tr');
+ var option_name=TR.find("td:eq(0)").text();
+ var option_value=TR.find("td:eq(1)").text();
+ swal(
+ option_name,
+ option_value
+ )
+
+});
+
+/*********************** update options ***********************/
+$(document).on("click","table[id^='table-options-'] button", function(e){
+ var option=$(e.target).closest("tr").find("td:eq(0)").text().trim();
+ var VaL=$(e.target).closest("tr").find("input").val();
+ var cmd="wp option update " + option + " '" + VaL + "' --path=" + $(".update-tabs tr:eq(0) td:eq(1)").text();
+ $(e.target).toggleClass('fa-spin fa-2x');
+ var status=Object(__WEBPACK_IMPORTED_MODULE_0__run_bash_js__["a" /* runBash */])(cmd);
+ $(e.target).toggleClass('fa-spin fa-2x');
+ if(status){
+ swal({
+ title:"updated",
+ timer:2000,
+ icon:"success",
+ text: option + ": \n" + VaL,
+ buttons:false
+ });
+ }
+
+});
+
+/*********************** dblclik default value of options ***********************/
+$(document).on("dblclick","table[id^='table-options-'] tbody a", function(e){
+ var option=$(e.target).closest("tr").find("td:eq(0)").text().trim();
+ var defVal=$(e.target).attr("data-default");
+ var inp=$(e.target).closest("tr").find("input");
+ inp.val(defVal);
+ inp.focus();
+
+});
+
+/*********************** goto settings page ***********************/
+$(document).on("click", "#btn-goto-settings", function(e){
+
+window.location=$(e.target).attr("data-location");
+
+});
+
+/*********************** update all option with default values ***********************/
+$(document).on("click", "#btn-update-all-default-options", function(e){
+ var TR=$(document).find("#table-update-all-default-options tbody tr");
+ $(e.target).toggleClass("fa-spin");
+ $.each(TR, function(i,v){
+ var cmd="wp option update ";
+ cmd+=$(v).find("td").eq(0).text().trim();
+ cmd+=" '";
+ cmd+=$(v).find("td").eq(1).text().trim();
+ cmd+="' ";
+ cmd+="--path=" + $(".update-tabs tr:eq(0) td:eq(1)").text();
+
+ var status=Object(__WEBPACK_IMPORTED_MODULE_0__run_bash_js__["a" /* runBash */])(cmd);
+ if(status){
+ $(v).find("td").eq(2).removeClass('fa-minus').addClass('fa-check').css("color", "green");
+ } else {
+ $(v).find("td").eq(2).removeClass('fa-minus').addClass('fa-times').css("color", "red");
+ }
+
+ });
+ $(e.target).toggleClass("fa-spin");
+
+});
+
+
+
+
+
+
+
+
+
+
+
+/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__("./node_modules/jquery/dist/jquery.js-exposed")))
+
+/***/ }),
+
+/***/ "./src/editwp.tab.plugins.js":
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__run_bash_js__ = __webpack_require__("./src/run.bash.js");
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__editwp_js__ = __webpack_require__("./src/editwp.js");
+
+
+
+
+
+ /*********************** reload tab contents and inner-tabs ***********************/
+
+ //loadMe("plugins","list");
+
+
+var theTabb;
+$(document).on('shown.bs.tab', '#tabs-plugins a[data-toggle="tab"]', function (e) {
+
+ theTabb= $(e.target).attr("href").match(/\w+/ig)[1].trim();
+
+});
+
+/*********************** HOME - default plugins list dblclikk to read better ***********************/
+$(document).on("dblclick","#plugins-home table tbody tr",function(e){
+
+ var plugin=$(e.target).closest("tr").find("td:eq(0)").text();
+ var group=$(e.target).closest("tr").find("td:eq(1)").text();
+ var def=$(e.target).closest("tr").find("td:eq(2)").text();
+ var desc=$(e.target).closest("tr").find("td:eq(3)").text();
+ var comment=$(e.target).closest("tr").find("td:eq(4)").text();
+ var msg = "default (URL): " + def + "
" +
+ "group: " + group + "
" +
+ "desc: " + desc + "
" +
+ "comment: " + comment
+
+ swal({
+ title:plugin,
+ content:{
+ element:"div",
+ attributes:{
+ className:"alert alert-warning text-left",
+ innerHTML:msg
+ }
+ },
+ className:"alert-info"
+ });
+
+
+
+});
+
+
+/*********************** plugin info ***********************/
+$(document).on("dblclick","[id^=table-plugins-] tbody tr td:nth-child(2)",function(e){
+ var plugin=$(e.target).text().trim();
+ var wpPath=$("table.update-tabs tbody tr:eq(0) td:eq(1)").text();
+ Object(__WEBPACK_IMPORTED_MODULE_0__run_bash_js__["a" /* runBash */])("wp plugin get " + plugin + " --format=json --path="+wpPath).done(function(status,output){
+
+ if(status===0){
+ output=$.parseJSON(output);
+ var info="";
+ $.each(output, function(i,v){
+ info+="" + i + ": " + v + "
";
+ })
+ swal({
+ title:plugin,
+ content:
+ {
+ element:"div",
+ attributes:{
+ className:"alert alert-info text-left",
+ innerHTML:info
+
+ }
+ },
+
+ });
+ } else {
+ swal(plugin,"info is available only after install","info");
+ }
+ });
+});
+
+/*********************** single plugin update ***********************/
+$(document).on("click", "button[name='btn-plugins-update']", function(e){
+ var plugin=$(e.target).attr("data-plugin");
+ var wpPath=$(e.target).attr("data-path");
+ var thisTD=$(e.target).closest("td");
+ Object(__WEBPACK_IMPORTED_MODULE_0__run_bash_js__["a" /* runBash */])("wp plugin update "+plugin+" --path="+wpPath).done(function(status,output){
+ if(status===0){
+ swal(plugin,output,"success", {timer:2000, buttons:false}).then(()=>{
+ Object(__WEBPACK_IMPORTED_MODULE_1__editwp_js__["loadMe"])("plugins",theTabb);
+ });
+ } else {
+ swal("ooops",output,"error");
+ }
+
+ });
+});
+
+/*********************** single plugin delete ***********************/
+$(document).on("click","button[name='btn-plugins-delete']", function(e){
+ var plugin=$(e.target).attr("data-plugin");
+ var wpPath=$(e.target).attr("data-path");
+
+ swal({
+ title:plugin,
+ icon:"warning",
+ text: "delete this plugin?",
+ dangerMode:true,
+ buttons:{
+ cancel:true,
+ confirm:{
+ text:"delete Plugin"
+ }
+ }
+
+ }).then((value)=>{
+ if(value){
+ Object(__WEBPACK_IMPORTED_MODULE_0__run_bash_js__["a" /* runBash */])("wp plugin delete "+plugin+" --path="+wpPath).done(function(status, output){
+ if(status===0){
+ swal(plugin,output,"success", {timer:2000, buttons:false}).then(()=>{
+ Object(__WEBPACK_IMPORTED_MODULE_1__editwp_js__["loadMe"])("plugins",theTabb);
+ });
+ } else {
+ swal("ooops",output,"error");
+ }
+
+ });
+ }
+ });
+
+});
+
+/*********************** single plugin Install ***********************/
+$(document).on("click","button[name='btn-plugins-install']", function(e){
+ var plugin=$(e.target).attr("data-plugin");
+ var wpPath=$(e.target).attr("data-path");
+
+ Object(__WEBPACK_IMPORTED_MODULE_0__run_bash_js__["a" /* runBash */])("wp plugin install "+plugin+" --path="+wpPath).done(function(status,output){
+ if(status===0){
+ swal("installed!",plugin + " is installed!","success",{buttons:false,timer:2000}).then(()=>{
+ Object(__WEBPACK_IMPORTED_MODULE_1__editwp_js__["loadMe"])("plugins",theTabb);
+ });
+ } else {
+ swal("ooops","something went wrong","error",{buttons:false,timer:2000});
+ }
+ });
+
+
+});
+
+
+/*********************** any checkbox checked ***********************/
+$(document).on("change","input[name='check-plugins']",function(e){
+
+ if($("#table-plugins-"+theTabb+" tbody input:checked").length>0){
+ $("#table-plugins-"+theTabb+" tfoot").removeClass('d-none');
+ } else {
+ $("#table-plugins-"+theTabb+" tfoot").addClass('d-none');
+ }
+
+});
+
+/*********************** check-pugins-all ***********************/
+$(document).on("change","input[name^=check-plugins-all-]", function(e){
+ var status = $(e.target).prop("checked");
+ $("#table-plugins-"+theTabb+" tbody input[type='checkbox']").prop("checked", status).trigger("change");
+});
+
+
+/*********************** select-plugins-[theTabb]***********************/
+$(document).on("click","[id^=btn-select-plugins-]", function(e){
+ var VaL=$("#select-plugins-"+theTabb).val();
+ var wpPath=$(e.target).attr("data-path");
+ var ps="";
+ $("#table-plugins-"+theTabb+" tbody input:checked").each(function(i,v){
+
+ ps+=$(v).closest("tr").find("td:eq(1)").text().trim() + " ";
+
+ });
+ ps.trim();
+
+ switch(parseInt(VaL)){
+ case 1:
+ Object(__WEBPACK_IMPORTED_MODULE_0__run_bash_js__["a" /* runBash */])("wp plugin activate "+ps+" --path="+wpPath).done(function(status,output){
+ if(status===0){
+ swal("all activated",output,"success",{buttons:false,timer:2000}).then(()=>{
+ Object(__WEBPACK_IMPORTED_MODULE_1__editwp_js__["loadMe"])("plugins",theTabb);
+ });
+ } else {swal("oops",output,"error");}
+ });
+ break;
+ case 2:
+ Object(__WEBPACK_IMPORTED_MODULE_0__run_bash_js__["a" /* runBash */])("wp plugin deactivate "+ps+" --path="+wpPath).done(function(status,output){
+ if(status===0){
+ swal("all deactivated",output,"success",{buttons:false,timer:2000}).then(()=>{
+ Object(__WEBPACK_IMPORTED_MODULE_1__editwp_js__["loadMe"])("plugins",theTabb);
+ });
+ } else {swal("oops",output,"error");}
+ });
+ break;
+ case 3:
+ Object(__WEBPACK_IMPORTED_MODULE_0__run_bash_js__["a" /* runBash */])("wp plugin install "+ps+" --path="+wpPath).done(function(status,output){
+ if(status===0){
+ swal("all installed",output,"success",{buttons:false,timer:2000}).then(()=>{
+ Object(__WEBPACK_IMPORTED_MODULE_1__editwp_js__["loadMe"])("plugins",theTabb);
+ });
+ } else {swal("oops",output,"error");}
+ });
+ break;
+ case 4:
+ Object(__WEBPACK_IMPORTED_MODULE_0__run_bash_js__["a" /* runBash */])("wp plugin update "+ps+" --path="+wpPath).done(function(status,output){
+ if(status===0){
+ swal("all updated",output,"success",{buttons:false,timer:2000}).then(()=>{
+ Object(__WEBPACK_IMPORTED_MODULE_1__editwp_js__["loadMe"])("plugins",theTabb);
+ });
+ } else {swal("oops",output,"error").then(()=>{
+ Object(__WEBPACK_IMPORTED_MODULE_1__editwp_js__["loadMe"])("plugins",theTabb);
+ });}
+ });
+ break;
+ case 5:
+ Object(__WEBPACK_IMPORTED_MODULE_0__run_bash_js__["a" /* runBash */])("wp plugin delete "+ps+" --path="+wpPath).done(function(status,output){
+ if(status===0){
+ swal("all deleted",output,"success",{buttons:false,timer:2000}).then(()=>{
+ Object(__WEBPACK_IMPORTED_MODULE_1__editwp_js__["loadMe"])("plugins",theTabb);
+ });
+ } else {swal("oops",output,"error");}
+ });
+ break;
+
+ }
+});
+
+/*********************** filter plugins ***********************/
+$(document).on("keyup", "input[name='filter-plugins']", function(e){
+ var ne=$(e.target);
+ var VaL=$(e.target).val();
+ $(e.target).attr("AUTOCOMPLETE","OFF");
+
+ switch(e.which){
+ case 13:
+ $(e.target).blur();
+ break;
+
+ case 27:
+ $("#table-plugins-"+theTabb+" thead th input[name='filter-plugins']").blur().val("");
+ $("#table-plugins-"+theTabb+" tbody tr").show();
+ break;
+
+ default:
+ $("#table-plugins-"+theTabb+" tbody tr").hide();
+ $("#table-plugins-"+theTabb+" tbody tr td:nth-child(2):contains('"+VaL+"')").closest("tr").show();
+
+ break;
+ }
+
+});
+
+
+/*********************** toggle active/inactive status - dblclick td ***********************/
+$(document).on("dblclick","[id^=table-plugins-] tbody tr td:nth-child(3)", function(e){
+ var status=$(e.target).text().trim();
+ var plugin=$(e.target).closest("tr").find("td:eq(1)").text().trim();
+ var wpPath=$("table.update-tabs tbody tr:eq(0) td:eq(1)").text();
+
+ if(status=="active" || status=="inactive"){
+
+ Object(__WEBPACK_IMPORTED_MODULE_0__run_bash_js__["a" /* runBash */])("wp plugin toggle "+plugin+" --path="+wpPath).done(function(exit, output){
+ if(exit===0){
+ swal(plugin,output,"success",{buttons:false,timer:2000}).then(()=>{
+ Object(__WEBPACK_IMPORTED_MODULE_1__editwp_js__["loadMe"])("plugins",theTabb);
+ });
+ } else {
+ swal("ooops",output,"error",{buttons:false,timer:2000});
+ }
+ });
+
+ } else {
+
+ swal("only installed plugins may toggle status!",{buttons:false, timer:2000, icon:"warning"});
+ }
+
+});
+
+
+
+
+
+
+
+
+/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__("./node_modules/jquery/dist/jquery.js-exposed")))
+
+/***/ }),
+
+/***/ "./src/editwp.tab.themes.js":
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__run_bash_js__ = __webpack_require__("./src/run.bash.js");
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__editwp_js__ = __webpack_require__("./src/editwp.js");
+
+
+
+
+
+ /*********************** reload tab contents and inner-tabs ***********************/
+
+ //loadMe("themes","list");
+
+
+var theTabb;
+$(document).on('shown.bs.tab', '#tabs-themes a[data-toggle="tab"]', function (e) {
+
+ theTabb= $(e.target).attr("href").match(/\w+/ig)[1].trim();
+
+});
+
+/*********************** HOME - default themes list dblclikk to read better ***********************/
+$(document).on("dblclick","#themes-home table tbody tr",function(e){
+
+ var theme=$(e.target).closest("tr").find("td:eq(0)").text();
+ var group=$(e.target).closest("tr").find("td:eq(1)").text();
+ var def=$(e.target).closest("tr").find("td:eq(2)").text();
+ var desc=$(e.target).closest("tr").find("td:eq(3)").text();
+ var comment=$(e.target).closest("tr").find("td:eq(4)").text();
+ var msg = "default (URL): " + def + "
" +
+ "group: " + group + "
" +
+ "desc: " + desc + "
" +
+ "comment: " + comment
+
+ swal({
+ title:theme,
+ content:{
+ element:"div",
+ attributes:{
+ className:"alert alert-warning text-left",
+ innerHTML:msg
+ }
+ },
+ className:"alert-info"
+ });
+
+
+
+});
+
+
+/*********************** theme info ***********************/
+$(document).on("dblclick","[id^=table-themes-] tbody tr td:nth-child(2)",function(e){
+ var theme=$(e.target).text().trim();
+ var wpPath=$("table.update-tabs tbody tr:eq(0) td:eq(1)").text();
+ Object(__WEBPACK_IMPORTED_MODULE_0__run_bash_js__["a" /* runBash */])("wp theme get " + theme + " --format=json --path="+wpPath).done(function(status,output){
+
+ if(status===0){
+ output=$.parseJSON(output);
+ var info="";
+ $.each(output, function(i,v){
+ info+="" + i + ": " + v + "
";
+ })
+ swal({
+ title:theme,
+ content:
+ {
+ element:"div",
+ attributes:{
+ className:"alert alert-info text-left",
+ innerHTML:info
+
+ }
+ },
+
+ });
+ } else {
+ swal(theme,"info is available only after install","info");
+ }
+ });
+});
+
+/*********************** single theme update ***********************/
+$(document).on("click", "button[name='btn-themes-update']", function(e){
+ var theme=$(e.target).attr("data-theme");
+ var wpPath=$(e.target).attr("data-path");
+ var thisTD=$(e.target).closest("td");
+ Object(__WEBPACK_IMPORTED_MODULE_0__run_bash_js__["a" /* runBash */])("wp theme update "+theme+" --path="+wpPath).done(function(status,output){
+ if(status===0){
+ swal(theme,output,"success", {timer:2000, buttons:false}).then(()=>{
+ Object(__WEBPACK_IMPORTED_MODULE_1__editwp_js__["loadMe"])("themes",theTabb);
+ });
+ } else {
+ swal("ooops",output,"error");
+ }
+
+ });
+});
+
+/*********************** single theme delete ***********************/
+$(document).on("click","button[name='btn-themes-delete']", function(e){
+ var theme=$(e.target).attr("data-theme");
+ var wpPath=$(e.target).attr("data-path");
+
+ swal({
+ title:theme,
+ icon:"warning",
+ text: "delete this theme?",
+ dangerMode:true,
+ buttons:{
+ cancel:true,
+ confirm:{
+ text:"delete theme"
+ }
+ }
+
+ }).then((value)=>{
+ if(value){
+ Object(__WEBPACK_IMPORTED_MODULE_0__run_bash_js__["a" /* runBash */])("wp theme delete "+theme+" --path="+wpPath).done(function(status, output){
+ if(status===0){
+ swal(theme,output,"success", {timer:2000, buttons:false}).then(()=>{
+ Object(__WEBPACK_IMPORTED_MODULE_1__editwp_js__["loadMe"])("themes",theTabb);
+ });
+ } else {
+ swal("ooops",output,"error");
+ }
+
+ });
+ }
+ });
+
+});
+
+/*********************** single theme Install ***********************/
+$(document).on("click","button[name='btn-themes-install']", function(e){
+ var theme=$(e.target).attr("data-theme");
+ var wpPath=$(e.target).attr("data-path");
+
+ Object(__WEBPACK_IMPORTED_MODULE_0__run_bash_js__["a" /* runBash */])("wp theme install "+theme+" --path="+wpPath).done(function(status,output){
+ if(status===0){
+ swal("installed!",theme + " is installed!","success",{buttons:false,timer:2000}).then(()=>{
+ Object(__WEBPACK_IMPORTED_MODULE_1__editwp_js__["loadMe"])("themes",theTabb);
+ });
+ } else {
+ swal("ooops","something went wrong","error",{buttons:false,timer:2000});
+ }
+ });
+
+
+});
+
+
+/*********************** any checkbox checked ***********************/
+$(document).on("change","input[name='check-themes']",function(e){
+ if($("#table-themes-"+theTabb+" tbody input:checked").length>0){
+ $("#table-themes-"+theTabb+" tfoot").removeClass('d-none');
+ } else {
+ $("#table-themes-"+theTabb+" tfoot").addClass('d-none');
+ }
+
+});
+
+/*********************** check-pugins-all ***********************/
+$(document).on("change","input[name^=check-themes-all-]", function(e){
+ var status = $(e.target).prop("checked");
+ $("#table-themes-"+theTabb+" tbody input[type='checkbox']").prop("checked", status).trigger("change");
+});
+
+
+/*********************** select-themes-[theTabb]***********************/
+$(document).on("click","[id^=btn-select-themes-]", function(e){
+ var VaL=$("#select-themes-"+theTabb).val();
+ var wpPath=$(e.target).attr("data-path");
+ var ps="";
+ $("#table-themes-"+theTabb+" tbody input:checked").each(function(i,v){
+
+ ps+=$(v).closest("tr").find("td:eq(1)").text().trim() + " ";
+
+ });
+ ps.trim();
+
+ switch(parseInt(VaL)){
+ case 3:
+ Object(__WEBPACK_IMPORTED_MODULE_0__run_bash_js__["a" /* runBash */])("wp theme install "+ps+" --path="+wpPath).done(function(status,output){
+ if(status===0){
+ swal("all installed",output,"success",{buttons:false,timer:2000}).then(()=>{
+ Object(__WEBPACK_IMPORTED_MODULE_1__editwp_js__["loadMe"])("themes",theTabb);
+ });
+ } else {swal("oops",output,"error");}
+ });
+ break;
+ case 4:
+ Object(__WEBPACK_IMPORTED_MODULE_0__run_bash_js__["a" /* runBash */])("wp theme update "+ps+" --path="+wpPath).done(function(status,output){
+ if(status===0){
+ swal("all updated",output,"success",{buttons:false,timer:2000}).then(()=>{
+ Object(__WEBPACK_IMPORTED_MODULE_1__editwp_js__["loadMe"])("themes",theTabb);
+ });
+ } else {swal("oops",output,"error").then(()=>{
+ Object(__WEBPACK_IMPORTED_MODULE_1__editwp_js__["loadMe"])("themes",theTabb);
+ });}
+ });
+ break;
+ case 5:
+ Object(__WEBPACK_IMPORTED_MODULE_0__run_bash_js__["a" /* runBash */])("wp theme delete "+ps+" --path="+wpPath).done(function(status,output){
+ if(status===0){
+ swal("all deleted",output,"success",{buttons:false,timer:2000}).then(()=>{
+ Object(__WEBPACK_IMPORTED_MODULE_1__editwp_js__["loadMe"])("themes",theTabb);
+ });
+ } else {swal("oops",output,"error");}
+ });
+ break;
+
+ }
+});
+
+/*********************** filter themes ***********************/
+$(document).on("keyup", "input[name='filter-themes']", function(e){
+ var ne=$(e.target);
+ var VaL=$(e.target).val();
+ $(e.target).attr("AUTOCOMPLETE","OFF");
+
+ switch(e.which){
+ case 13:
+ $(e.target).blur();
+ break;
+
+ case 27:
+ $("#table-themes-"+theTabb+" thead th input[name='filter-themes']").blur().val("");
+ $("#table-themes-"+theTabb+" tbody tr").show();
+ break;
+
+ default:
+ $("#table-themes-"+theTabb+" tbody tr").hide();
+ $("#table-themes-"+theTabb+" tbody tr td:nth-child(2):contains('"+VaL+"')").closest("tr").show();
+
+ break;
+ }
+
+});
+
+
+/*********************** toggle active/inactive status - dblclick td ***********************/
+$(document).on("dblclick","[id^=table-themes-] tbody tr td:nth-child(3)", function(e){
+ var status=$(e.target).text().trim();
+ var theme=$(e.target).closest("tr").find("td:eq(1)").text().trim();
+ var wpPath=$("table.update-tabs tbody tr:eq(0) td:eq(1)").text();
+
+ if(status=="active" || status=="inactive"){
+
+ Object(__WEBPACK_IMPORTED_MODULE_0__run_bash_js__["a" /* runBash */])("wp theme activate "+theme+" --path="+wpPath).done(function(exit, output){
+ if(exit===0){
+ swal(theme,output,"success",{buttons:false,timer:2000}).then(()=>{
+ Object(__WEBPACK_IMPORTED_MODULE_1__editwp_js__["loadMe"])("themes",theTabb);
+ });
+ } else {
+ swal("ooops",output,"error",{buttons:false,timer:2000});
+ }
+ });
+
+ } else {
+
+ swal("only installed themes may toggle status!",{buttons:false, timer:2000, icon:"warning"});
+ }
+
+});
+
+
+
+
+
+
+
+
+/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__("./node_modules/jquery/dist/jquery.js-exposed")))
+
+/***/ }),
+
+/***/ "./src/editwp.tab.users.js":
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__run_bash_js__ = __webpack_require__("./src/run.bash.js");
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__editwp_js__ = __webpack_require__("./src/editwp.js");
+
+
+
+
+ /*********************** reload tab contents and inner-tabs ***********************/
+
+ //loadMe("users","admin");
+
+/*********************** get theTabb ***********************/
+$(document).on("shown.bs.tab","#tabs-config",function(e){
+
+ var theTabb=$(e.target).attr("href").match(/\w+/ig)[1];
+
+
+});
+
+
+/*********************** user details dblclick ***********************/
+$(document).on("dblclick", "#users-list table tbody tr", function(e){
+ var user=$(e.target).closest("tr").find("td:eq(1)").text().trim();
+ var wpPath=$("table.update-tabs tbody td:eq(1)").text().trim();
+
+ Object(__WEBPACK_IMPORTED_MODULE_0__run_bash_js__["a" /* runBash */])("wp user meta list "+user+" --format=json --path="+wpPath).done(function(status, output){
+ output=$.parseJSON(output);
+ var msg="";
+ var VaL="";
+ $.each(output, function(i,v){
+ if($.type(v["meta_value"])==="object"){
+ VaL=JSON.stringify(v["meta_value"]);
+ } else { VaL=v["meta_value"];}
+ msg+="" + v["meta_key"] + ": " +
+ "" + VaL + "
";
+
+ });
+
+
+ if(status===0){
+ swal({
+ title:user,
+ content:{
+ element:"div",
+ attributes:{
+ className:"alert alert-warning text-left o-hidden smaller",
+ innerHTML:msg
+ }
+ },
+ className:"alert-info"
+ });
+
+ } else {
+
+ swal("oops", output, "error");
+ }
+
+ });
+});
+
+
+/*********************** on change type of user-value >> radio + select***********************/
+$(document).on("change","[name^=user-value-]", function(e){
+
+ var theNode=$(e.target).prop("nodeName");
+ var theType=$(e.target).attr("type");
+
+ if(theNode=="SELECT" || theType=="radio"){
+ var cmd=updateCMD($(e.target));
+ updateUser(cmd);
+
+ }
+
+});
+
+/*********************** on click type of user-value >> text + textarea***********************/
+$(document).on("click","[name^=btn-user-value-]", function(e){
+
+ var theNode=$(e.target).parent().parent().children().eq(0).prop("nodeName");
+ var theType=$(e.target).parent().parent().children().eq(0).attr("type");
+ //from button > input-group-append > input-group < 1st child =>text/textarea
+
+ if(theNode=="TEXTAREA" || theType=="text"){
+ var cmd=updateCMD($(e.target));
+ updateUser(cmd);
+
+ }
+
+
+});
+
+
+/*********************** function update user ***********************/
+function updateCMD(el){
+ var theNode=el.prop("nodeName");
+ var admin=$("#users-admin").attr("data-admin");
+ var wpPath=$("#users-admin").attr("data-path");
+ var theGroup=el.closest("tr").attr("data-group");
+ var theField=el.closest("tr").find("td:eq(0)").text().trim();
+ var theVal=el.val();
+ if(theNode=="BUTTON"){
+ theVal=el.parent().parent().children().eq(0).val();
+ }
+ if(theNode=="I" || theNode=="TD"){
+ theVal=el.closest("tr").find("td:eq(1)").attr("data-default");
+ }
+
+ var cmd="wp user ";
+ if(theGroup=="get"){
+ cmd+="update " + admin + " ";
+ cmd+="--" + theField + "=" + "'" + theVal + "' ";
+ cmd+= "--path=" + wpPath
+ }
+ if(theGroup=="meta"){
+ cmd+="meta update " + admin + " ";
+ cmd+= theField + " " + "'" + theVal + "' ";
+ cmd+= "--path=" + wpPath
+ }
+
+ return cmd
+
+}//end function updateCMD
+
+
+function updateUser(cmd){
+ Object(__WEBPACK_IMPORTED_MODULE_0__run_bash_js__["a" /* runBash */])(cmd).done(function(status,output){
+ if(status===0){
+ swal("user updated!",output,"success",{buttons:false,timer:2000}).then(()=>{
+ Object(__WEBPACK_IMPORTED_MODULE_1__editwp_js__["loadMe"])("users","admin");
+ });
+ } else {
+
+ swal("ooops!",output,"error").then(()=>{Object(__WEBPACK_IMPORTED_MODULE_1__editwp_js__["loadMe"])("users","admin")});
+ }
+
+ });
+}//end function updateUser
+
+
+
+/*********************** dblclick assign default values ***********************/
+$(document).on("dblclick","#table-users-admin tbody tr td:nth-child(2)",function(e){
+
+ var cmd=updateCMD($(e.target));
+ updateUser(cmd);
+
+});
+
+/*********************** dblclick assign ALL default values ***********************/
+$(document).on("dblclick","#table-users-admin thead tr th:nth-child(2)",function(e){
+
+ var fields=$(e.target).closest("table").find("[name^=user-value-]");
+ var cmd="";
+ $.each(fields, function(i,v){
+ cmd+=updateCMD($(v)) + "; ";
+ });
+
+ updateUser(cmd);
+
+});
+
+
+
+
+
+
+
+
+
+
+
+/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__("./node_modules/jquery/dist/jquery.js-exposed")))
+
+/***/ }),
+
+/***/ "./src/run.bash.js":
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* WEBPACK VAR INJECTION */(function($) {/* harmony export (immutable) */ __webpack_exports__["a"] = runBash;
+function runBash(cmd){
+ var status=false;
+ var dfd = new $.Deferred();
+
+ $.ajax({
+ url: "../inc/run.bash.php",
+ type: "post",
+ dataType: "json",
+ async:false,
+ data: {do:"run", run:"bash", cmd:cmd}
+ }).done(function(data){
+ dfd.resolve(data.exit_status,data.output);
+ }).fail(function(jqXHR,textStatus,errorThrown){
+ dfd.resolve(false,"ajax failed!\n"+errorThrown);
+ });
+
+ return dfd.promise();
+}
+/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__("./node_modules/jquery/dist/jquery.js-exposed")))
+
+/***/ }),
+
+/***/ "./src/run.db.delete.js":
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* WEBPACK VAR INJECTION */(function($) {/* harmony export (immutable) */ __webpack_exports__["a"] = runDBdelete;
+function runDBdelete(dbNAME){
+
+ var status=false;
+
+ $.ajax({
+ url: "../inc/run.db.delete.php",
+ type: "post",
+ async:false,
+ data: {do:"run", run:"DBdelete", dbNAME:dbNAME}
+ }).done(function(data){
+ if(data!=="false"){
+ status=true;
+ } else {
+ status=false;
+ }
+
+ }).fail(function(){
+ swal("oops","bad data from rub.db.delete.php", "warning");
+ });
+
+ return status;
+
+
+ /*********************** returns true if database deleted ***********************/
+
+
+
+}//end function
+/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__("./node_modules/jquery/dist/jquery.js-exposed")))
+
+/***/ }),
+
+/***/ "./src/run.db.export.js":
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* WEBPACK VAR INJECTION */(function($) {/* harmony export (immutable) */ __webpack_exports__["a"] = runDBexport;
+function runDBexport(wpPath, DBname, export_path="tmp"){
+/***********************
+export_path is can be
+ "tmp" = ozwpdev basedir/tmp
+ "wp" =wpPath/wp-content/uploads/ozwpdev
+ or a specific path
+ if path does not exists, mkdir cmd creates folder
+ ***********************/
+
+ var status=false;
+
+ $.ajax({
+ url: "../inc/run.db.export.php",
+ type: "post",
+ async:false,
+ data: {do:"run", run:"DBexport", wpPath:wpPath, DBname:DBname, export_path:export_path}
+ }).done(function(data){
+ if(data!=="false"){
+ status=true;
+ } else {
+ status=false;
+ }
+
+ }).fail(function(){
+ swal("oops","bad data from run.db.export.php", "warning");
+ });
+
+ return status;
+
+
+ /*********************** returns true if database export is successful ***********************/
+
+
+
+}//end function
+/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__("./node_modules/jquery/dist/jquery.js-exposed")))
+
+/***/ }),
+
+/***/ "./src/run.finder.js":
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* WEBPACK VAR INJECTION */(function($) {/* harmony export (immutable) */ __webpack_exports__["a"] = runFinder;
+function runFinder(path=" . "){
+ var status=false;
+
+ $.ajax({
+ url: "../inc/run.finder.php",
+ type: "post",
+ async:false,
+ data: {do:"run", run:"finder", path:path}
+ }).done(function(data){
+
+ if(data=="true"){
+ //swal("ok","it came", "success");
+ status=true;
+ } else {
+ swal("oops","path not found", "warning");
+ }
+ }).fail(function(){
+ swal("oops","path not found", "warning");
+ });
+
+ return status;
+}
+/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__("./node_modules/jquery/dist/jquery.js-exposed")))
+
+/***/ }),
+
+/***/ "./src/run.wp.config.get.js":
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* WEBPACK VAR INJECTION */(function($) {/* harmony export (immutable) */ __webpack_exports__["a"] = runWPconfigGet;
+function runWPconfigGet(wpPath,item=null){
+
+ var status=false;
+ var backData;
+
+ $.ajax({
+ url: "../inc/run.wp.config.get.php",
+ type: "post",
+ dataType: 'json',
+ async:false,
+ data: {do:"run", run:"WPconfigGet", wpPath:wpPath}
+
+ }).done(function(data){
+
+ status=true;
+ backData = data;
+
+ }).fail(function(){
+ swal("oops","bad data from run.wp.config.get.php", "warning");
+ });
+
+ if(status) {
+ if(item==null){
+ return backData;
+ } else {
+ /*** if item given then return its value ***/
+ var arr = $.parseJSON(backData);
+ $.each(arr, function(i,v){
+ if(v["name"]==item){
+ backData= v["value"];
+ }
+ });
+ return backData;
+ }
+
+ } else {
+ return false;
+ }
+
+
+ /*********************** returns json string of WP config list or item value like: DB_NAME ***********************/
+
+
+
+}//end function
+/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__("./node_modules/jquery/dist/jquery.js-exposed")))
+
+/***/ }),
+
+/***/ "./src/run.wp.lock.js":
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* WEBPACK VAR INJECTION */(function($) {/* harmony export (immutable) */ __webpack_exports__["a"] = runWPlock;
+function runWPlock(wpName, lock){
+
+ /***
+ wpName is the folder name in the root dir
+ lock=status returns if the wp install locked or not
+ locked status = true means there is no ozwpdev.txt in root dir
+ locked status = false means there is ozwpdev.txt in root dir and can be modified
+ to set or unlik ozwpdev.txt assign lock = lock / unlock (unlock means free modify)
+ ***/
+
+ var status=false;
+
+ $.ajax({
+ url: "../inc/run.wp.lock.php",
+ type: "post",
+ async:false,
+ data: {
+ do:"run",
+ run:"WPlock",
+ wpName:wpName,
+ lock:lock
+ }
+
+ }).done(function(data){
+
+ status=$.parseJSON(data);
+
+ }).fail(function(){
+ swal("oops","bad data from run.wp.lock.php", "warning");
+ });
+
+ return status;
+
+
+
+}//end function
+/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__("./node_modules/jquery/dist/jquery.js-exposed")))
+
+/***/ }),
+
+/***/ 4:
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = __webpack_require__("./src/editwp.js");
+
+
+/***/ })
+
+},[4]);
+//# sourceMappingURL=editwp.bundle.js.map
\ No newline at end of file
diff --git a/dist/editwp.bundle.js.map b/dist/editwp.bundle.js.map
new file mode 100644
index 0000000..910de0f
--- /dev/null
+++ b/dist/editwp.bundle.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack:///./node_modules/tablesorter/dist/css/theme.bootstrap_4.min.css","webpack:///./node_modules/tablesorter/dist/js/jquery.tablesorter.js","webpack:///./src/editwp.backup.js","webpack:///./src/editwp.delete.js","webpack:///./src/editwp.js","webpack:///./src/editwp.tab.config.js","webpack:///./src/editwp.tab.options.js","webpack:///./src/editwp.tab.plugins.js","webpack:///./src/editwp.tab.themes.js","webpack:///./src/editwp.tab.users.js","webpack:///./src/run.bash.js","webpack:///./src/run.db.delete.js","webpack:///./src/run.db.export.js","webpack:///./src/run.finder.js","webpack:///./src/run.wp.config.get.js","webpack:///./src/run.wp.lock.js"],"names":[],"mappings":";;;;;AAAA,yC;;;;;;;ACAA;AACA;AACA;AAAA;AAAA;AAAA;AACA,EAAE;AACF;AACA,EAAE;AACF;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,uDAAuD,MAAM;AAC7D;AACA;;AAEA,wBAAwB,QAAQ,sCAAsC,EAAE,QAAQ,eAAe,KAAK;AACpG,kEAAkE,iBAAiB,EAAE;AACrF,yDAAyD;;AAEzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,wBAAwB;AACxB;AACA,4DAA4D;AAC5D,wDAAwD,mBAAmB;AAC3E,2DAA2D;AAC3D;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,+BAA+B,KAAK;AACpC;AACA;AACA;AACA,IAAI;;AAEJ;AACA,yDAAyD;;AAEzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,2FAA2F;AAC3F,sEAAsE;;AAEtE,gFAAgF,KAAK;AACrF;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,cAAc;AACd,cAAc;AACd;;AAEA,uCAAuC;AACvC;AACA;;AAEA,6BAA6B;;AAE7B,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA,wBAAwB,SAAS;AACjC,wBAAwB,MAAM;AAC9B,wBAAwB,MAAM;AAC9B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA,YAAY;;AAEZ;AACA,sBAAsB;;AAEtB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,oBAAoB,6CAA6C;AACjE;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA,oDAAoD,oBAAoB;AACxE;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,MAAM;AACN;AACA;AACA,KAAK;AACL,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,gCAAgC;AAChC,iCAAiC;AACjC;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA,IAAI;AACJ,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,oBAAoB;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oEAAoE,QAAQ;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iFAAiF;AACjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,kBAAkB,kBAAkB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,YAAY;AAChC;AACA;AACA,wCAAwC;AACxC;AACA,sEAAsE;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,6BAA6B,oBAAoB;AACjD;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,kBAAkB,YAAY;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,2BAA2B,cAAc;AACzC;AACA;AACA,kBAAkB,YAAY;AAC9B;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA,iBAAiB,WAAW;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD;AACtD;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,4BAA4B;AACpD,gBAAgB;AAChB;AACA,oDAAoD;AACpD;AACA;;AAEA;AACA,uBAAuB,sBAAsB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE;AAClE;AACA;AACA,yBAAyB,gBAAgB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA;AACA,WAAW,2CAA2C;AACtD;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,sBAAsB;AAC7C,0BAA0B,kBAAkB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,oBAAoB;AACjD;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,YAAY,kCAAkC;AAC9C;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,yBAAyB,uBAAuB;AAChD;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,YAAY;AAC9B;AACA;AACA;AACA,0BAA0B;AAC1B,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,WAAW;AACxB;AACA;AACA;AACA,MAAM;;AAEN;AACA;AACA;AACA;AACA;AACA,uBAAuB,yBAAyB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,YAAY;AAC9B;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,mBAAmB,aAAa;AAChC;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,kBAAkB,YAAY;AAC9B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,YAAY;AAChC;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,8CAA8C;AAC9C;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,iBAAiB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,iBAAiB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gFAAgF;AAChF;AACA;AACA;AACA;AACA,wBAAwB,8BAA8B;AACtD;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,kBAAkB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,oBAAoB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,mBAAmB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA,oBAAoB,0BAA0B;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,mBAAmB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,oBAAoB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,GAAG;;AAEH;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,uBAAuB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;;AAEA;AACA;AACA;AACA,yBAAyB,qBAAqB;AAC9C;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,mBAAmB,aAAa;AAChC;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,KAAK;AACL;AACA;AACA;AACA,MAAM;AACN;AACA,IAAI;AACJ;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,kBAAkB;AACnC;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA,mCAAmC;AACnC;AACA,GAAG;;AAEH;AACA;AACA,mBAAmB,UAAU;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,WAAW;AACnC,wBAAwB,UAAU;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,YAAY;AAC9B;AACA;AACA;AACA;AACA,gDAAgD,iCAAiC;AACjF;AACA;AACA;AACA;AACA;AACA,4BAA4B,WAAW;AACvC,4BAA4B,UAAU;AACtC;AACA;AACA,GAAG;;AAEH;AACA,mBAAmB,UAAU;AAC7B;AACA,mCAAmC,uEAAuE;AAC1G,mCAAmC,qEAAqE;AACxG;AACA,GAAG;;AAEH;AACA,mBAAmB,UAAU;AAC7B;AACA,mCAAmC,qEAAqE;AACxG,mCAAmC,uEAAuE;AAC1G;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,YAAY;AAC/B;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA,mBAAmB,UAAU;AAC7B;AACA,mCAAmC,uEAAuE;AAC1G,mCAAmC,qEAAqE;AACxG,sBAAsB,oCAAoC;AAC1D,sBAAsB,oCAAoC;AAC1D;AACA,GAAG;;AAEH;AACA,mBAAmB,UAAU;AAC7B;AACA,mCAAmC,qEAAqE;AACxG,mCAAmC,uEAAuE;AAC1G,sBAAsB,oCAAoC;AAC1D,sBAAsB,oCAAoC;AAC1D;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,kBAAkB,YAAY;AAC9B;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,mBAAmB,YAAY;AAC/B;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,YAAY;AAC/B;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,mBAAmB;;AAErC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,oBAAoB;AACnD;AACA;AACA;AACA,GAAG;;AAEH;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,mBAAmB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,mBAAmB,YAAY;AAC/B;AACA;AACA;AACA,+BAA+B,sBAAsB;AACrD;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,mBAAmB,YAAY;AAC/B;AACA;AACA;AACA;AACA;AACA,sCAAsC,oBAAoB;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,YAAY;AAC/B;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,mBAAmB,aAAa;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,YAAY;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,kBAAkB,YAAY;AAC9B;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA,iDAAiD,YAAY;AAC7D,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,kBAAkB;AACjC;AACA,gBAAgB,kBAAkB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,mCAAmC;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA;AACA;AACA,8BAA8B,6BAA6B;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,mBAAmB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,aAAa;AACjC;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,WAAW;AACtC;AACA;AACA;AACA;AACA,uDAAuD;AACvD;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA,IAAI;AACJ,oDAAoD;AACpD;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,aAAa;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,iCAAiC,QAAQ;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA,EAAE;;AAEF;AACA,yBAAyB,EAAE,SAAS,IAAI,SAAS,IAAI;AACrD;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA,EAAE;;AAEF,wCAAwC;AACxC,oCAAoC,KAAK,SAAS,IAAI,SAAS,EAAE,QAAQ,IAAI,IAAI,EAAE,KAAK,EAAE;AAC1F,iCAAiC,IAAI,SAAS,KAAK,MAAM,EAAE;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA,EAAE;;AAEF,8DAA8D;AAC9D,gCAAgC,IAAI,SAAS,IAAI,SAAS,EAAE,OAAO,EAAE,SAAS,IAAI,SAAS,IAAI;AAC/F;AACA;AACA;AACA,8BAA8B,IAAI,WAAW,IAAI,WAAW,EAAE;AAC9D,8BAA8B,EAAE,WAAW,IAAI,WAAW,IAAI;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,8BAA8B;AACtD;AACA;AACA;AACA;AACA,uBAAuB,gBAAgB;AACvC;AACA;AACA,gDAAgD,SAAS;AACzD;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,sBAAsB,QAAQ;AAC9B;AACA;AACA;AACA,wBAAwB,8BAA8B;AACtD,uEAAuE;AACvE;AACA,4CAA4C;AAC5C;AACA;AACA,EAAE;;AAEF,CAAC;;AAED;AACA,CAAC;;;;;;;;;;;ACv1FmB;;AAEpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,EAAE;AACF;AACA;AACA;AACA,EAAE;AACF;AACA;AACA,GAAG;AACH;AACA;AACA,EAAE;AACF;AACA;AACA,GAAG;AACH;AACA;AACA,EAAE;;AAEF,CAAC,c;;;;;;;;;;;;ACrCe;AACI;AACA;;AAEpB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,EAAE;AACF;AACA;AACA;AACA,EAAE;AACF;AACA;AACA,GAAG;AACH;AACA;AACA,EAAE;AACF;AACA;AACA,GAAG;AACH;AACA;AACA,EAAE;AACF;AACA;AACA;AACA,IAAI;AACJ,GAAG;AACH;AACA;AACA,EAAE;;;AAGF,CAAC,iB;;;;;;;;;;;;;;;;;;;;;;;;;;ACvDiB;AACA;AACK;AACP;;;AAGI;AACA;;AAEpB;AACA;AACA;AACA;AACA;;AAEA;AACA;;;;AAIA,6B;;;AAGA;AACA;AACA;AACA,EAAE;;AAEF;AACA;;AAEA;AACA;AACA;AACA;;;AAGA;;AAEA;;AAEA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;;AAEA;;AAEA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;;AAGP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,+BAA+B,sBAAsB;AACrD;AACA;AACA,SAAS;;;;AAIT;;;;AAIA,OAAO,EAAE;;;;AAIT,CAAC,EAAE;;AAEH;;AAEA;;AAEA,oEAAoE,cAAc;AAClF;AACA;AACA;;AAEA,EAAE;AACF;AACA;;AAEA;AACA;AACA;AACA,yBAAyB,sBAAsB;AAC/C;;AAEA;;AAEA,GAAG;AACH;AACA,SAAS;;AAET;AACA;;AAEA;;AAEA;AACA;AACA,yCAAyC,yBAAyB;AAClE,IAAI;AACJ;AACA;AACA,yCAAyC,yBAAyB;AAClE;;AAEA,GAAG;AACH;;;;;;;;;;;;;;;;AC9IgB;;AAEhB;AACA,CAA6B;AAC7B;;;AAGA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,CAAC;;;;AAID;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;;;AAID;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,I;;AAEA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,IAAI;;AAEJ,GAAG;AACH;AACA;AACA;AACA,EAAE;AACF,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;AC5Ie;;AAEhB;AACA,CAA6B;AAC7B;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC;;AAED;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC;;AAED;AACA;;AAEA;;AAEA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA,EAAE;AACF;;AAEA,CAAC;;;;;;;;;;;;;;;;;;;;;;ACvGe;;;;;AAKhB;AACA,CAA6B;AAC7B;;;AAGA;AACA;;AAEA;;AAEA,CAAC;;AAED;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;;;;AAIJ,CAAC;;;AAGD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL,IAAI;AACJ,GAAG;AACH;AACA;AACA,EAAE;AACF,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,0BAA0B;AAC5D;AACA,IAAI;AACJ,GAAG;AACH;AACA;;AAEA,EAAE;AACF,CAAC;;AAED;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;AACA,oCAAoC,0BAA0B;AAC9D;AACA,MAAM;AACN,KAAK;AACL;AACA;;AAEA,KAAK;AACL;AACA,GAAG;;AAEH,CAAC;;AAED;AACA;AACA;AACA;;AAEA;AACA;AACA,0DAA0D,yBAAyB;AACnF;AACA,IAAI;AACJ,GAAG;AACH,gDAAgD,yBAAyB;AACzE;AACA,EAAE;;;AAGF,CAAC;;;AAGD;AACA;;AAEA;AACA,8D;AACA,EAAE;AACF;AACA;;AAEA,CAAC;;AAED;AACA;AACA;AACA;AACA,CAAC;;;AAGD;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,EAAE;AACF;;AAEA;AACA;AACA;AACA;AACA,4CAA4C,yBAAyB;AACrE;AACA,MAAM;AACN,KAAK,OAAO;AACZ,IAAI;AACJ;AACA;AACA;AACA;AACA,8CAA8C,yBAAyB;AACvE;AACA,MAAM;AACN,KAAK,OAAO;AACZ,IAAI;AACJ;AACA;AACA;AACA;AACA,4CAA4C,yBAAyB;AACrE;AACA,MAAM;AACN,KAAK,OAAO;AACZ,IAAI;AACJ;AACA;AACA;AACA;AACA,0CAA0C,yBAAyB;AACnE;AACA,MAAM;AACN,KAAK,OAAO;AACZ;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA,0CAA0C,yBAAyB;AACnE;AACA,MAAM;AACN,KAAK,OAAO;AACZ,IAAI;AACJ;;AAEA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,CAAC;;;AAGD;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,kCAAkC,yBAAyB;AAC3D;AACA,KAAK;AACL,IAAI;AACJ,iCAAiC,yBAAyB;AAC1D;AACA,GAAG;;AAEH,EAAE;;AAEF,oDAAoD,0CAA0C;AAC9F;;AAEA,CAAC;;;;;;;;;;;;;;;;;;;ACvRe;;;;;AAKhB;AACA,CAA6B;AAC7B;;;AAGA;AACA;;AAEA;;AAEA,CAAC;;AAED;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;;;;AAIJ,CAAC;;;AAGD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL,IAAI;AACJ,GAAG;AACH;AACA;AACA,EAAE;AACF,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,0BAA0B;AAC3D;AACA,IAAI;AACJ,GAAG;AACH;AACA;;AAEA,EAAE;AACF,CAAC;;AAED;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;AACA,mCAAmC,0BAA0B;AAC7D;AACA,MAAM;AACN,KAAK;AACL;AACA;;AAEA,KAAK;AACL;AACA,GAAG;;AAEH,CAAC;;AAED;AACA;AACA;AACA;;AAEA;AACA;AACA,yDAAyD,yBAAyB;AAClF;AACA,IAAI;AACJ,GAAG;AACH,gDAAgD,yBAAyB;AACzE;AACA,EAAE;;;AAGF,CAAC;;;AAGD;AACA;AACA;AACA,6D;AACA,EAAE;AACF;AACA;;AAEA,CAAC;;AAED;AACA;AACA;AACA;AACA,CAAC;;;AAGD;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,EAAE;AACF;;AAEA;AACA;AACA;AACA;AACA,4CAA4C,yBAAyB;AACrE;AACA,MAAM;AACN,KAAK,OAAO;AACZ,IAAI;AACJ;AACA;AACA;AACA;AACA,0CAA0C,yBAAyB;AACnE;AACA,MAAM;AACN,KAAK,OAAO;AACZ;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA,0CAA0C,yBAAyB;AACnE;AACA,MAAM;AACN,KAAK,OAAO;AACZ,IAAI;AACJ;;AAEA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,CAAC;;;AAGD;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,iCAAiC,yBAAyB;AAC1D;AACA,KAAK;AACL,IAAI;AACJ,iCAAiC,yBAAyB;AAC1D;AACA,GAAG;;AAEH,EAAE;;AAEF,mDAAmD,0CAA0C;AAC7F;;AAEA,CAAC;;;;;;;;;;;;;;;;;;;ACpQe;;;;AAIhB;AACA,CAA6B;AAC7B;;AAEA;AACA;;AAEA;;;AAGA,CAAC;;;AAGD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,OAAO;AACX;AACA;;AAEA,OAAO;;;AAGP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,IAAI;;AAEJ,GAAG;;AAEH;AACA;;AAEA,EAAE;AACF,CAAC;;;AAGD;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,CAAC;;AAED;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;;AAGA,CAAC;;;AAGD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,G;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,CAAC;;;AAGD;AACA;AACA;AACA,0CAA0C,yBAAyB;AACnE;AACA,IAAI;AACJ,GAAG;;AAEH,2CAA2C,4EAAwB;AACnE;;AAEA,EAAE;AACF,CAAC;;;;AAID;AACA;;AAEA;AACA;;AAEA,CAAC;;AAED;AACA;;AAEA;AACA;AACA;AACA,2BAA2B;AAC3B,EAAE;;AAEF;;AAEA,CAAC;;;;;;;;;;;;;;;;;;;;;AC5JD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,EAAE;AACF;AACA,EAAE;AACF;AACA,EAAE;;AAEF;AACA,C;;;;;;;;;;ACjBA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT,EAAE;AACF;AACA;AACA,GAAG;AACH;AACA;;AAEA,EAAE;AACF;AACA,EAAE;;AAEF;;;AAGA;;;;AAIA,CAAC,c;;;;;;;;;;AC3BD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT,EAAE;AACF;AACA;AACA,GAAG;AACH;AACA;;AAEA,EAAE;AACF;AACA,EAAE;;AAEF;;;AAGA;;;;AAIA,CAAC,c;;;;;;;;;;AClCD;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT,EAAE;;AAEF;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,EAAE;AACF;AACA,EAAE;;AAEF;AACA,C;;;;;;;;;;ACrBA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET,EAAE;;AAEF;AACA;;AAEA,EAAE;AACF;AACA,EAAE;;AAEF;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA,EAAE;AACF;AACA;;;AAGA;;;;AAIA,CAAC,c;;;;;;;;;;AC5CD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,EAAE;;AAEF;;AAEA,EAAE;AACF;AACA,EAAE;;AAEF;;;;AAIA,CAAC,c","file":"editwp.bundle.js","sourcesContent":["// removed by extract-text-webpack-plugin\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/tablesorter/dist/css/theme.bootstrap_4.min.css\n// module id = ./node_modules/tablesorter/dist/css/theme.bootstrap_4.min.css\n// module chunks = 1 4","(function(factory) {\n\tif (typeof define === 'function' && define.amd) {\n\t\tdefine(['jquery'], factory);\n\t} else if (typeof module === 'object' && typeof module.exports === 'object') {\n\t\tmodule.exports = factory(require('jquery'));\n\t} else {\n\t\tfactory(jQuery);\n\t}\n}(function(jQuery) {\n\n/*! TableSorter (FORK) v2.30.1 *//*\n* Client-side table sorting with ease!\n* @requires jQuery v1.2.6+\n*\n* Copyright (c) 2007 Christian Bach\n* fork maintained by Rob Garrison\n*\n* Examples and original docs at: http://tablesorter.com\n* Dual licensed under the MIT and GPL licenses:\n* http://www.opensource.org/licenses/mit-license.php\n* http://www.gnu.org/licenses/gpl.html\n*\n* @type jQuery\n* @name tablesorter (FORK)\n* @cat Plugins/Tablesorter\n* @author Christian Bach - christian.bach@polyester.se\n* @contributor Rob Garrison - https://github.com/Mottie/tablesorter\n* @docs (fork) - https://mottie.github.io/tablesorter/docs/\n*/\n/*jshint browser:true, jquery:true, unused:false, expr: true */\n;( function( $ ) {\n\t'use strict';\n\tvar ts = $.tablesorter = {\n\n\t\tversion : '2.30.1',\n\n\t\tparsers : [],\n\t\twidgets : [],\n\t\tdefaults : {\n\n\t\t\t// *** appearance\n\t\t\ttheme : 'default', // adds tablesorter-{theme} to the table for styling\n\t\t\twidthFixed : false, // adds colgroup to fix widths of columns\n\t\t\tshowProcessing : false, // show an indeterminate timer icon in the header when the table is sorted or filtered.\n\n\t\t\theaderTemplate : '{content}',// header layout template (HTML ok); {content} = innerHTML, {icon} = // class from cssIcon\n\t\t\tonRenderTemplate : null, // function( index, template ) { return template; }, // template is a string\n\t\t\tonRenderHeader : null, // function( index ) {}, // nothing to return\n\n\t\t\t// *** functionality\n\t\t\tcancelSelection : true, // prevent text selection in the header\n\t\t\ttabIndex : true, // add tabindex to header for keyboard accessibility\n\t\t\tdateFormat : 'mmddyyyy', // other options: 'ddmmyyy' or 'yyyymmdd'\n\t\t\tsortMultiSortKey : 'shiftKey', // key used to select additional columns\n\t\t\tsortResetKey : 'ctrlKey', // key used to remove sorting on a column\n\t\t\tusNumberFormat : true, // false for German '1.234.567,89' or French '1 234 567,89'\n\t\t\tdelayInit : false, // if false, the parsed table contents will not update until the first sort\n\t\t\tserverSideSorting: false, // if true, server-side sorting should be performed because client-side sorting will be disabled, but the ui and events will still be used.\n\t\t\tresort : true, // default setting to trigger a resort after an 'update', 'addRows', 'updateCell', etc has completed\n\n\t\t\t// *** sort options\n\t\t\theaders : {}, // set sorter, string, empty, locked order, sortInitialOrder, filter, etc.\n\t\t\tignoreCase : true, // ignore case while sorting\n\t\t\tsortForce : null, // column(s) first sorted; always applied\n\t\t\tsortList : [], // Initial sort order; applied initially; updated when manually sorted\n\t\t\tsortAppend : null, // column(s) sorted last; always applied\n\t\t\tsortStable : false, // when sorting two rows with exactly the same content, the original sort order is maintained\n\n\t\t\tsortInitialOrder : 'asc', // sort direction on first click\n\t\t\tsortLocaleCompare: false, // replace equivalent character (accented characters)\n\t\t\tsortReset : false, // third click on the header will reset column to default - unsorted\n\t\t\tsortRestart : false, // restart sort to 'sortInitialOrder' when clicking on previously unsorted columns\n\n\t\t\temptyTo : 'bottom', // sort empty cell to bottom, top, none, zero, emptyMax, emptyMin\n\t\t\tstringTo : 'max', // sort strings in numerical column as max, min, top, bottom, zero\n\t\t\tduplicateSpan : true, // colspan cells in the tbody will have duplicated content in the cache for each spanned column\n\t\t\ttextExtraction : 'basic', // text extraction method/function - function( node, table, cellIndex ) {}\n\t\t\ttextAttribute : 'data-text',// data-attribute that contains alternate cell text (used in default textExtraction function)\n\t\t\ttextSorter : null, // choose overall or specific column sorter function( a, b, direction, table, columnIndex ) [alt: ts.sortText]\n\t\t\tnumberSorter : null, // choose overall numeric sorter function( a, b, direction, maxColumnValue )\n\n\t\t\t// *** widget options\n\t\t\tinitWidgets : true, // apply widgets on tablesorter initialization\n\t\t\twidgetClass : 'widget-{name}', // table class name template to match to include a widget\n\t\t\twidgets : [], // method to add widgets, e.g. widgets: ['zebra']\n\t\t\twidgetOptions : {\n\t\t\t\tzebra : [ 'even', 'odd' ] // zebra widget alternating row class names\n\t\t\t},\n\n\t\t\t// *** callbacks\n\t\t\tinitialized : null, // function( table ) {},\n\n\t\t\t// *** extra css class names\n\t\t\ttableClass : '',\n\t\t\tcssAsc : '',\n\t\t\tcssDesc : '',\n\t\t\tcssNone : '',\n\t\t\tcssHeader : '',\n\t\t\tcssHeaderRow : '',\n\t\t\tcssProcessing : '', // processing icon applied to header during sort/filter\n\n\t\t\tcssChildRow : 'tablesorter-childRow', // class name indiciating that a row is to be attached to its parent\n\t\t\tcssInfoBlock : 'tablesorter-infoOnly', // don't sort tbody with this class name (only one class name allowed here!)\n\t\t\tcssNoSort : 'tablesorter-noSort', // class name added to element inside header; clicking on it won't cause a sort\n\t\t\tcssIgnoreRow : 'tablesorter-ignoreRow',// header row to ignore; cells within this row will not be added to c.$headers\n\n\t\t\tcssIcon : 'tablesorter-icon', // if this class does not exist, the {icon} will not be added from the headerTemplate\n\t\t\tcssIconNone : '', // class name added to the icon when there is no column sort\n\t\t\tcssIconAsc : '', // class name added to the icon when the column has an ascending sort\n\t\t\tcssIconDesc : '', // class name added to the icon when the column has a descending sort\n\t\t\tcssIconDisabled : '', // class name added to the icon when the column has a disabled sort\n\n\t\t\t// *** events\n\t\t\tpointerClick : 'click',\n\t\t\tpointerDown : 'mousedown',\n\t\t\tpointerUp : 'mouseup',\n\n\t\t\t// *** selectors\n\t\t\tselectorHeaders : '> thead th, > thead td',\n\t\t\tselectorSort : 'th, td', // jQuery selector of content within selectorHeaders that is clickable to trigger a sort\n\t\t\tselectorRemove : '.remove-me',\n\n\t\t\t// *** advanced\n\t\t\tdebug : false,\n\n\t\t\t// *** Internal variables\n\t\t\theaderList: [],\n\t\t\tempties: {},\n\t\t\tstrings: {},\n\t\t\tparsers: [],\n\n\t\t\t// *** parser options for validator; values must be falsy!\n\t\t\tglobalize: 0,\n\t\t\timgAttr: 0\n\n\t\t\t// removed: widgetZebra: { css: ['even', 'odd'] }\n\n\t\t},\n\n\t\t// internal css classes - these will ALWAYS be added to\n\t\t// the table and MUST only contain one class name - fixes #381\n\t\tcss : {\n\t\t\ttable : 'tablesorter',\n\t\t\tcssHasChild: 'tablesorter-hasChildRow',\n\t\t\tchildRow : 'tablesorter-childRow',\n\t\t\tcolgroup : 'tablesorter-colgroup',\n\t\t\theader : 'tablesorter-header',\n\t\t\theaderRow : 'tablesorter-headerRow',\n\t\t\theaderIn : 'tablesorter-header-inner',\n\t\t\ticon : 'tablesorter-icon',\n\t\t\tprocessing : 'tablesorter-processing',\n\t\t\tsortAsc : 'tablesorter-headerAsc',\n\t\t\tsortDesc : 'tablesorter-headerDesc',\n\t\t\tsortNone : 'tablesorter-headerUnSorted'\n\t\t},\n\n\t\t// labels applied to sortable headers for accessibility (aria) support\n\t\tlanguage : {\n\t\t\tsortAsc : 'Ascending sort applied, ',\n\t\t\tsortDesc : 'Descending sort applied, ',\n\t\t\tsortNone : 'No sort applied, ',\n\t\t\tsortDisabled : 'sorting is disabled',\n\t\t\tnextAsc : 'activate to apply an ascending sort',\n\t\t\tnextDesc : 'activate to apply a descending sort',\n\t\t\tnextNone : 'activate to remove the sort'\n\t\t},\n\n\t\tregex : {\n\t\t\ttemplateContent : /\\{content\\}/g,\n\t\t\ttemplateIcon : /\\{icon\\}/g,\n\t\t\ttemplateName : /\\{name\\}/i,\n\t\t\tspaces : /\\s+/g,\n\t\t\tnonWord : /\\W/g,\n\t\t\tformElements : /(input|select|button|textarea)/i,\n\n\t\t\t// *** sort functions ***\n\t\t\t// regex used in natural sort\n\t\t\t// chunk/tokenize numbers & letters\n\t\t\tchunk : /(^([+\\-]?(?:\\d*)(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?)?$|^0x[0-9a-f]+$|\\d+)/gi,\n\t\t\t// replace chunks @ ends\n\t\t\tchunks : /(^\\\\0|\\\\0$)/,\n\t\t\thex : /^0x[0-9a-f]+$/i,\n\n\t\t\t// *** formatFloat ***\n\t\t\tcomma : /,/g,\n\t\t\tdigitNonUS : /[\\s|\\.]/g,\n\t\t\tdigitNegativeTest : /^\\s*\\([.\\d]+\\)/,\n\t\t\tdigitNegativeReplace : /^\\s*\\(([.\\d]+)\\)/,\n\n\t\t\t// *** isDigit ***\n\t\t\tdigitTest : /^[\\-+(]?\\d+[)]?$/,\n\t\t\tdigitReplace : /[,.'\"\\s]/g\n\n\t\t},\n\n\t\t// digit sort, text location\n\t\tstring : {\n\t\t\tmax : 1,\n\t\t\tmin : -1,\n\t\t\temptymin : 1,\n\t\t\temptymax : -1,\n\t\t\tzero : 0,\n\t\t\tnone : 0,\n\t\t\t'null' : 0,\n\t\t\ttop : true,\n\t\t\tbottom : false\n\t\t},\n\n\t\tkeyCodes : {\n\t\t\tenter : 13\n\t\t},\n\n\t\t// placeholder date parser data (globalize)\n\t\tdates : {},\n\n\t\t// These methods can be applied on table.config instance\n\t\tinstanceMethods : {},\n\n\t\t/*\n\t\t▄█████ ██████ ██████ ██ ██ █████▄\n\t\t▀█▄ ██▄▄ ██ ██ ██ ██▄▄██\n\t\t ▀█▄ ██▀▀ ██ ██ ██ ██▀▀▀\n\t\t█████▀ ██████ ██ ▀████▀ ██\n\t\t*/\n\n\t\tsetup : function( table, c ) {\n\t\t\t// if no thead or tbody, or tablesorter is already present, quit\n\t\t\tif ( !table || !table.tHead || table.tBodies.length === 0 || table.hasInitialized === true ) {\n\t\t\t\tif ( ts.debug(c, 'core') ) {\n\t\t\t\t\tif ( table.hasInitialized ) {\n\t\t\t\t\t\tconsole.warn( 'Stopping initialization. Tablesorter has already been initialized' );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconsole.error( 'Stopping initialization! No table, thead or tbody', table );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar tmp = '',\n\t\t\t\t$table = $( table ),\n\t\t\t\tmeta = $.metadata;\n\t\t\t// initialization flag\n\t\t\ttable.hasInitialized = false;\n\t\t\t// table is being processed flag\n\t\t\ttable.isProcessing = true;\n\t\t\t// make sure to store the config object\n\t\t\ttable.config = c;\n\t\t\t// save the settings where they read\n\t\t\t$.data( table, 'tablesorter', c );\n\t\t\tif ( ts.debug(c, 'core') ) {\n\t\t\t\tconsole[ console.group ? 'group' : 'log' ]( 'Initializing tablesorter v' + ts.version );\n\t\t\t\t$.data( table, 'startoveralltimer', new Date() );\n\t\t\t}\n\n\t\t\t// removing this in version 3 (only supports jQuery 1.7+)\n\t\t\tc.supportsDataObject = ( function( version ) {\n\t\t\t\tversion[ 0 ] = parseInt( version[ 0 ], 10 );\n\t\t\t\treturn ( version[ 0 ] > 1 ) || ( version[ 0 ] === 1 && parseInt( version[ 1 ], 10 ) >= 4 );\n\t\t\t})( $.fn.jquery.split( '.' ) );\n\t\t\t// ensure case insensitivity\n\t\t\tc.emptyTo = c.emptyTo.toLowerCase();\n\t\t\tc.stringTo = c.stringTo.toLowerCase();\n\t\t\tc.last = { sortList : [], clickedIndex : -1 };\n\t\t\t// add table theme class only if there isn't already one there\n\t\t\tif ( !/tablesorter\\-/.test( $table.attr( 'class' ) ) ) {\n\t\t\t\ttmp = ( c.theme !== '' ? ' tablesorter-' + c.theme : '' );\n\t\t\t}\n\n\t\t\t// give the table a unique id, which will be used in namespace binding\n\t\t\tif ( !c.namespace ) {\n\t\t\t\tc.namespace = '.tablesorter' + Math.random().toString( 16 ).slice( 2 );\n\t\t\t} else {\n\t\t\t\t// make sure namespace starts with a period & doesn't have weird characters\n\t\t\t\tc.namespace = '.' + c.namespace.replace( ts.regex.nonWord, '' );\n\t\t\t}\n\n\t\t\tc.table = table;\n\t\t\tc.$table = $table\n\t\t\t\t// add namespace to table to allow bindings on extra elements to target\n\t\t\t\t// the parent table (e.g. parser-input-select)\n\t\t\t\t.addClass( ts.css.table + ' ' + c.tableClass + tmp + ' ' + c.namespace.slice(1) )\n\t\t\t\t.attr( 'role', 'grid' );\n\t\t\tc.$headers = $table.find( c.selectorHeaders );\n\n\t\t\tc.$table.children().children( 'tr' ).attr( 'role', 'row' );\n\t\t\tc.$tbodies = $table.children( 'tbody:not(.' + c.cssInfoBlock + ')' ).attr({\n\t\t\t\t'aria-live' : 'polite',\n\t\t\t\t'aria-relevant' : 'all'\n\t\t\t});\n\t\t\tif ( c.$table.children( 'caption' ).length ) {\n\t\t\t\ttmp = c.$table.children( 'caption' )[ 0 ];\n\t\t\t\tif ( !tmp.id ) { tmp.id = c.namespace.slice( 1 ) + 'caption'; }\n\t\t\t\tc.$table.attr( 'aria-labelledby', tmp.id );\n\t\t\t}\n\t\t\tc.widgetInit = {}; // keep a list of initialized widgets\n\t\t\t// change textExtraction via data-attribute\n\t\t\tc.textExtraction = c.$table.attr( 'data-text-extraction' ) || c.textExtraction || 'basic';\n\t\t\t// build headers\n\t\t\tts.buildHeaders( c );\n\t\t\t// fixate columns if the users supplies the fixedWidth option\n\t\t\t// do this after theme has been applied\n\t\t\tts.fixColumnWidth( table );\n\t\t\t// add widgets from class name\n\t\t\tts.addWidgetFromClass( table );\n\t\t\t// add widget options before parsing (e.g. grouping widget has parser settings)\n\t\t\tts.applyWidgetOptions( table );\n\t\t\t// try to auto detect column type, and store in tables config\n\t\t\tts.setupParsers( c );\n\t\t\t// start total row count at zero\n\t\t\tc.totalRows = 0;\n\t\t\t// only validate options while debugging. See #1528\n\t\t\tif (c.debug) {\n\t\t\t\tts.validateOptions( c );\n\t\t\t}\n\t\t\t// build the cache for the tbody cells\n\t\t\t// delayInit will delay building the cache until the user starts a sort\n\t\t\tif ( !c.delayInit ) { ts.buildCache( c ); }\n\t\t\t// bind all header events and methods\n\t\t\tts.bindEvents( table, c.$headers, true );\n\t\t\tts.bindMethods( c );\n\t\t\t// get sort list from jQuery data or metadata\n\t\t\t// in jQuery < 1.4, an error occurs when calling $table.data()\n\t\t\tif ( c.supportsDataObject && typeof $table.data().sortlist !== 'undefined' ) {\n\t\t\t\tc.sortList = $table.data().sortlist;\n\t\t\t} else if ( meta && ( $table.metadata() && $table.metadata().sortlist ) ) {\n\t\t\t\tc.sortList = $table.metadata().sortlist;\n\t\t\t}\n\t\t\t// apply widget init code\n\t\t\tts.applyWidget( table, true );\n\t\t\t// if user has supplied a sort list to constructor\n\t\t\tif ( c.sortList.length > 0 ) {\n\t\t\t\tts.sortOn( c, c.sortList, {}, !c.initWidgets );\n\t\t\t} else {\n\t\t\t\tts.setHeadersCss( c );\n\t\t\t\tif ( c.initWidgets ) {\n\t\t\t\t\t// apply widget format\n\t\t\t\t\tts.applyWidget( table, false );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// show processesing icon\n\t\t\tif ( c.showProcessing ) {\n\t\t\t\t$table\n\t\t\t\t.unbind( 'sortBegin' + c.namespace + ' sortEnd' + c.namespace )\n\t\t\t\t.bind( 'sortBegin' + c.namespace + ' sortEnd' + c.namespace, function( e ) {\n\t\t\t\t\tclearTimeout( c.timerProcessing );\n\t\t\t\t\tts.isProcessing( table );\n\t\t\t\t\tif ( e.type === 'sortBegin' ) {\n\t\t\t\t\t\tc.timerProcessing = setTimeout( function() {\n\t\t\t\t\t\t\tts.isProcessing( table, true );\n\t\t\t\t\t\t}, 500 );\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// initialized\n\t\t\ttable.hasInitialized = true;\n\t\t\ttable.isProcessing = false;\n\t\t\tif ( ts.debug(c, 'core') ) {\n\t\t\t\tconsole.log( 'Overall initialization time:' + ts.benchmark( $.data( table, 'startoveralltimer' ) ) );\n\t\t\t\tif ( ts.debug(c, 'core') && console.groupEnd ) { console.groupEnd(); }\n\t\t\t}\n\t\t\t$table.triggerHandler( 'tablesorter-initialized', table );\n\t\t\tif ( typeof c.initialized === 'function' ) {\n\t\t\t\tc.initialized( table );\n\t\t\t}\n\t\t},\n\n\t\tbindMethods : function( c ) {\n\t\t\tvar $table = c.$table,\n\t\t\t\tnamespace = c.namespace,\n\t\t\t\tevents = ( 'sortReset update updateRows updateAll updateHeaders addRows updateCell updateComplete ' +\n\t\t\t\t\t'sorton appendCache updateCache applyWidgetId applyWidgets refreshWidgets destroy mouseup ' +\n\t\t\t\t\t'mouseleave ' ).split( ' ' )\n\t\t\t\t\t.join( namespace + ' ' );\n\t\t\t// apply easy methods that trigger bound events\n\t\t\t$table\n\t\t\t.unbind( events.replace( ts.regex.spaces, ' ' ) )\n\t\t\t.bind( 'sortReset' + namespace, function( e, callback ) {\n\t\t\t\te.stopPropagation();\n\t\t\t\t// using this.config to ensure functions are getting a non-cached version of the config\n\t\t\t\tts.sortReset( this.config, function( table ) {\n\t\t\t\t\tif (table.isApplyingWidgets) {\n\t\t\t\t\t\t// multiple triggers in a row... filterReset, then sortReset - see #1361\n\t\t\t\t\t\t// wait to update widgets\n\t\t\t\t\t\tsetTimeout( function() {\n\t\t\t\t\t\t\tts.applyWidget( table, '', callback );\n\t\t\t\t\t\t}, 100 );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tts.applyWidget( table, '', callback );\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t})\n\t\t\t.bind( 'updateAll' + namespace, function( e, resort, callback ) {\n\t\t\t\te.stopPropagation();\n\t\t\t\tts.updateAll( this.config, resort, callback );\n\t\t\t})\n\t\t\t.bind( 'update' + namespace + ' updateRows' + namespace, function( e, resort, callback ) {\n\t\t\t\te.stopPropagation();\n\t\t\t\tts.update( this.config, resort, callback );\n\t\t\t})\n\t\t\t.bind( 'updateHeaders' + namespace, function( e, callback ) {\n\t\t\t\te.stopPropagation();\n\t\t\t\tts.updateHeaders( this.config, callback );\n\t\t\t})\n\t\t\t.bind( 'updateCell' + namespace, function( e, cell, resort, callback ) {\n\t\t\t\te.stopPropagation();\n\t\t\t\tts.updateCell( this.config, cell, resort, callback );\n\t\t\t})\n\t\t\t.bind( 'addRows' + namespace, function( e, $row, resort, callback ) {\n\t\t\t\te.stopPropagation();\n\t\t\t\tts.addRows( this.config, $row, resort, callback );\n\t\t\t})\n\t\t\t.bind( 'updateComplete' + namespace, function() {\n\t\t\t\tthis.isUpdating = false;\n\t\t\t})\n\t\t\t.bind( 'sorton' + namespace, function( e, list, callback, init ) {\n\t\t\t\te.stopPropagation();\n\t\t\t\tts.sortOn( this.config, list, callback, init );\n\t\t\t})\n\t\t\t.bind( 'appendCache' + namespace, function( e, callback, init ) {\n\t\t\t\te.stopPropagation();\n\t\t\t\tts.appendCache( this.config, init );\n\t\t\t\tif ( $.isFunction( callback ) ) {\n\t\t\t\t\tcallback( this );\n\t\t\t\t}\n\t\t\t})\n\t\t\t// $tbodies variable is used by the tbody sorting widget\n\t\t\t.bind( 'updateCache' + namespace, function( e, callback, $tbodies ) {\n\t\t\t\te.stopPropagation();\n\t\t\t\tts.updateCache( this.config, callback, $tbodies );\n\t\t\t})\n\t\t\t.bind( 'applyWidgetId' + namespace, function( e, id ) {\n\t\t\t\te.stopPropagation();\n\t\t\t\tts.applyWidgetId( this, id );\n\t\t\t})\n\t\t\t.bind( 'applyWidgets' + namespace, function( e, callback ) {\n\t\t\t\te.stopPropagation();\n\t\t\t\t// apply widgets (false = not initializing)\n\t\t\t\tts.applyWidget( this, false, callback );\n\t\t\t})\n\t\t\t.bind( 'refreshWidgets' + namespace, function( e, all, dontapply ) {\n\t\t\t\te.stopPropagation();\n\t\t\t\tts.refreshWidgets( this, all, dontapply );\n\t\t\t})\n\t\t\t.bind( 'removeWidget' + namespace, function( e, name, refreshing ) {\n\t\t\t\te.stopPropagation();\n\t\t\t\tts.removeWidget( this, name, refreshing );\n\t\t\t})\n\t\t\t.bind( 'destroy' + namespace, function( e, removeClasses, callback ) {\n\t\t\t\te.stopPropagation();\n\t\t\t\tts.destroy( this, removeClasses, callback );\n\t\t\t})\n\t\t\t.bind( 'resetToLoadState' + namespace, function( e ) {\n\t\t\t\te.stopPropagation();\n\t\t\t\t// remove all widgets\n\t\t\t\tts.removeWidget( this, true, false );\n\t\t\t\tvar tmp = $.extend( true, {}, c.originalSettings );\n\t\t\t\t// restore original settings; this clears out current settings, but does not clear\n\t\t\t\t// values saved to storage.\n\t\t\t\tc = $.extend( true, {}, ts.defaults, tmp );\n\t\t\t\tc.originalSettings = tmp;\n\t\t\t\tthis.hasInitialized = false;\n\t\t\t\t// setup the entire table again\n\t\t\t\tts.setup( this, c );\n\t\t\t});\n\t\t},\n\n\t\tbindEvents : function( table, $headers, core ) {\n\t\t\ttable = $( table )[ 0 ];\n\t\t\tvar tmp,\n\t\t\t\tc = table.config,\n\t\t\t\tnamespace = c.namespace,\n\t\t\t\tdownTarget = null;\n\t\t\tif ( core !== true ) {\n\t\t\t\t$headers.addClass( namespace.slice( 1 ) + '_extra_headers' );\n\t\t\t\ttmp = ts.getClosest( $headers, 'table' );\n\t\t\t\tif ( tmp.length && tmp[ 0 ].nodeName === 'TABLE' && tmp[ 0 ] !== table ) {\n\t\t\t\t\t$( tmp[ 0 ] ).addClass( namespace.slice( 1 ) + '_extra_table' );\n\t\t\t\t}\n\t\t\t}\n\t\t\ttmp = ( c.pointerDown + ' ' + c.pointerUp + ' ' + c.pointerClick + ' sort keyup ' )\n\t\t\t\t.replace( ts.regex.spaces, ' ' )\n\t\t\t\t.split( ' ' )\n\t\t\t\t.join( namespace + ' ' );\n\t\t\t// apply event handling to headers and/or additional headers (stickyheaders, scroller, etc)\n\t\t\t$headers\n\t\t\t// http://stackoverflow.com/questions/5312849/jquery-find-self;\n\t\t\t.find( c.selectorSort )\n\t\t\t.add( $headers.filter( c.selectorSort ) )\n\t\t\t.unbind( tmp )\n\t\t\t.bind( tmp, function( e, external ) {\n\t\t\t\tvar $cell, cell, temp,\n\t\t\t\t\t$target = $( e.target ),\n\t\t\t\t\t// wrap event type in spaces, so the match doesn't trigger on inner words\n\t\t\t\t\ttype = ' ' + e.type + ' ';\n\t\t\t\t// only recognize left clicks\n\t\t\t\tif ( ( ( e.which || e.button ) !== 1 && !type.match( ' ' + c.pointerClick + ' | sort | keyup ' ) ) ||\n\t\t\t\t\t// allow pressing enter\n\t\t\t\t\t( type === ' keyup ' && e.which !== ts.keyCodes.enter ) ||\n\t\t\t\t\t// allow triggering a click event (e.which is undefined) & ignore physical clicks\n\t\t\t\t\t( type.match( ' ' + c.pointerClick + ' ' ) && typeof e.which !== 'undefined' ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// ignore mouseup if mousedown wasn't on the same target\n\t\t\t\tif ( type.match( ' ' + c.pointerUp + ' ' ) && downTarget !== e.target && external !== true ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// set target on mousedown\n\t\t\t\tif ( type.match( ' ' + c.pointerDown + ' ' ) ) {\n\t\t\t\t\tdownTarget = e.target;\n\t\t\t\t\t// preventDefault needed or jQuery v1.3.2 and older throws an\n\t\t\t\t\t// \"Uncaught TypeError: handler.apply is not a function\" error\n\t\t\t\t\ttemp = $target.jquery.split( '.' );\n\t\t\t\t\tif ( temp[ 0 ] === '1' && temp[ 1 ] < 4 ) { e.preventDefault(); }\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tdownTarget = null;\n\t\t\t\t// prevent sort being triggered on form elements\n\t\t\t\tif ( ts.regex.formElements.test( e.target.nodeName ) ||\n\t\t\t\t\t// nosort class name, or elements within a nosort container\n\t\t\t\t\t$target.hasClass( c.cssNoSort ) || $target.parents( '.' + c.cssNoSort ).length > 0 ||\n\t\t\t\t\t// elements within a button\n\t\t\t\t\t$target.parents( 'button' ).length > 0 ) {\n\t\t\t\t\treturn !c.cancelSelection;\n\t\t\t\t}\n\t\t\t\tif ( c.delayInit && ts.isEmptyObject( c.cache ) ) {\n\t\t\t\t\tts.buildCache( c );\n\t\t\t\t}\n\t\t\t\t$cell = ts.getClosest( $( this ), '.' + ts.css.header );\n\t\t\t\t// reference original table headers and find the same cell\n\t\t\t\t// don't use $headers or IE8 throws an error - see #987\n\t\t\t\ttemp = $headers.index( $cell );\n\t\t\t\tc.last.clickedIndex = ( temp < 0 ) ? $cell.attr( 'data-column' ) : temp;\n\t\t\t\t// use column index if $headers is undefined\n\t\t\t\tcell = c.$headers[ c.last.clickedIndex ];\n\t\t\t\tif ( cell && !cell.sortDisabled ) {\n\t\t\t\t\tts.initSort( c, cell, e );\n\t\t\t\t}\n\t\t\t});\n\t\t\tif ( c.cancelSelection ) {\n\t\t\t\t// cancel selection\n\t\t\t\t$headers\n\t\t\t\t\t.attr( 'unselectable', 'on' )\n\t\t\t\t\t.bind( 'selectstart', false )\n\t\t\t\t\t.css({\n\t\t\t\t\t\t'user-select' : 'none',\n\t\t\t\t\t\t'MozUserSelect' : 'none' // not needed for jQuery 1.8+\n\t\t\t\t\t});\n\t\t\t}\n\t\t},\n\n\t\tbuildHeaders : function( c ) {\n\t\t\tvar $temp, icon, timer, indx;\n\t\t\tc.headerList = [];\n\t\t\tc.headerContent = [];\n\t\t\tc.sortVars = [];\n\t\t\tif ( ts.debug(c, 'core') ) {\n\t\t\t\ttimer = new Date();\n\t\t\t}\n\t\t\t// children tr in tfoot - see issue #196 & #547\n\t\t\t// don't pass table.config to computeColumnIndex here - widgets (math) pass it to \"quickly\" index tbody cells\n\t\t\tc.columns = ts.computeColumnIndex( c.$table.children( 'thead, tfoot' ).children( 'tr' ) );\n\t\t\t// add icon if cssIcon option exists\n\t\t\ticon = c.cssIcon ?\n\t\t\t\t'' :\n\t\t\t\t'';\n\t\t\t// redefine c.$headers here in case of an updateAll that replaces or adds an entire header cell - see #683\n\t\t\tc.$headers = $( $.map( c.$table.find( c.selectorHeaders ), function( elem, index ) {\n\t\t\t\tvar configHeaders, header, column, template, tmp,\n\t\t\t\t\t$elem = $( elem );\n\t\t\t\t// ignore cell (don't add it to c.$headers) if row has ignoreRow class\n\t\t\t\tif ( ts.getClosest( $elem, 'tr' ).hasClass( c.cssIgnoreRow ) ) { return; }\n\t\t\t\t// transfer data-column to element if not th/td - #1459\n\t\t\t\tif ( !/(th|td)/i.test( elem.nodeName ) ) {\n\t\t\t\t\ttmp = ts.getClosest( $elem, 'th, td' );\n\t\t\t\t\t$elem.attr( 'data-column', tmp.attr( 'data-column' ) );\n\t\t\t\t}\n\t\t\t\t// make sure to get header cell & not column indexed cell\n\t\t\t\tconfigHeaders = ts.getColumnData( c.table, c.headers, index, true );\n\t\t\t\t// save original header content\n\t\t\t\tc.headerContent[ index ] = $elem.html();\n\t\t\t\t// if headerTemplate is empty, don't reformat the header cell\n\t\t\t\tif ( c.headerTemplate !== '' && !$elem.find( '.' + ts.css.headerIn ).length ) {\n\t\t\t\t\t// set up header template\n\t\t\t\t\ttemplate = c.headerTemplate\n\t\t\t\t\t\t.replace( ts.regex.templateContent, $elem.html() )\n\t\t\t\t\t\t.replace( ts.regex.templateIcon, $elem.find( '.' + ts.css.icon ).length ? '' : icon );\n\t\t\t\t\tif ( c.onRenderTemplate ) {\n\t\t\t\t\t\theader = c.onRenderTemplate.apply( $elem, [ index, template ] );\n\t\t\t\t\t\t// only change t if something is returned\n\t\t\t\t\t\tif ( header && typeof header === 'string' ) {\n\t\t\t\t\t\t\ttemplate = header;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t$elem.html( '' + template + '
' ); // faster than wrapInner\n\t\t\t\t}\n\t\t\t\tif ( c.onRenderHeader ) {\n\t\t\t\t\tc.onRenderHeader.apply( $elem, [ index, c, c.$table ] );\n\t\t\t\t}\n\t\t\t\tcolumn = parseInt( $elem.attr( 'data-column' ), 10 );\n\t\t\t\telem.column = column;\n\t\t\t\ttmp = ts.getOrder( ts.getData( $elem, configHeaders, 'sortInitialOrder' ) || c.sortInitialOrder );\n\t\t\t\t// this may get updated numerous times if there are multiple rows\n\t\t\t\tc.sortVars[ column ] = {\n\t\t\t\t\tcount : -1, // set to -1 because clicking on the header automatically adds one\n\t\t\t\t\torder: tmp ?\n\t\t\t\t\t\t( c.sortReset ? [ 1, 0, 2 ] : [ 1, 0 ] ) : // desc, asc, unsorted\n\t\t\t\t\t\t( c.sortReset ? [ 0, 1, 2 ] : [ 0, 1 ] ), // asc, desc, unsorted\n\t\t\t\t\tlockedOrder : false\n\t\t\t\t};\n\t\t\t\ttmp = ts.getData( $elem, configHeaders, 'lockedOrder' ) || false;\n\t\t\t\tif ( typeof tmp !== 'undefined' && tmp !== false ) {\n\t\t\t\t\tc.sortVars[ column ].lockedOrder = true;\n\t\t\t\t\tc.sortVars[ column ].order = ts.getOrder( tmp ) ? [ 1, 1 ] : [ 0, 0 ];\n\t\t\t\t}\n\t\t\t\t// add cell to headerList\n\t\t\t\tc.headerList[ index ] = elem;\n\t\t\t\t$elem.addClass( ts.css.header + ' ' + c.cssHeader );\n\t\t\t\t// add to parent in case there are multiple rows\n\t\t\t\tts.getClosest( $elem, 'tr' )\n\t\t\t\t\t.addClass( ts.css.headerRow + ' ' + c.cssHeaderRow )\n\t\t\t\t\t.attr( 'role', 'row' );\n\t\t\t\t// allow keyboard cursor to focus on element\n\t\t\t\tif ( c.tabIndex ) {\n\t\t\t\t\t$elem.attr( 'tabindex', 0 );\n\t\t\t\t}\n\t\t\t\treturn elem;\n\t\t\t}) );\n\t\t\t// cache headers per column\n\t\t\tc.$headerIndexed = [];\n\t\t\tfor ( indx = 0; indx < c.columns; indx++ ) {\n\t\t\t\t// colspan in header making a column undefined\n\t\t\t\tif ( ts.isEmptyObject( c.sortVars[ indx ] ) ) {\n\t\t\t\t\tc.sortVars[ indx ] = {};\n\t\t\t\t}\n\t\t\t\t// Use c.$headers.parent() in case selectorHeaders doesn't point to the th/td\n\t\t\t\t$temp = c.$headers.filter( '[data-column=\"' + indx + '\"]' );\n\t\t\t\t// target sortable column cells, unless there are none, then use non-sortable cells\n\t\t\t\t// .last() added in jQuery 1.4; use .filter(':last') to maintain compatibility with jQuery v1.2.6\n\t\t\t\tc.$headerIndexed[ indx ] = $temp.length ?\n\t\t\t\t\t$temp.not( '.sorter-false' ).length ?\n\t\t\t\t\t\t$temp.not( '.sorter-false' ).filter( ':last' ) :\n\t\t\t\t\t\t$temp.filter( ':last' ) :\n\t\t\t\t\t$();\n\t\t\t}\n\t\t\tc.$table.find( c.selectorHeaders ).attr({\n\t\t\t\tscope: 'col',\n\t\t\t\trole : 'columnheader'\n\t\t\t});\n\t\t\t// enable/disable sorting\n\t\t\tts.updateHeader( c );\n\t\t\tif ( ts.debug(c, 'core') ) {\n\t\t\t\tconsole.log( 'Built headers:' + ts.benchmark( timer ) );\n\t\t\t\tconsole.log( c.$headers );\n\t\t\t}\n\t\t},\n\n\t\t// Use it to add a set of methods to table.config which will be available for all tables.\n\t\t// This should be done before table initialization\n\t\taddInstanceMethods : function( methods ) {\n\t\t\t$.extend( ts.instanceMethods, methods );\n\t\t},\n\n\t\t/*\n\t\t█████▄ ▄████▄ █████▄ ▄█████ ██████ █████▄ ▄█████\n\t\t██▄▄██ ██▄▄██ ██▄▄██ ▀█▄ ██▄▄ ██▄▄██ ▀█▄\n\t\t██▀▀▀ ██▀▀██ ██▀██ ▀█▄ ██▀▀ ██▀██ ▀█▄\n\t\t██ ██ ██ ██ ██ █████▀ ██████ ██ ██ █████▀\n\t\t*/\n\t\tsetupParsers : function( c, $tbodies ) {\n\t\t\tvar rows, list, span, max, colIndex, indx, header, configHeaders,\n\t\t\t\tnoParser, parser, extractor, time, tbody, len,\n\t\t\t\ttable = c.table,\n\t\t\t\ttbodyIndex = 0,\n\t\t\t\tdebug = ts.debug(c, 'core'),\n\t\t\t\tdebugOutput = {};\n\t\t\t// update table bodies in case we start with an empty table\n\t\t\tc.$tbodies = c.$table.children( 'tbody:not(.' + c.cssInfoBlock + ')' );\n\t\t\ttbody = typeof $tbodies === 'undefined' ? c.$tbodies : $tbodies;\n\t\t\tlen = tbody.length;\n\t\t\tif ( len === 0 ) {\n\t\t\t\treturn debug ? console.warn( 'Warning: *Empty table!* Not building a parser cache' ) : '';\n\t\t\t} else if ( debug ) {\n\t\t\t\ttime = new Date();\n\t\t\t\tconsole[ console.group ? 'group' : 'log' ]( 'Detecting parsers for each column' );\n\t\t\t}\n\t\t\tlist = {\n\t\t\t\textractors: [],\n\t\t\t\tparsers: []\n\t\t\t};\n\t\t\twhile ( tbodyIndex < len ) {\n\t\t\t\trows = tbody[ tbodyIndex ].rows;\n\t\t\t\tif ( rows.length ) {\n\t\t\t\t\tcolIndex = 0;\n\t\t\t\t\tmax = c.columns;\n\t\t\t\t\tfor ( indx = 0; indx < max; indx++ ) {\n\t\t\t\t\t\theader = c.$headerIndexed[ colIndex ];\n\t\t\t\t\t\tif ( header && header.length ) {\n\t\t\t\t\t\t\t// get column indexed table cell; adding true parameter fixes #1362 but\n\t\t\t\t\t\t\t// it would break backwards compatibility...\n\t\t\t\t\t\t\tconfigHeaders = ts.getColumnData( table, c.headers, colIndex ); // , true );\n\t\t\t\t\t\t\t// get column parser/extractor\n\t\t\t\t\t\t\textractor = ts.getParserById( ts.getData( header, configHeaders, 'extractor' ) );\n\t\t\t\t\t\t\tparser = ts.getParserById( ts.getData( header, configHeaders, 'sorter' ) );\n\t\t\t\t\t\t\tnoParser = ts.getData( header, configHeaders, 'parser' ) === 'false';\n\t\t\t\t\t\t\t// empty cells behaviour - keeping emptyToBottom for backwards compatibility\n\t\t\t\t\t\t\tc.empties[colIndex] = (\n\t\t\t\t\t\t\t\tts.getData( header, configHeaders, 'empty' ) ||\n\t\t\t\t\t\t\t\tc.emptyTo || ( c.emptyToBottom ? 'bottom' : 'top' ) ).toLowerCase();\n\t\t\t\t\t\t\t// text strings behaviour in numerical sorts\n\t\t\t\t\t\t\tc.strings[colIndex] = (\n\t\t\t\t\t\t\t\tts.getData( header, configHeaders, 'string' ) ||\n\t\t\t\t\t\t\t\tc.stringTo ||\n\t\t\t\t\t\t\t\t'max' ).toLowerCase();\n\t\t\t\t\t\t\tif ( noParser ) {\n\t\t\t\t\t\t\t\tparser = ts.getParserById( 'no-parser' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif ( !extractor ) {\n\t\t\t\t\t\t\t\t// For now, maybe detect someday\n\t\t\t\t\t\t\t\textractor = false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif ( !parser ) {\n\t\t\t\t\t\t\t\tparser = ts.detectParserForColumn( c, rows, -1, colIndex );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif ( debug ) {\n\t\t\t\t\t\t\t\tdebugOutput[ '(' + colIndex + ') ' + header.text() ] = {\n\t\t\t\t\t\t\t\t\tparser : parser.id,\n\t\t\t\t\t\t\t\t\textractor : extractor ? extractor.id : 'none',\n\t\t\t\t\t\t\t\t\tstring : c.strings[ colIndex ],\n\t\t\t\t\t\t\t\t\tempty : c.empties[ colIndex ]\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tlist.parsers[ colIndex ] = parser;\n\t\t\t\t\t\t\tlist.extractors[ colIndex ] = extractor;\n\t\t\t\t\t\t\tspan = header[ 0 ].colSpan - 1;\n\t\t\t\t\t\t\tif ( span > 0 ) {\n\t\t\t\t\t\t\t\tcolIndex += span;\n\t\t\t\t\t\t\t\tmax += span;\n\t\t\t\t\t\t\t\twhile ( span + 1 > 0 ) {\n\t\t\t\t\t\t\t\t\t// set colspan columns to use the same parsers & extractors\n\t\t\t\t\t\t\t\t\tlist.parsers[ colIndex - span ] = parser;\n\t\t\t\t\t\t\t\t\tlist.extractors[ colIndex - span ] = extractor;\n\t\t\t\t\t\t\t\t\tspan--;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcolIndex++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ttbodyIndex += ( list.parsers.length ) ? len : 1;\n\t\t\t}\n\t\t\tif ( debug ) {\n\t\t\t\tif ( !ts.isEmptyObject( debugOutput ) ) {\n\t\t\t\t\tconsole[ console.table ? 'table' : 'log' ]( debugOutput );\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn( ' No parsers detected!' );\n\t\t\t\t}\n\t\t\t\tconsole.log( 'Completed detecting parsers' + ts.benchmark( time ) );\n\t\t\t\tif ( console.groupEnd ) { console.groupEnd(); }\n\t\t\t}\n\t\t\tc.parsers = list.parsers;\n\t\t\tc.extractors = list.extractors;\n\t\t},\n\n\t\taddParser : function( parser ) {\n\t\t\tvar indx,\n\t\t\t\tlen = ts.parsers.length,\n\t\t\t\tadd = true;\n\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\tif ( ts.parsers[ indx ].id.toLowerCase() === parser.id.toLowerCase() ) {\n\t\t\t\t\tadd = false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( add ) {\n\t\t\t\tts.parsers[ ts.parsers.length ] = parser;\n\t\t\t}\n\t\t},\n\n\t\tgetParserById : function( name ) {\n\t\t\t/*jshint eqeqeq:false */ // eslint-disable-next-line eqeqeq\n\t\t\tif ( name == 'false' ) { return false; }\n\t\t\tvar indx,\n\t\t\t\tlen = ts.parsers.length;\n\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\tif ( ts.parsers[ indx ].id.toLowerCase() === ( name.toString() ).toLowerCase() ) {\n\t\t\t\t\treturn ts.parsers[ indx ];\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\n\t\tdetectParserForColumn : function( c, rows, rowIndex, cellIndex ) {\n\t\t\tvar cur, $node, row,\n\t\t\t\tindx = ts.parsers.length,\n\t\t\t\tnode = false,\n\t\t\t\tnodeValue = '',\n\t\t\t\tdebug = ts.debug(c, 'core'),\n\t\t\t\tkeepLooking = true;\n\t\t\twhile ( nodeValue === '' && keepLooking ) {\n\t\t\t\trowIndex++;\n\t\t\t\trow = rows[ rowIndex ];\n\t\t\t\t// stop looking after 50 empty rows\n\t\t\t\tif ( row && rowIndex < 50 ) {\n\t\t\t\t\tif ( row.className.indexOf( ts.cssIgnoreRow ) < 0 ) {\n\t\t\t\t\t\tnode = rows[ rowIndex ].cells[ cellIndex ];\n\t\t\t\t\t\tnodeValue = ts.getElementText( c, node, cellIndex );\n\t\t\t\t\t\t$node = $( node );\n\t\t\t\t\t\tif ( debug ) {\n\t\t\t\t\t\t\tconsole.log( 'Checking if value was empty on row ' + rowIndex + ', column: ' +\n\t\t\t\t\t\t\t\tcellIndex + ': \"' + nodeValue + '\"' );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tkeepLooking = false;\n\t\t\t\t}\n\t\t\t}\n\t\t\twhile ( --indx >= 0 ) {\n\t\t\t\tcur = ts.parsers[ indx ];\n\t\t\t\t// ignore the default text parser because it will always be true\n\t\t\t\tif ( cur && cur.id !== 'text' && cur.is && cur.is( nodeValue, c.table, node, $node ) ) {\n\t\t\t\t\treturn cur;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// nothing found, return the generic parser (text)\n\t\t\treturn ts.getParserById( 'text' );\n\t\t},\n\n\t\tgetElementText : function( c, node, cellIndex ) {\n\t\t\tif ( !node ) { return ''; }\n\t\t\tvar tmp,\n\t\t\t\textract = c.textExtraction || '',\n\t\t\t\t// node could be a jquery object\n\t\t\t\t// http://jsperf.com/jquery-vs-instanceof-jquery/2\n\t\t\t\t$node = node.jquery ? node : $( node );\n\t\t\tif ( typeof extract === 'string' ) {\n\t\t\t\t// check data-attribute first when set to 'basic'; don't use node.innerText - it's really slow!\n\t\t\t\t// http://www.kellegous.com/j/2013/02/27/innertext-vs-textcontent/\n\t\t\t\tif ( extract === 'basic' && typeof ( tmp = $node.attr( c.textAttribute ) ) !== 'undefined' ) {\n\t\t\t\t\treturn $.trim( tmp );\n\t\t\t\t}\n\t\t\t\treturn $.trim( node.textContent || $node.text() );\n\t\t\t} else {\n\t\t\t\tif ( typeof extract === 'function' ) {\n\t\t\t\t\treturn $.trim( extract( $node[ 0 ], c.table, cellIndex ) );\n\t\t\t\t} else if ( typeof ( tmp = ts.getColumnData( c.table, extract, cellIndex ) ) === 'function' ) {\n\t\t\t\t\treturn $.trim( tmp( $node[ 0 ], c.table, cellIndex ) );\n\t\t\t\t}\n\t\t\t}\n\t\t\t// fallback\n\t\t\treturn $.trim( $node[ 0 ].textContent || $node.text() );\n\t\t},\n\n\t\t// centralized function to extract/parse cell contents\n\t\tgetParsedText : function( c, cell, colIndex, txt ) {\n\t\t\tif ( typeof txt === 'undefined' ) {\n\t\t\t\ttxt = ts.getElementText( c, cell, colIndex );\n\t\t\t}\n\t\t\t// if no parser, make sure to return the txt\n\t\t\tvar val = '' + txt,\n\t\t\t\tparser = c.parsers[ colIndex ],\n\t\t\t\textractor = c.extractors[ colIndex ];\n\t\t\tif ( parser ) {\n\t\t\t\t// do extract before parsing, if there is one\n\t\t\t\tif ( extractor && typeof extractor.format === 'function' ) {\n\t\t\t\t\ttxt = extractor.format( txt, c.table, cell, colIndex );\n\t\t\t\t}\n\t\t\t\t// allow parsing if the string is empty, previously parsing would change it to zero,\n\t\t\t\t// in case the parser needs to extract data from the table cell attributes\n\t\t\t\tval = parser.id === 'no-parser' ? '' :\n\t\t\t\t\t// make sure txt is a string (extractor may have converted it)\n\t\t\t\t\tparser.format( '' + txt, c.table, cell, colIndex );\n\t\t\t\tif ( c.ignoreCase && typeof val === 'string' ) {\n\t\t\t\t\tval = val.toLowerCase();\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn val;\n\t\t},\n\n\t\t/*\n\t\t▄████▄ ▄████▄ ▄████▄ ██ ██ ██████\n\t\t██ ▀▀ ██▄▄██ ██ ▀▀ ██▄▄██ ██▄▄\n\t\t██ ▄▄ ██▀▀██ ██ ▄▄ ██▀▀██ ██▀▀\n\t\t▀████▀ ██ ██ ▀████▀ ██ ██ ██████\n\t\t*/\n\t\tbuildCache : function( c, callback, $tbodies ) {\n\t\t\tvar cache, val, txt, rowIndex, colIndex, tbodyIndex, $tbody, $row,\n\t\t\t\tcols, $cells, cell, cacheTime, totalRows, rowData, prevRowData,\n\t\t\t\tcolMax, span, cacheIndex, hasParser, max, len, index,\n\t\t\t\ttable = c.table,\n\t\t\t\tparsers = c.parsers,\n\t\t\t\tdebug = ts.debug(c, 'core');\n\t\t\t// update tbody variable\n\t\t\tc.$tbodies = c.$table.children( 'tbody:not(.' + c.cssInfoBlock + ')' );\n\t\t\t$tbody = typeof $tbodies === 'undefined' ? c.$tbodies : $tbodies,\n\t\t\tc.cache = {};\n\t\t\tc.totalRows = 0;\n\t\t\t// if no parsers found, return - it's an empty table.\n\t\t\tif ( !parsers ) {\n\t\t\t\treturn debug ? console.warn( 'Warning: *Empty table!* Not building a cache' ) : '';\n\t\t\t}\n\t\t\tif ( debug ) {\n\t\t\t\tcacheTime = new Date();\n\t\t\t}\n\t\t\t// processing icon\n\t\t\tif ( c.showProcessing ) {\n\t\t\t\tts.isProcessing( table, true );\n\t\t\t}\n\t\t\tfor ( tbodyIndex = 0; tbodyIndex < $tbody.length; tbodyIndex++ ) {\n\t\t\t\tcolMax = []; // column max value per tbody\n\t\t\t\tcache = c.cache[ tbodyIndex ] = {\n\t\t\t\t\tnormalized: [] // array of normalized row data; last entry contains 'rowData' above\n\t\t\t\t\t// colMax: # // added at the end\n\t\t\t\t};\n\n\t\t\t\ttotalRows = ( $tbody[ tbodyIndex ] && $tbody[ tbodyIndex ].rows.length ) || 0;\n\t\t\t\tfor ( rowIndex = 0; rowIndex < totalRows; ++rowIndex ) {\n\t\t\t\t\trowData = {\n\t\t\t\t\t\t// order: original row order #\n\t\t\t\t\t\t// $row : jQuery Object[]\n\t\t\t\t\t\tchild: [], // child row text (filter widget)\n\t\t\t\t\t\traw: [] // original row text\n\t\t\t\t\t};\n\t\t\t\t\t/** Add the table data to main data array */\n\t\t\t\t\t$row = $( $tbody[ tbodyIndex ].rows[ rowIndex ] );\n\t\t\t\t\tcols = [];\n\t\t\t\t\t// ignore \"remove-me\" rows\n\t\t\t\t\tif ( $row.hasClass( c.selectorRemove.slice(1) ) ) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\t// if this is a child row, add it to the last row's children and continue to the next row\n\t\t\t\t\t// ignore child row class, if it is the first row\n\t\t\t\t\tif ( $row.hasClass( c.cssChildRow ) && rowIndex !== 0 ) {\n\t\t\t\t\t\tlen = cache.normalized.length - 1;\n\t\t\t\t\t\tprevRowData = cache.normalized[ len ][ c.columns ];\n\t\t\t\t\t\tprevRowData.$row = prevRowData.$row.add( $row );\n\t\t\t\t\t\t// add 'hasChild' class name to parent row\n\t\t\t\t\t\tif ( !$row.prev().hasClass( c.cssChildRow ) ) {\n\t\t\t\t\t\t\t$row.prev().addClass( ts.css.cssHasChild );\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// save child row content (un-parsed!)\n\t\t\t\t\t\t$cells = $row.children( 'th, td' );\n\t\t\t\t\t\tlen = prevRowData.child.length;\n\t\t\t\t\t\tprevRowData.child[ len ] = [];\n\t\t\t\t\t\t// child row content does not account for colspans/rowspans; so indexing may be off\n\t\t\t\t\t\tcacheIndex = 0;\n\t\t\t\t\t\tmax = c.columns;\n\t\t\t\t\t\tfor ( colIndex = 0; colIndex < max; colIndex++ ) {\n\t\t\t\t\t\t\tcell = $cells[ colIndex ];\n\t\t\t\t\t\t\tif ( cell ) {\n\t\t\t\t\t\t\t\tprevRowData.child[ len ][ colIndex ] = ts.getParsedText( c, cell, colIndex );\n\t\t\t\t\t\t\t\tspan = $cells[ colIndex ].colSpan - 1;\n\t\t\t\t\t\t\t\tif ( span > 0 ) {\n\t\t\t\t\t\t\t\t\tcacheIndex += span;\n\t\t\t\t\t\t\t\t\tmax += span;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcacheIndex++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// go to the next for loop\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\trowData.$row = $row;\n\t\t\t\t\trowData.order = rowIndex; // add original row position to rowCache\n\t\t\t\t\tcacheIndex = 0;\n\t\t\t\t\tmax = c.columns;\n\t\t\t\t\tfor ( colIndex = 0; colIndex < max; ++colIndex ) {\n\t\t\t\t\t\tcell = $row[ 0 ].cells[ colIndex ];\n\t\t\t\t\t\tif ( cell && cacheIndex < c.columns ) {\n\t\t\t\t\t\t\thasParser = typeof parsers[ cacheIndex ] !== 'undefined';\n\t\t\t\t\t\t\tif ( !hasParser && debug ) {\n\t\t\t\t\t\t\t\tconsole.warn( 'No parser found for row: ' + rowIndex + ', column: ' + colIndex +\n\t\t\t\t\t\t\t\t\t'; cell containing: \"' + $(cell).text() + '\"; does it have a header?' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tval = ts.getElementText( c, cell, cacheIndex );\n\t\t\t\t\t\t\trowData.raw[ cacheIndex ] = val; // save original row text\n\t\t\t\t\t\t\t// save raw column text even if there is no parser set\n\t\t\t\t\t\t\ttxt = ts.getParsedText( c, cell, cacheIndex, val );\n\t\t\t\t\t\t\tcols[ cacheIndex ] = txt;\n\t\t\t\t\t\t\tif ( hasParser && ( parsers[ cacheIndex ].type || '' ).toLowerCase() === 'numeric' ) {\n\t\t\t\t\t\t\t\t// determine column max value (ignore sign)\n\t\t\t\t\t\t\t\tcolMax[ cacheIndex ] = Math.max( Math.abs( txt ) || 0, colMax[ cacheIndex ] || 0 );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// allow colSpan in tbody\n\t\t\t\t\t\t\tspan = cell.colSpan - 1;\n\t\t\t\t\t\t\tif ( span > 0 ) {\n\t\t\t\t\t\t\t\tindex = 0;\n\t\t\t\t\t\t\t\twhile ( index <= span ) {\n\t\t\t\t\t\t\t\t\t// duplicate text (or not) to spanned columns\n\t\t\t\t\t\t\t\t\t// instead of setting duplicate span to empty string, use textExtraction to try to get a value\n\t\t\t\t\t\t\t\t\t// see http://stackoverflow.com/q/36449711/145346\n\t\t\t\t\t\t\t\t\ttxt = c.duplicateSpan || index === 0 ?\n\t\t\t\t\t\t\t\t\t\tval :\n\t\t\t\t\t\t\t\t\t\ttypeof c.textExtraction !== 'string' ?\n\t\t\t\t\t\t\t\t\t\t\tts.getElementText( c, cell, cacheIndex + index ) || '' :\n\t\t\t\t\t\t\t\t\t\t\t'';\n\t\t\t\t\t\t\t\t\trowData.raw[ cacheIndex + index ] = txt;\n\t\t\t\t\t\t\t\t\tcols[ cacheIndex + index ] = txt;\n\t\t\t\t\t\t\t\t\tindex++;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tcacheIndex += span;\n\t\t\t\t\t\t\t\tmax += span;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcacheIndex++;\n\t\t\t\t\t}\n\t\t\t\t\t// ensure rowData is always in the same location (after the last column)\n\t\t\t\t\tcols[ c.columns ] = rowData;\n\t\t\t\t\tcache.normalized[ cache.normalized.length ] = cols;\n\t\t\t\t}\n\t\t\t\tcache.colMax = colMax;\n\t\t\t\t// total up rows, not including child rows\n\t\t\t\tc.totalRows += cache.normalized.length;\n\n\t\t\t}\n\t\t\tif ( c.showProcessing ) {\n\t\t\t\tts.isProcessing( table ); // remove processing icon\n\t\t\t}\n\t\t\tif ( debug ) {\n\t\t\t\tlen = Math.min( 5, c.cache[ 0 ].normalized.length );\n\t\t\t\tconsole[ console.group ? 'group' : 'log' ]( 'Building cache for ' + c.totalRows +\n\t\t\t\t\t' rows (showing ' + len + ' rows in log) and ' + c.columns + ' columns' +\n\t\t\t\t\tts.benchmark( cacheTime ) );\n\t\t\t\tval = {};\n\t\t\t\tfor ( colIndex = 0; colIndex < c.columns; colIndex++ ) {\n\t\t\t\t\tfor ( cacheIndex = 0; cacheIndex < len; cacheIndex++ ) {\n\t\t\t\t\t\tif ( !val[ 'row: ' + cacheIndex ] ) {\n\t\t\t\t\t\t\tval[ 'row: ' + cacheIndex ] = {};\n\t\t\t\t\t\t}\n\t\t\t\t\t\tval[ 'row: ' + cacheIndex ][ c.$headerIndexed[ colIndex ].text() ] =\n\t\t\t\t\t\t\tc.cache[ 0 ].normalized[ cacheIndex ][ colIndex ];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconsole[ console.table ? 'table' : 'log' ]( val );\n\t\t\t\tif ( console.groupEnd ) { console.groupEnd(); }\n\t\t\t}\n\t\t\tif ( $.isFunction( callback ) ) {\n\t\t\t\tcallback( table );\n\t\t\t}\n\t\t},\n\n\t\tgetColumnText : function( table, column, callback, rowFilter ) {\n\t\t\ttable = $( table )[0];\n\t\t\tvar tbodyIndex, rowIndex, cache, row, tbodyLen, rowLen, raw, parsed, $cell, result,\n\t\t\t\thasCallback = typeof callback === 'function',\n\t\t\t\tallColumns = column === 'all',\n\t\t\t\tdata = { raw : [], parsed: [], $cell: [] },\n\t\t\t\tc = table.config;\n\t\t\tif ( ts.isEmptyObject( c ) ) {\n\t\t\t\tif ( ts.debug(c, 'core') ) {\n\t\t\t\t\tconsole.warn( 'No cache found - aborting getColumnText function!' );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\ttbodyLen = c.$tbodies.length;\n\t\t\t\tfor ( tbodyIndex = 0; tbodyIndex < tbodyLen; tbodyIndex++ ) {\n\t\t\t\t\tcache = c.cache[ tbodyIndex ].normalized;\n\t\t\t\t\trowLen = cache.length;\n\t\t\t\t\tfor ( rowIndex = 0; rowIndex < rowLen; rowIndex++ ) {\n\t\t\t\t\t\trow = cache[ rowIndex ];\n\t\t\t\t\t\tif ( rowFilter && !row[ c.columns ].$row.is( rowFilter ) ) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tresult = true;\n\t\t\t\t\t\tparsed = ( allColumns ) ? row.slice( 0, c.columns ) : row[ column ];\n\t\t\t\t\t\trow = row[ c.columns ];\n\t\t\t\t\t\traw = ( allColumns ) ? row.raw : row.raw[ column ];\n\t\t\t\t\t\t$cell = ( allColumns ) ? row.$row.children() : row.$row.children().eq( column );\n\t\t\t\t\t\tif ( hasCallback ) {\n\t\t\t\t\t\t\tresult = callback({\n\t\t\t\t\t\t\t\ttbodyIndex : tbodyIndex,\n\t\t\t\t\t\t\t\trowIndex : rowIndex,\n\t\t\t\t\t\t\t\tparsed : parsed,\n\t\t\t\t\t\t\t\traw : raw,\n\t\t\t\t\t\t\t\t$row : row.$row,\n\t\t\t\t\t\t\t\t$cell : $cell\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( result !== false ) {\n\t\t\t\t\t\t\tdata.parsed[ data.parsed.length ] = parsed;\n\t\t\t\t\t\t\tdata.raw[ data.raw.length ] = raw;\n\t\t\t\t\t\t\tdata.$cell[ data.$cell.length ] = $cell;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// return everything\n\t\t\t\treturn data;\n\t\t\t}\n\t\t},\n\n\t\t/*\n\t\t██ ██ █████▄ █████▄ ▄████▄ ██████ ██████\n\t\t██ ██ ██▄▄██ ██ ██ ██▄▄██ ██ ██▄▄\n\t\t██ ██ ██▀▀▀ ██ ██ ██▀▀██ ██ ██▀▀\n\t\t▀████▀ ██ █████▀ ██ ██ ██ ██████\n\t\t*/\n\t\tsetHeadersCss : function( c ) {\n\t\t\tvar indx, column,\n\t\t\t\tlist = c.sortList,\n\t\t\t\tlen = list.length,\n\t\t\t\tnone = ts.css.sortNone + ' ' + c.cssNone,\n\t\t\t\tcss = [ ts.css.sortAsc + ' ' + c.cssAsc, ts.css.sortDesc + ' ' + c.cssDesc ],\n\t\t\t\tcssIcon = [ c.cssIconAsc, c.cssIconDesc, c.cssIconNone ],\n\t\t\t\taria = [ 'ascending', 'descending' ],\n\t\t\t\tupdateColumnSort = function($el, index) {\n\t\t\t\t\t$el\n\t\t\t\t\t\t.removeClass( none )\n\t\t\t\t\t\t.addClass( css[ index ] )\n\t\t\t\t\t\t.attr( 'aria-sort', aria[ index ] )\n\t\t\t\t\t\t.find( '.' + ts.css.icon )\n\t\t\t\t\t\t.removeClass( cssIcon[ 2 ] )\n\t\t\t\t\t\t.addClass( cssIcon[ index ] );\n\t\t\t\t},\n\t\t\t\t// find the footer\n\t\t\t\t$extras = c.$table\n\t\t\t\t\t.find( 'tfoot tr' )\n\t\t\t\t\t.children( 'td, th' )\n\t\t\t\t\t.add( $( c.namespace + '_extra_headers' ) )\n\t\t\t\t\t.removeClass( css.join( ' ' ) ),\n\t\t\t\t// remove all header information\n\t\t\t\t$sorted = c.$headers\n\t\t\t\t\t.add( $( 'thead ' + c.namespace + '_extra_headers' ) )\n\t\t\t\t\t.removeClass( css.join( ' ' ) )\n\t\t\t\t\t.addClass( none )\n\t\t\t\t\t.attr( 'aria-sort', 'none' )\n\t\t\t\t\t.find( '.' + ts.css.icon )\n\t\t\t\t\t.removeClass( cssIcon.join( ' ' ) )\n\t\t\t\t\t.end();\n\t\t\t// add css none to all sortable headers\n\t\t\t$sorted\n\t\t\t\t.not( '.sorter-false' )\n\t\t\t\t.find( '.' + ts.css.icon )\n\t\t\t\t.addClass( cssIcon[ 2 ] );\n\t\t\t// add disabled css icon class\n\t\t\tif ( c.cssIconDisabled ) {\n\t\t\t\t$sorted\n\t\t\t\t\t.filter( '.sorter-false' )\n\t\t\t\t\t.find( '.' + ts.css.icon )\n\t\t\t\t\t.addClass( c.cssIconDisabled );\n\t\t\t}\n\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\t// direction = 2 means reset!\n\t\t\t\tif ( list[ indx ][ 1 ] !== 2 ) {\n\t\t\t\t\t// multicolumn sorting updating - see #1005\n\t\t\t\t\t// .not(function() {}) needs jQuery 1.4\n\t\t\t\t\t// filter(function(i, el) {}) <- el is undefined in jQuery v1.2.6\n\t\t\t\t\t$sorted = c.$headers.filter( function( i ) {\n\t\t\t\t\t\t// only include headers that are in the sortList (this includes colspans)\n\t\t\t\t\t\tvar include = true,\n\t\t\t\t\t\t\t$el = c.$headers.eq( i ),\n\t\t\t\t\t\t\tcol = parseInt( $el.attr( 'data-column' ), 10 ),\n\t\t\t\t\t\t\tend = col + ts.getClosest( $el, 'th, td' )[0].colSpan;\n\t\t\t\t\t\tfor ( ; col < end; col++ ) {\n\t\t\t\t\t\t\tinclude = include ? include || ts.isValueInArray( col, c.sortList ) > -1 : false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn include;\n\t\t\t\t\t});\n\n\t\t\t\t\t// choose the :last in case there are nested columns\n\t\t\t\t\t$sorted = $sorted\n\t\t\t\t\t\t.not( '.sorter-false' )\n\t\t\t\t\t\t.filter( '[data-column=\"' + list[ indx ][ 0 ] + '\"]' + ( len === 1 ? ':last' : '' ) );\n\t\t\t\t\tif ( $sorted.length ) {\n\t\t\t\t\t\tfor ( column = 0; column < $sorted.length; column++ ) {\n\t\t\t\t\t\t\tif ( !$sorted[ column ].sortDisabled ) {\n\t\t\t\t\t\t\t\tupdateColumnSort( $sorted.eq( column ), list[ indx ][ 1 ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// add sorted class to footer & extra headers, if they exist\n\t\t\t\t\tif ( $extras.length ) {\n\t\t\t\t\t\tupdateColumnSort( $extras.filter( '[data-column=\"' + list[ indx ][ 0 ] + '\"]' ), list[ indx ][ 1 ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// add verbose aria labels\n\t\t\tlen = c.$headers.length;\n\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\tts.setColumnAriaLabel( c, c.$headers.eq( indx ) );\n\t\t\t}\n\t\t},\n\n\t\tgetClosest : function( $el, selector ) {\n\t\t\t// jQuery v1.2.6 doesn't have closest()\n\t\t\tif ( $.fn.closest ) {\n\t\t\t\treturn $el.closest( selector );\n\t\t\t}\n\t\t\treturn $el.is( selector ) ?\n\t\t\t\t$el :\n\t\t\t\t$el.parents( selector ).filter( ':first' );\n\t\t},\n\n\t\t// nextSort (optional), lets you disable next sort text\n\t\tsetColumnAriaLabel : function( c, $header, nextSort ) {\n\t\t\tif ( $header.length ) {\n\t\t\t\tvar column = parseInt( $header.attr( 'data-column' ), 10 ),\n\t\t\t\t\tvars = c.sortVars[ column ],\n\t\t\t\t\ttmp = $header.hasClass( ts.css.sortAsc ) ?\n\t\t\t\t\t\t'sortAsc' :\n\t\t\t\t\t\t$header.hasClass( ts.css.sortDesc ) ? 'sortDesc' : 'sortNone',\n\t\t\t\t\ttxt = $.trim( $header.text() ) + ': ' + ts.language[ tmp ];\n\t\t\t\tif ( $header.hasClass( 'sorter-false' ) || nextSort === false ) {\n\t\t\t\t\ttxt += ts.language.sortDisabled;\n\t\t\t\t} else {\n\t\t\t\t\ttmp = ( vars.count + 1 ) % vars.order.length;\n\t\t\t\t\tnextSort = vars.order[ tmp ];\n\t\t\t\t\t// if nextSort\n\t\t\t\t\ttxt += ts.language[ nextSort === 0 ? 'nextAsc' : nextSort === 1 ? 'nextDesc' : 'nextNone' ];\n\t\t\t\t}\n\t\t\t\t$header.attr( 'aria-label', txt );\n\t\t\t}\n\t\t},\n\n\t\tupdateHeader : function( c ) {\n\t\t\tvar index, isDisabled, $header, col,\n\t\t\t\ttable = c.table,\n\t\t\t\tlen = c.$headers.length;\n\t\t\tfor ( index = 0; index < len; index++ ) {\n\t\t\t\t$header = c.$headers.eq( index );\n\t\t\t\tcol = ts.getColumnData( table, c.headers, index, true );\n\t\t\t\t// add 'sorter-false' class if 'parser-false' is set\n\t\t\t\tisDisabled = ts.getData( $header, col, 'sorter' ) === 'false' || ts.getData( $header, col, 'parser' ) === 'false';\n\t\t\t\tts.setColumnSort( c, $header, isDisabled );\n\t\t\t}\n\t\t},\n\n\t\tsetColumnSort : function( c, $header, isDisabled ) {\n\t\t\tvar id = c.table.id;\n\t\t\t$header[ 0 ].sortDisabled = isDisabled;\n\t\t\t$header[ isDisabled ? 'addClass' : 'removeClass' ]( 'sorter-false' )\n\t\t\t\t.attr( 'aria-disabled', '' + isDisabled );\n\t\t\t// disable tab index on disabled cells\n\t\t\tif ( c.tabIndex ) {\n\t\t\t\tif ( isDisabled ) {\n\t\t\t\t\t$header.removeAttr( 'tabindex' );\n\t\t\t\t} else {\n\t\t\t\t\t$header.attr( 'tabindex', '0' );\n\t\t\t\t}\n\t\t\t}\n\t\t\t// aria-controls - requires table ID\n\t\t\tif ( id ) {\n\t\t\t\tif ( isDisabled ) {\n\t\t\t\t\t$header.removeAttr( 'aria-controls' );\n\t\t\t\t} else {\n\t\t\t\t\t$header.attr( 'aria-controls', id );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tupdateHeaderSortCount : function( c, list ) {\n\t\t\tvar col, dir, group, indx, primary, temp, val, order,\n\t\t\t\tsortList = list || c.sortList,\n\t\t\t\tlen = sortList.length;\n\t\t\tc.sortList = [];\n\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\tval = sortList[ indx ];\n\t\t\t\t// ensure all sortList values are numeric - fixes #127\n\t\t\t\tcol = parseInt( val[ 0 ], 10 );\n\t\t\t\t// prevents error if sorton array is wrong\n\t\t\t\tif ( col < c.columns ) {\n\n\t\t\t\t\t// set order if not already defined - due to colspan header without associated header cell\n\t\t\t\t\t// adding this check prevents a javascript error\n\t\t\t\t\tif ( !c.sortVars[ col ].order ) {\n\t\t\t\t\t\tif ( ts.getOrder( c.sortInitialOrder ) ) {\n\t\t\t\t\t\t\torder = c.sortReset ? [ 1, 0, 2 ] : [ 1, 0 ];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\torder = c.sortReset ? [ 0, 1, 2 ] : [ 0, 1 ];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tc.sortVars[ col ].order = order;\n\t\t\t\t\t\tc.sortVars[ col ].count = 0;\n\t\t\t\t\t}\n\n\t\t\t\t\torder = c.sortVars[ col ].order;\n\t\t\t\t\tdir = ( '' + val[ 1 ] ).match( /^(1|d|s|o|n)/ );\n\t\t\t\t\tdir = dir ? dir[ 0 ] : '';\n\t\t\t\t\t// 0/(a)sc (default), 1/(d)esc, (s)ame, (o)pposite, (n)ext\n\t\t\t\t\tswitch ( dir ) {\n\t\t\t\t\t\tcase '1' : case 'd' : // descending\n\t\t\t\t\t\t\tdir = 1;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 's' : // same direction (as primary column)\n\t\t\t\t\t\t\t// if primary sort is set to 's', make it ascending\n\t\t\t\t\t\t\tdir = primary || 0;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'o' :\n\t\t\t\t\t\t\ttemp = order[ ( primary || 0 ) % order.length ];\n\t\t\t\t\t\t\t// opposite of primary column; but resets if primary resets\n\t\t\t\t\t\t\tdir = temp === 0 ? 1 : temp === 1 ? 0 : 2;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'n' :\n\t\t\t\t\t\t\tdir = order[ ( ++c.sortVars[ col ].count ) % order.length ];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault : // ascending\n\t\t\t\t\t\t\tdir = 0;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tprimary = indx === 0 ? dir : primary;\n\t\t\t\t\tgroup = [ col, parseInt( dir, 10 ) || 0 ];\n\t\t\t\t\tc.sortList[ c.sortList.length ] = group;\n\t\t\t\t\tdir = $.inArray( group[ 1 ], order ); // fixes issue #167\n\t\t\t\t\tc.sortVars[ col ].count = dir >= 0 ? dir : group[ 1 ] % order.length;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tupdateAll : function( c, resort, callback ) {\n\t\t\tvar table = c.table;\n\t\t\ttable.isUpdating = true;\n\t\t\tts.refreshWidgets( table, true, true );\n\t\t\tts.buildHeaders( c );\n\t\t\tts.bindEvents( table, c.$headers, true );\n\t\t\tts.bindMethods( c );\n\t\t\tts.commonUpdate( c, resort, callback );\n\t\t},\n\n\t\tupdate : function( c, resort, callback ) {\n\t\t\tvar table = c.table;\n\t\t\ttable.isUpdating = true;\n\t\t\t// update sorting (if enabled/disabled)\n\t\t\tts.updateHeader( c );\n\t\t\tts.commonUpdate( c, resort, callback );\n\t\t},\n\n\t\t// simple header update - see #989\n\t\tupdateHeaders : function( c, callback ) {\n\t\t\tc.table.isUpdating = true;\n\t\t\tts.buildHeaders( c );\n\t\t\tts.bindEvents( c.table, c.$headers, true );\n\t\t\tts.resortComplete( c, callback );\n\t\t},\n\n\t\tupdateCell : function( c, cell, resort, callback ) {\n\t\t\t// updateCell for child rows is a mess - we'll ignore them for now\n\t\t\t// eventually I'll break out the \"update\" row cache code to make everything consistent\n\t\t\tif ( $( cell ).closest( 'tr' ).hasClass( c.cssChildRow ) ) {\n\t\t\t\tconsole.warn('Tablesorter Warning! \"updateCell\" for child row content has been disabled, use \"update\" instead');\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( ts.isEmptyObject( c.cache ) ) {\n\t\t\t\t// empty table, do an update instead - fixes #1099\n\t\t\t\tts.updateHeader( c );\n\t\t\t\tts.commonUpdate( c, resort, callback );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tc.table.isUpdating = true;\n\t\t\tc.$table.find( c.selectorRemove ).remove();\n\t\t\t// get position from the dom\n\t\t\tvar tmp, indx, row, icell, cache, len,\n\t\t\t\t$tbodies = c.$tbodies,\n\t\t\t\t$cell = $( cell ),\n\t\t\t\t// update cache - format: function( s, table, cell, cellIndex )\n\t\t\t\t// no closest in jQuery v1.2.6\n\t\t\t\ttbodyIndex = $tbodies.index( ts.getClosest( $cell, 'tbody' ) ),\n\t\t\t\ttbcache = c.cache[ tbodyIndex ],\n\t\t\t\t$row = ts.getClosest( $cell, 'tr' );\n\t\t\tcell = $cell[ 0 ]; // in case cell is a jQuery object\n\t\t\t// tbody may not exist if update is initialized while tbody is removed for processing\n\t\t\tif ( $tbodies.length && tbodyIndex >= 0 ) {\n\t\t\t\trow = $tbodies.eq( tbodyIndex ).find( 'tr' ).not( '.' + c.cssChildRow ).index( $row );\n\t\t\t\tcache = tbcache.normalized[ row ];\n\t\t\t\tlen = $row[ 0 ].cells.length;\n\t\t\t\tif ( len !== c.columns ) {\n\t\t\t\t\t// colspan in here somewhere!\n\t\t\t\t\ticell = 0;\n\t\t\t\t\ttmp = false;\n\t\t\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\t\t\tif ( !tmp && $row[ 0 ].cells[ indx ] !== cell ) {\n\t\t\t\t\t\t\ticell += $row[ 0 ].cells[ indx ].colSpan;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttmp = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\ticell = $cell.index();\n\t\t\t\t}\n\t\t\t\ttmp = ts.getElementText( c, cell, icell ); // raw\n\t\t\t\tcache[ c.columns ].raw[ icell ] = tmp;\n\t\t\t\ttmp = ts.getParsedText( c, cell, icell, tmp );\n\t\t\t\tcache[ icell ] = tmp; // parsed\n\t\t\t\tif ( ( c.parsers[ icell ].type || '' ).toLowerCase() === 'numeric' ) {\n\t\t\t\t\t// update column max value (ignore sign)\n\t\t\t\t\ttbcache.colMax[ icell ] = Math.max( Math.abs( tmp ) || 0, tbcache.colMax[ icell ] || 0 );\n\t\t\t\t}\n\t\t\t\ttmp = resort !== 'undefined' ? resort : c.resort;\n\t\t\t\tif ( tmp !== false ) {\n\t\t\t\t\t// widgets will be reapplied\n\t\t\t\t\tts.checkResort( c, tmp, callback );\n\t\t\t\t} else {\n\t\t\t\t\t// don't reapply widgets is resort is false, just in case it causes\n\t\t\t\t\t// problems with element focus\n\t\t\t\t\tts.resortComplete( c, callback );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif ( ts.debug(c, 'core') ) {\n\t\t\t\t\tconsole.error( 'updateCell aborted, tbody missing or not within the indicated table' );\n\t\t\t\t}\n\t\t\t\tc.table.isUpdating = false;\n\t\t\t}\n\t\t},\n\n\t\taddRows : function( c, $row, resort, callback ) {\n\t\t\tvar txt, val, tbodyIndex, rowIndex, rows, cellIndex, len, order,\n\t\t\t\tcacheIndex, rowData, cells, cell, span,\n\t\t\t\t// allow passing a row string if only one non-info tbody exists in the table\n\t\t\t\tvalid = typeof $row === 'string' && c.$tbodies.length === 1 && /
0 ) {\n\t\t\t\t\t\t\tcacheIndex += span;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcacheIndex++;\n\t\t\t\t\t}\n\t\t\t\t\t// add the row data to the end\n\t\t\t\t\tcells[ c.columns ] = rowData;\n\t\t\t\t\t// update cache\n\t\t\t\t\tc.cache[ tbodyIndex ].normalized[ order ] = cells;\n\t\t\t\t}\n\t\t\t\t// resort using current settings\n\t\t\t\tts.checkResort( c, resort, callback );\n\t\t\t}\n\t\t},\n\n\t\tupdateCache : function( c, callback, $tbodies ) {\n\t\t\t// rebuild parsers\n\t\t\tif ( !( c.parsers && c.parsers.length ) ) {\n\t\t\t\tts.setupParsers( c, $tbodies );\n\t\t\t}\n\t\t\t// rebuild the cache map\n\t\t\tts.buildCache( c, callback, $tbodies );\n\t\t},\n\n\t\t// init flag (true) used by pager plugin to prevent widget application\n\t\t// renamed from appendToTable\n\t\tappendCache : function( c, init ) {\n\t\t\tvar parsed, totalRows, $tbody, $curTbody, rowIndex, tbodyIndex, appendTime,\n\t\t\t\ttable = c.table,\n\t\t\t\t$tbodies = c.$tbodies,\n\t\t\t\trows = [],\n\t\t\t\tcache = c.cache;\n\t\t\t// empty table - fixes #206/#346\n\t\t\tif ( ts.isEmptyObject( cache ) ) {\n\t\t\t\t// run pager appender in case the table was just emptied\n\t\t\t\treturn c.appender ? c.appender( table, rows ) :\n\t\t\t\t\ttable.isUpdating ? c.$table.triggerHandler( 'updateComplete', table ) : ''; // Fixes #532\n\t\t\t}\n\t\t\tif ( ts.debug(c, 'core') ) {\n\t\t\t\tappendTime = new Date();\n\t\t\t}\n\t\t\tfor ( tbodyIndex = 0; tbodyIndex < $tbodies.length; tbodyIndex++ ) {\n\t\t\t\t$tbody = $tbodies.eq( tbodyIndex );\n\t\t\t\tif ( $tbody.length ) {\n\t\t\t\t\t// detach tbody for manipulation\n\t\t\t\t\t$curTbody = ts.processTbody( table, $tbody, true );\n\t\t\t\t\tparsed = cache[ tbodyIndex ].normalized;\n\t\t\t\t\ttotalRows = parsed.length;\n\t\t\t\t\tfor ( rowIndex = 0; rowIndex < totalRows; rowIndex++ ) {\n\t\t\t\t\t\trows[rows.length] = parsed[ rowIndex ][ c.columns ].$row;\n\t\t\t\t\t\t// removeRows used by the pager plugin; don't render if using ajax - fixes #411\n\t\t\t\t\t\tif ( !c.appender || ( c.pager && !c.pager.removeRows && !c.pager.ajax ) ) {\n\t\t\t\t\t\t\t$curTbody.append( parsed[ rowIndex ][ c.columns ].$row );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// restore tbody\n\t\t\t\t\tts.processTbody( table, $curTbody, false );\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( c.appender ) {\n\t\t\t\tc.appender( table, rows );\n\t\t\t}\n\t\t\tif ( ts.debug(c, 'core') ) {\n\t\t\t\tconsole.log( 'Rebuilt table' + ts.benchmark( appendTime ) );\n\t\t\t}\n\t\t\t// apply table widgets; but not before ajax completes\n\t\t\tif ( !init && !c.appender ) {\n\t\t\t\tts.applyWidget( table );\n\t\t\t}\n\t\t\tif ( table.isUpdating ) {\n\t\t\t\tc.$table.triggerHandler( 'updateComplete', table );\n\t\t\t}\n\t\t},\n\n\t\tcommonUpdate : function( c, resort, callback ) {\n\t\t\t// remove rows/elements before update\n\t\t\tc.$table.find( c.selectorRemove ).remove();\n\t\t\t// rebuild parsers\n\t\t\tts.setupParsers( c );\n\t\t\t// rebuild the cache map\n\t\t\tts.buildCache( c );\n\t\t\tts.checkResort( c, resort, callback );\n\t\t},\n\n\t\t/*\n\t\t▄█████ ▄████▄ █████▄ ██████ ██ █████▄ ▄████▄\n\t\t▀█▄ ██ ██ ██▄▄██ ██ ██ ██ ██ ██ ▄▄▄\n\t\t ▀█▄ ██ ██ ██▀██ ██ ██ ██ ██ ██ ▀██\n\t\t█████▀ ▀████▀ ██ ██ ██ ██ ██ ██ ▀████▀\n\t\t*/\n\t\tinitSort : function( c, cell, event ) {\n\t\t\tif ( c.table.isUpdating ) {\n\t\t\t\t// let any updates complete before initializing a sort\n\t\t\t\treturn setTimeout( function() {\n\t\t\t\t\tts.initSort( c, cell, event );\n\t\t\t\t}, 50 );\n\t\t\t}\n\n\t\t\tvar arry, indx, headerIndx, dir, temp, tmp, $header,\n\t\t\t\tnotMultiSort = !event[ c.sortMultiSortKey ],\n\t\t\t\ttable = c.table,\n\t\t\t\tlen = c.$headers.length,\n\t\t\t\tth = ts.getClosest( $( cell ), 'th, td' ),\n\t\t\t\tcol = parseInt( th.attr( 'data-column' ), 10 ),\n\t\t\t\torder = c.sortVars[ col ].order;\n\t\t\tth = th[0];\n\t\t\t// Only call sortStart if sorting is enabled\n\t\t\tc.$table.triggerHandler( 'sortStart', table );\n\t\t\t// get current column sort order\n\t\t\ttmp = ( c.sortVars[ col ].count + 1 ) % order.length;\n\t\t\tc.sortVars[ col ].count = event[ c.sortResetKey ] ? 2 : tmp;\n\t\t\t// reset all sorts on non-current column - issue #30\n\t\t\tif ( c.sortRestart ) {\n\t\t\t\tfor ( headerIndx = 0; headerIndx < len; headerIndx++ ) {\n\t\t\t\t\t$header = c.$headers.eq( headerIndx );\n\t\t\t\t\ttmp = parseInt( $header.attr( 'data-column' ), 10 );\n\t\t\t\t\t// only reset counts on columns that weren't just clicked on and if not included in a multisort\n\t\t\t\t\tif ( col !== tmp && ( notMultiSort || $header.hasClass( ts.css.sortNone ) ) ) {\n\t\t\t\t\t\tc.sortVars[ tmp ].count = -1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// user only wants to sort on one column\n\t\t\tif ( notMultiSort ) {\n\t\t\t\t// flush the sort list\n\t\t\t\tc.sortList = [];\n\t\t\t\tc.last.sortList = [];\n\t\t\t\tif ( c.sortForce !== null ) {\n\t\t\t\t\tarry = c.sortForce;\n\t\t\t\t\tfor ( indx = 0; indx < arry.length; indx++ ) {\n\t\t\t\t\t\tif ( arry[ indx ][ 0 ] !== col ) {\n\t\t\t\t\t\t\tc.sortList[ c.sortList.length ] = arry[ indx ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// add column to sort list\n\t\t\t\tdir = order[ c.sortVars[ col ].count ];\n\t\t\t\tif ( dir < 2 ) {\n\t\t\t\t\tc.sortList[ c.sortList.length ] = [ col, dir ];\n\t\t\t\t\t// add other columns if header spans across multiple\n\t\t\t\t\tif ( th.colSpan > 1 ) {\n\t\t\t\t\t\tfor ( indx = 1; indx < th.colSpan; indx++ ) {\n\t\t\t\t\t\t\tc.sortList[ c.sortList.length ] = [ col + indx, dir ];\n\t\t\t\t\t\t\t// update count on columns in colSpan\n\t\t\t\t\t\t\tc.sortVars[ col + indx ].count = $.inArray( dir, order );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// multi column sorting\n\t\t\t} else {\n\t\t\t\t// get rid of the sortAppend before adding more - fixes issue #115 & #523\n\t\t\t\tc.sortList = $.extend( [], c.last.sortList );\n\n\t\t\t\t// the user has clicked on an already sorted column\n\t\t\t\tif ( ts.isValueInArray( col, c.sortList ) >= 0 ) {\n\t\t\t\t\t// reverse the sorting direction\n\t\t\t\t\tfor ( indx = 0; indx < c.sortList.length; indx++ ) {\n\t\t\t\t\t\ttmp = c.sortList[ indx ];\n\t\t\t\t\t\tif ( tmp[ 0 ] === col ) {\n\t\t\t\t\t\t\t// order.count seems to be incorrect when compared to cell.count\n\t\t\t\t\t\t\ttmp[ 1 ] = order[ c.sortVars[ col ].count ];\n\t\t\t\t\t\t\tif ( tmp[1] === 2 ) {\n\t\t\t\t\t\t\t\tc.sortList.splice( indx, 1 );\n\t\t\t\t\t\t\t\tc.sortVars[ col ].count = -1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// add column to sort list array\n\t\t\t\t\tdir = order[ c.sortVars[ col ].count ];\n\t\t\t\t\tif ( dir < 2 ) {\n\t\t\t\t\t\tc.sortList[ c.sortList.length ] = [ col, dir ];\n\t\t\t\t\t\t// add other columns if header spans across multiple\n\t\t\t\t\t\tif ( th.colSpan > 1 ) {\n\t\t\t\t\t\t\tfor ( indx = 1; indx < th.colSpan; indx++ ) {\n\t\t\t\t\t\t\t\tc.sortList[ c.sortList.length ] = [ col + indx, dir ];\n\t\t\t\t\t\t\t\t// update count on columns in colSpan\n\t\t\t\t\t\t\t\tc.sortVars[ col + indx ].count = $.inArray( dir, order );\n\t\t\t\t\t\t\t}\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\t// save sort before applying sortAppend\n\t\t\tc.last.sortList = $.extend( [], c.sortList );\n\t\t\tif ( c.sortList.length && c.sortAppend ) {\n\t\t\t\tarry = $.isArray( c.sortAppend ) ? c.sortAppend : c.sortAppend[ c.sortList[ 0 ][ 0 ] ];\n\t\t\t\tif ( !ts.isEmptyObject( arry ) ) {\n\t\t\t\t\tfor ( indx = 0; indx < arry.length; indx++ ) {\n\t\t\t\t\t\tif ( arry[ indx ][ 0 ] !== col && ts.isValueInArray( arry[ indx ][ 0 ], c.sortList ) < 0 ) {\n\t\t\t\t\t\t\tdir = arry[ indx ][ 1 ];\n\t\t\t\t\t\t\ttemp = ( '' + dir ).match( /^(a|d|s|o|n)/ );\n\t\t\t\t\t\t\tif ( temp ) {\n\t\t\t\t\t\t\t\ttmp = c.sortList[ 0 ][ 1 ];\n\t\t\t\t\t\t\t\tswitch ( temp[ 0 ] ) {\n\t\t\t\t\t\t\t\t\tcase 'd' :\n\t\t\t\t\t\t\t\t\t\tdir = 1;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\tcase 's' :\n\t\t\t\t\t\t\t\t\t\tdir = tmp;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\tcase 'o' :\n\t\t\t\t\t\t\t\t\t\tdir = tmp === 0 ? 1 : 0;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\tcase 'n' :\n\t\t\t\t\t\t\t\t\t\tdir = ( tmp + 1 ) % order.length;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\tdir = 0;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tc.sortList[ c.sortList.length ] = [ arry[ indx ][ 0 ], dir ];\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\t// sortBegin event triggered immediately before the sort\n\t\t\tc.$table.triggerHandler( 'sortBegin', table );\n\t\t\t// setTimeout needed so the processing icon shows up\n\t\t\tsetTimeout( function() {\n\t\t\t\t// set css for headers\n\t\t\t\tts.setHeadersCss( c );\n\t\t\t\tts.multisort( c );\n\t\t\t\tts.appendCache( c );\n\t\t\t\tc.$table.triggerHandler( 'sortBeforeEnd', table );\n\t\t\t\tc.$table.triggerHandler( 'sortEnd', table );\n\t\t\t}, 1 );\n\t\t},\n\n\t\t// sort multiple columns\n\t\tmultisort : function( c ) { /*jshint loopfunc:true */\n\t\t\tvar tbodyIndex, sortTime, colMax, rows, tmp,\n\t\t\t\ttable = c.table,\n\t\t\t\tsorter = [],\n\t\t\t\tdir = 0,\n\t\t\t\ttextSorter = c.textSorter || '',\n\t\t\t\tsortList = c.sortList,\n\t\t\t\tsortLen = sortList.length,\n\t\t\t\tlen = c.$tbodies.length;\n\t\t\tif ( c.serverSideSorting || ts.isEmptyObject( c.cache ) ) {\n\t\t\t\t// empty table - fixes #206/#346\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( ts.debug(c, 'core') ) { sortTime = new Date(); }\n\t\t\t// cache textSorter to optimize speed\n\t\t\tif ( typeof textSorter === 'object' ) {\n\t\t\t\tcolMax = c.columns;\n\t\t\t\twhile ( colMax-- ) {\n\t\t\t\t\ttmp = ts.getColumnData( table, textSorter, colMax );\n\t\t\t\t\tif ( typeof tmp === 'function' ) {\n\t\t\t\t\t\tsorter[ colMax ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor ( tbodyIndex = 0; tbodyIndex < len; tbodyIndex++ ) {\n\t\t\t\tcolMax = c.cache[ tbodyIndex ].colMax;\n\t\t\t\trows = c.cache[ tbodyIndex ].normalized;\n\n\t\t\t\trows.sort( function( a, b ) {\n\t\t\t\t\tvar sortIndex, num, col, order, sort, x, y;\n\t\t\t\t\t// rows is undefined here in IE, so don't use it!\n\t\t\t\t\tfor ( sortIndex = 0; sortIndex < sortLen; sortIndex++ ) {\n\t\t\t\t\t\tcol = sortList[ sortIndex ][ 0 ];\n\t\t\t\t\t\torder = sortList[ sortIndex ][ 1 ];\n\t\t\t\t\t\t// sort direction, true = asc, false = desc\n\t\t\t\t\t\tdir = order === 0;\n\n\t\t\t\t\t\tif ( c.sortStable && a[ col ] === b[ col ] && sortLen === 1 ) {\n\t\t\t\t\t\t\treturn a[ c.columns ].order - b[ c.columns ].order;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// fallback to natural sort since it is more robust\n\t\t\t\t\t\tnum = /n/i.test( ts.getSortType( c.parsers, col ) );\n\t\t\t\t\t\tif ( num && c.strings[ col ] ) {\n\t\t\t\t\t\t\t// sort strings in numerical columns\n\t\t\t\t\t\t\tif ( typeof ( ts.string[ c.strings[ col ] ] ) === 'boolean' ) {\n\t\t\t\t\t\t\t\tnum = ( dir ? 1 : -1 ) * ( ts.string[ c.strings[ col ] ] ? -1 : 1 );\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tnum = ( c.strings[ col ] ) ? ts.string[ c.strings[ col ] ] || 0 : 0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// fall back to built-in numeric sort\n\t\t\t\t\t\t\t// var sort = $.tablesorter['sort' + s]( a[col], b[col], dir, colMax[col], table );\n\t\t\t\t\t\t\tsort = c.numberSorter ? c.numberSorter( a[ col ], b[ col ], dir, colMax[ col ], table ) :\n\t\t\t\t\t\t\t\tts[ 'sortNumeric' + ( dir ? 'Asc' : 'Desc' ) ]( a[ col ], b[ col ], num, colMax[ col ], col, c );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// set a & b depending on sort direction\n\t\t\t\t\t\t\tx = dir ? a : b;\n\t\t\t\t\t\t\ty = dir ? b : a;\n\t\t\t\t\t\t\t// text sort function\n\t\t\t\t\t\t\tif ( typeof textSorter === 'function' ) {\n\t\t\t\t\t\t\t\t// custom OVERALL text sorter\n\t\t\t\t\t\t\t\tsort = textSorter( x[ col ], y[ col ], dir, col, table );\n\t\t\t\t\t\t\t} else if ( typeof sorter[ col ] === 'function' ) {\n\t\t\t\t\t\t\t\t// custom text sorter for a SPECIFIC COLUMN\n\t\t\t\t\t\t\t\tsort = sorter[ col ]( x[ col ], y[ col ], dir, col, table );\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// fall back to natural sort\n\t\t\t\t\t\t\t\tsort = ts[ 'sortNatural' + ( dir ? 'Asc' : 'Desc' ) ]( a[ col ], b[ col ], col, c );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( sort ) { return sort; }\n\t\t\t\t\t}\n\t\t\t\t\treturn a[ c.columns ].order - b[ c.columns ].order;\n\t\t\t\t});\n\t\t\t}\n\t\t\tif ( ts.debug(c, 'core') ) {\n\t\t\t\tconsole.log( 'Applying sort ' + sortList.toString() + ts.benchmark( sortTime ) );\n\t\t\t}\n\t\t},\n\n\t\tresortComplete : function( c, callback ) {\n\t\t\tif ( c.table.isUpdating ) {\n\t\t\t\tc.$table.triggerHandler( 'updateComplete', c.table );\n\t\t\t}\n\t\t\tif ( $.isFunction( callback ) ) {\n\t\t\t\tcallback( c.table );\n\t\t\t}\n\t\t},\n\n\t\tcheckResort : function( c, resort, callback ) {\n\t\t\tvar sortList = $.isArray( resort ) ? resort : c.sortList,\n\t\t\t\t// if no resort parameter is passed, fallback to config.resort (true by default)\n\t\t\t\tresrt = typeof resort === 'undefined' ? c.resort : resort;\n\t\t\t// don't try to resort if the table is still processing\n\t\t\t// this will catch spamming of the updateCell method\n\t\t\tif ( resrt !== false && !c.serverSideSorting && !c.table.isProcessing ) {\n\t\t\t\tif ( sortList.length ) {\n\t\t\t\t\tts.sortOn( c, sortList, function() {\n\t\t\t\t\t\tts.resortComplete( c, callback );\n\t\t\t\t\t}, true );\n\t\t\t\t} else {\n\t\t\t\t\tts.sortReset( c, function() {\n\t\t\t\t\t\tts.resortComplete( c, callback );\n\t\t\t\t\t\tts.applyWidget( c.table, false );\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tts.resortComplete( c, callback );\n\t\t\t\tts.applyWidget( c.table, false );\n\t\t\t}\n\t\t},\n\n\t\tsortOn : function( c, list, callback, init ) {\n\t\t\tvar table = c.table;\n\t\t\tc.$table.triggerHandler( 'sortStart', table );\n\t\t\t// update header count index\n\t\t\tts.updateHeaderSortCount( c, list );\n\t\t\t// set css for headers\n\t\t\tts.setHeadersCss( c );\n\t\t\t// fixes #346\n\t\t\tif ( c.delayInit && ts.isEmptyObject( c.cache ) ) {\n\t\t\t\tts.buildCache( c );\n\t\t\t}\n\t\t\tc.$table.triggerHandler( 'sortBegin', table );\n\t\t\t// sort the table and append it to the dom\n\t\t\tts.multisort( c );\n\t\t\tts.appendCache( c, init );\n\t\t\tc.$table.triggerHandler( 'sortBeforeEnd', table );\n\t\t\tc.$table.triggerHandler( 'sortEnd', table );\n\t\t\tts.applyWidget( table );\n\t\t\tif ( $.isFunction( callback ) ) {\n\t\t\t\tcallback( table );\n\t\t\t}\n\t\t},\n\n\t\tsortReset : function( c, callback ) {\n\t\t\tc.sortList = [];\n\t\t\tts.setHeadersCss( c );\n\t\t\tts.multisort( c );\n\t\t\tts.appendCache( c );\n\t\t\tvar indx;\n\t\t\tfor (indx = 0; indx < c.columns; indx++) {\n\t\t\t\tc.sortVars[ indx ].count = -1;\n\t\t\t}\n\t\t\tif ( $.isFunction( callback ) ) {\n\t\t\t\tcallback( c.table );\n\t\t\t}\n\t\t},\n\n\t\tgetSortType : function( parsers, column ) {\n\t\t\treturn ( parsers && parsers[ column ] ) ? parsers[ column ].type || '' : '';\n\t\t},\n\n\t\tgetOrder : function( val ) {\n\t\t\t// look for 'd' in 'desc' order; return true\n\t\t\treturn ( /^d/i.test( val ) || val === 1 );\n\t\t},\n\n\t\t// Natural sort - https://github.com/overset/javascript-natural-sort (date sorting removed)\n\t\tsortNatural : function( a, b ) {\n\t\t\tif ( a === b ) { return 0; }\n\t\t\ta = a.toString();\n\t\t\tb = b.toString();\n\t\t\tvar aNum, bNum, aFloat, bFloat, indx, max,\n\t\t\t\tregex = ts.regex;\n\t\t\t// first try and sort Hex codes\n\t\t\tif ( regex.hex.test( b ) ) {\n\t\t\t\taNum = parseInt( ( a || '' ).match( regex.hex ), 16 );\n\t\t\t\tbNum = parseInt( ( b || '' ).match( regex.hex ), 16 );\n\t\t\t\tif ( aNum < bNum ) { return -1; }\n\t\t\t\tif ( aNum > bNum ) { return 1; }\n\t\t\t}\n\t\t\t// chunk/tokenize\n\t\t\taNum = ( a || '' ).replace( regex.chunk, '\\\\0$1\\\\0' ).replace( regex.chunks, '' ).split( '\\\\0' );\n\t\t\tbNum = ( b || '' ).replace( regex.chunk, '\\\\0$1\\\\0' ).replace( regex.chunks, '' ).split( '\\\\0' );\n\t\t\tmax = Math.max( aNum.length, bNum.length );\n\t\t\t// natural sorting through split numeric strings and default strings\n\t\t\tfor ( indx = 0; indx < max; indx++ ) {\n\t\t\t\t// find floats not starting with '0', string or 0 if not defined\n\t\t\t\taFloat = isNaN( aNum[ indx ] ) ? aNum[ indx ] || 0 : parseFloat( aNum[ indx ] ) || 0;\n\t\t\t\tbFloat = isNaN( bNum[ indx ] ) ? bNum[ indx ] || 0 : parseFloat( bNum[ indx ] ) || 0;\n\t\t\t\t// handle numeric vs string comparison - number < string - (Kyle Adams)\n\t\t\t\tif ( isNaN( aFloat ) !== isNaN( bFloat ) ) { return isNaN( aFloat ) ? 1 : -1; }\n\t\t\t\t// rely on string comparison if different types - i.e. '02' < 2 != '02' < '2'\n\t\t\t\tif ( typeof aFloat !== typeof bFloat ) {\n\t\t\t\t\taFloat += '';\n\t\t\t\t\tbFloat += '';\n\t\t\t\t}\n\t\t\t\tif ( aFloat < bFloat ) { return -1; }\n\t\t\t\tif ( aFloat > bFloat ) { return 1; }\n\t\t\t}\n\t\t\treturn 0;\n\t\t},\n\n\t\tsortNaturalAsc : function( a, b, col, c ) {\n\t\t\tif ( a === b ) { return 0; }\n\t\t\tvar empty = ts.string[ ( c.empties[ col ] || c.emptyTo ) ];\n\t\t\tif ( a === '' && empty !== 0 ) { return typeof empty === 'boolean' ? ( empty ? -1 : 1 ) : -empty || -1; }\n\t\t\tif ( b === '' && empty !== 0 ) { return typeof empty === 'boolean' ? ( empty ? 1 : -1 ) : empty || 1; }\n\t\t\treturn ts.sortNatural( a, b );\n\t\t},\n\n\t\tsortNaturalDesc : function( a, b, col, c ) {\n\t\t\tif ( a === b ) { return 0; }\n\t\t\tvar empty = ts.string[ ( c.empties[ col ] || c.emptyTo ) ];\n\t\t\tif ( a === '' && empty !== 0 ) { return typeof empty === 'boolean' ? ( empty ? -1 : 1 ) : empty || 1; }\n\t\t\tif ( b === '' && empty !== 0 ) { return typeof empty === 'boolean' ? ( empty ? 1 : -1 ) : -empty || -1; }\n\t\t\treturn ts.sortNatural( b, a );\n\t\t},\n\n\t\t// basic alphabetical sort\n\t\tsortText : function( a, b ) {\n\t\t\treturn a > b ? 1 : ( a < b ? -1 : 0 );\n\t\t},\n\n\t\t// return text string value by adding up ascii value\n\t\t// so the text is somewhat sorted when using a digital sort\n\t\t// this is NOT an alphanumeric sort\n\t\tgetTextValue : function( val, num, max ) {\n\t\t\tif ( max ) {\n\t\t\t\t// make sure the text value is greater than the max numerical value (max)\n\t\t\t\tvar indx,\n\t\t\t\t\tlen = val ? val.length : 0,\n\t\t\t\t\tn = max + num;\n\t\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\t\tn += val.charCodeAt( indx );\n\t\t\t\t}\n\t\t\t\treturn num * n;\n\t\t\t}\n\t\t\treturn 0;\n\t\t},\n\n\t\tsortNumericAsc : function( a, b, num, max, col, c ) {\n\t\t\tif ( a === b ) { return 0; }\n\t\t\tvar empty = ts.string[ ( c.empties[ col ] || c.emptyTo ) ];\n\t\t\tif ( a === '' && empty !== 0 ) { return typeof empty === 'boolean' ? ( empty ? -1 : 1 ) : -empty || -1; }\n\t\t\tif ( b === '' && empty !== 0 ) { return typeof empty === 'boolean' ? ( empty ? 1 : -1 ) : empty || 1; }\n\t\t\tif ( isNaN( a ) ) { a = ts.getTextValue( a, num, max ); }\n\t\t\tif ( isNaN( b ) ) { b = ts.getTextValue( b, num, max ); }\n\t\t\treturn a - b;\n\t\t},\n\n\t\tsortNumericDesc : function( a, b, num, max, col, c ) {\n\t\t\tif ( a === b ) { return 0; }\n\t\t\tvar empty = ts.string[ ( c.empties[ col ] || c.emptyTo ) ];\n\t\t\tif ( a === '' && empty !== 0 ) { return typeof empty === 'boolean' ? ( empty ? -1 : 1 ) : empty || 1; }\n\t\t\tif ( b === '' && empty !== 0 ) { return typeof empty === 'boolean' ? ( empty ? 1 : -1 ) : -empty || -1; }\n\t\t\tif ( isNaN( a ) ) { a = ts.getTextValue( a, num, max ); }\n\t\t\tif ( isNaN( b ) ) { b = ts.getTextValue( b, num, max ); }\n\t\t\treturn b - a;\n\t\t},\n\n\t\tsortNumeric : function( a, b ) {\n\t\t\treturn a - b;\n\t\t},\n\n\t\t/*\n\t\t██ ██ ██ ██ █████▄ ▄████▄ ██████ ██████ ▄█████\n\t\t██ ██ ██ ██ ██ ██ ██ ▄▄▄ ██▄▄ ██ ▀█▄\n\t\t██ ██ ██ ██ ██ ██ ██ ▀██ ██▀▀ ██ ▀█▄\n\t\t███████▀ ██ █████▀ ▀████▀ ██████ ██ █████▀\n\t\t*/\n\t\taddWidget : function( widget ) {\n\t\t\tif ( widget.id && !ts.isEmptyObject( ts.getWidgetById( widget.id ) ) ) {\n\t\t\t\tconsole.warn( '\"' + widget.id + '\" widget was loaded more than once!' );\n\t\t\t}\n\t\t\tts.widgets[ ts.widgets.length ] = widget;\n\t\t},\n\n\t\thasWidget : function( $table, name ) {\n\t\t\t$table = $( $table );\n\t\t\treturn $table.length && $table[ 0 ].config && $table[ 0 ].config.widgetInit[ name ] || false;\n\t\t},\n\n\t\tgetWidgetById : function( name ) {\n\t\t\tvar indx, widget,\n\t\t\t\tlen = ts.widgets.length;\n\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\twidget = ts.widgets[ indx ];\n\t\t\t\tif ( widget && widget.id && widget.id.toLowerCase() === name.toLowerCase() ) {\n\t\t\t\t\treturn widget;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tapplyWidgetOptions : function( table ) {\n\t\t\tvar indx, widget, wo,\n\t\t\t\tc = table.config,\n\t\t\t\tlen = c.widgets.length;\n\t\t\tif ( len ) {\n\t\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\t\twidget = ts.getWidgetById( c.widgets[ indx ] );\n\t\t\t\t\tif ( widget && widget.options ) {\n\t\t\t\t\t\two = $.extend( true, {}, widget.options );\n\t\t\t\t\t\tc.widgetOptions = $.extend( true, wo, c.widgetOptions );\n\t\t\t\t\t\t// add widgetOptions to defaults for option validator\n\t\t\t\t\t\t$.extend( true, ts.defaults.widgetOptions, widget.options );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\taddWidgetFromClass : function( table ) {\n\t\t\tvar len, indx,\n\t\t\t\tc = table.config,\n\t\t\t\t// look for widgets to apply from table class\n\t\t\t\t// don't match from 'ui-widget-content'; use \\S instead of \\w to include widgets\n\t\t\t\t// with dashes in the name, e.g. \"widget-test-2\" extracts out \"test-2\"\n\t\t\t\tregex = '^' + c.widgetClass.replace( ts.regex.templateName, '(\\\\S+)+' ) + '$',\n\t\t\t\twidgetClass = new RegExp( regex, 'g' ),\n\t\t\t\t// split up table class (widget id's can include dashes) - stop using match\n\t\t\t\t// otherwise only one widget gets extracted, see #1109\n\t\t\t\twidgets = ( table.className || '' ).split( ts.regex.spaces );\n\t\t\tif ( widgets.length ) {\n\t\t\t\tlen = widgets.length;\n\t\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\t\tif ( widgets[ indx ].match( widgetClass ) ) {\n\t\t\t\t\t\tc.widgets[ c.widgets.length ] = widgets[ indx ].replace( widgetClass, '$1' );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tapplyWidgetId : function( table, id, init ) {\n\t\t\ttable = $(table)[0];\n\t\t\tvar applied, time, name,\n\t\t\t\tc = table.config,\n\t\t\t\two = c.widgetOptions,\n\t\t\t\tdebug = ts.debug(c, 'core'),\n\t\t\t\twidget = ts.getWidgetById( id );\n\t\t\tif ( widget ) {\n\t\t\t\tname = widget.id;\n\t\t\t\tapplied = false;\n\t\t\t\t// add widget name to option list so it gets reapplied after sorting, filtering, etc\n\t\t\t\tif ( $.inArray( name, c.widgets ) < 0 ) {\n\t\t\t\t\tc.widgets[ c.widgets.length ] = name;\n\t\t\t\t}\n\t\t\t\tif ( debug ) { time = new Date(); }\n\n\t\t\t\tif ( init || !( c.widgetInit[ name ] ) ) {\n\t\t\t\t\t// set init flag first to prevent calling init more than once (e.g. pager)\n\t\t\t\t\tc.widgetInit[ name ] = true;\n\t\t\t\t\tif ( table.hasInitialized ) {\n\t\t\t\t\t\t// don't reapply widget options on tablesorter init\n\t\t\t\t\t\tts.applyWidgetOptions( table );\n\t\t\t\t\t}\n\t\t\t\t\tif ( typeof widget.init === 'function' ) {\n\t\t\t\t\t\tapplied = true;\n\t\t\t\t\t\tif ( debug ) {\n\t\t\t\t\t\t\tconsole[ console.group ? 'group' : 'log' ]( 'Initializing ' + name + ' widget' );\n\t\t\t\t\t\t}\n\t\t\t\t\t\twidget.init( table, widget, c, wo );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif ( !init && typeof widget.format === 'function' ) {\n\t\t\t\t\tapplied = true;\n\t\t\t\t\tif ( debug ) {\n\t\t\t\t\t\tconsole[ console.group ? 'group' : 'log' ]( 'Updating ' + name + ' widget' );\n\t\t\t\t\t}\n\t\t\t\t\twidget.format( table, c, wo, false );\n\t\t\t\t}\n\t\t\t\tif ( debug ) {\n\t\t\t\t\tif ( applied ) {\n\t\t\t\t\t\tconsole.log( 'Completed ' + ( init ? 'initializing ' : 'applying ' ) + name + ' widget' + ts.benchmark( time ) );\n\t\t\t\t\t\tif ( console.groupEnd ) { console.groupEnd(); }\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tapplyWidget : function( table, init, callback ) {\n\t\t\ttable = $( table )[ 0 ]; // in case this is called externally\n\t\t\tvar indx, len, names, widget, time,\n\t\t\t\tc = table.config,\n\t\t\t\tdebug = ts.debug(c, 'core'),\n\t\t\t\twidgets = [];\n\t\t\t// prevent numerous consecutive widget applications\n\t\t\tif ( init !== false && table.hasInitialized && ( table.isApplyingWidgets || table.isUpdating ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( debug ) { time = new Date(); }\n\t\t\tts.addWidgetFromClass( table );\n\t\t\t// prevent \"tablesorter-ready\" from firing multiple times in a row\n\t\t\tclearTimeout( c.timerReady );\n\t\t\tif ( c.widgets.length ) {\n\t\t\t\ttable.isApplyingWidgets = true;\n\t\t\t\t// ensure unique widget ids\n\t\t\t\tc.widgets = $.grep( c.widgets, function( val, index ) {\n\t\t\t\t\treturn $.inArray( val, c.widgets ) === index;\n\t\t\t\t});\n\t\t\t\tnames = c.widgets || [];\n\t\t\t\tlen = names.length;\n\t\t\t\t// build widget array & add priority as needed\n\t\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\t\twidget = ts.getWidgetById( names[ indx ] );\n\t\t\t\t\tif ( widget && widget.id ) {\n\t\t\t\t\t\t// set priority to 10 if not defined\n\t\t\t\t\t\tif ( !widget.priority ) { widget.priority = 10; }\n\t\t\t\t\t\twidgets[ indx ] = widget;\n\t\t\t\t\t} else if ( debug ) {\n\t\t\t\t\t\tconsole.warn( '\"' + names[ indx ] + '\" was enabled, but the widget code has not been loaded!' );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// sort widgets by priority\n\t\t\t\twidgets.sort( function( a, b ) {\n\t\t\t\t\treturn a.priority < b.priority ? -1 : a.priority === b.priority ? 0 : 1;\n\t\t\t\t});\n\t\t\t\t// add/update selected widgets\n\t\t\t\tlen = widgets.length;\n\t\t\t\tif ( debug ) {\n\t\t\t\t\tconsole[ console.group ? 'group' : 'log' ]( 'Start ' + ( init ? 'initializing' : 'applying' ) + ' widgets' );\n\t\t\t\t}\n\t\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\t\twidget = widgets[ indx ];\n\t\t\t\t\tif ( widget && widget.id ) {\n\t\t\t\t\t\tts.applyWidgetId( table, widget.id, init );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif ( debug && console.groupEnd ) { console.groupEnd(); }\n\t\t\t}\n\t\t\tc.timerReady = setTimeout( function() {\n\t\t\t\ttable.isApplyingWidgets = false;\n\t\t\t\t$.data( table, 'lastWidgetApplication', new Date() );\n\t\t\t\tc.$table.triggerHandler( 'tablesorter-ready' );\n\t\t\t\t// callback executed on init only\n\t\t\t\tif ( !init && typeof callback === 'function' ) {\n\t\t\t\t\tcallback( table );\n\t\t\t\t}\n\t\t\t\tif ( debug ) {\n\t\t\t\t\twidget = c.widgets.length;\n\t\t\t\t\tconsole.log( 'Completed ' +\n\t\t\t\t\t\t( init === true ? 'initializing ' : 'applying ' ) + widget +\n\t\t\t\t\t\t' widget' + ( widget !== 1 ? 's' : '' ) + ts.benchmark( time ) );\n\t\t\t\t}\n\t\t\t}, 10 );\n\t\t},\n\n\t\tremoveWidget : function( table, name, refreshing ) {\n\t\t\ttable = $( table )[ 0 ];\n\t\t\tvar index, widget, indx, len,\n\t\t\t\tc = table.config;\n\t\t\t// if name === true, add all widgets from $.tablesorter.widgets\n\t\t\tif ( name === true ) {\n\t\t\t\tname = [];\n\t\t\t\tlen = ts.widgets.length;\n\t\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\t\twidget = ts.widgets[ indx ];\n\t\t\t\t\tif ( widget && widget.id ) {\n\t\t\t\t\t\tname[ name.length ] = widget.id;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// name can be either an array of widgets names,\n\t\t\t\t// or a space/comma separated list of widget names\n\t\t\t\tname = ( $.isArray( name ) ? name.join( ',' ) : name || '' ).toLowerCase().split( /[\\s,]+/ );\n\t\t\t}\n\t\t\tlen = name.length;\n\t\t\tfor ( index = 0; index < len; index++ ) {\n\t\t\t\twidget = ts.getWidgetById( name[ index ] );\n\t\t\t\tindx = $.inArray( name[ index ], c.widgets );\n\t\t\t\t// don't remove the widget from config.widget if refreshing\n\t\t\t\tif ( indx >= 0 && refreshing !== true ) {\n\t\t\t\t\tc.widgets.splice( indx, 1 );\n\t\t\t\t}\n\t\t\t\tif ( widget && widget.remove ) {\n\t\t\t\t\tif ( ts.debug(c, 'core') ) {\n\t\t\t\t\t\tconsole.log( ( refreshing ? 'Refreshing' : 'Removing' ) + ' \"' + name[ index ] + '\" widget' );\n\t\t\t\t\t}\n\t\t\t\t\twidget.remove( table, c, c.widgetOptions, refreshing );\n\t\t\t\t\tc.widgetInit[ name[ index ] ] = false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tc.$table.triggerHandler( 'widgetRemoveEnd', table );\n\t\t},\n\n\t\trefreshWidgets : function( table, doAll, dontapply ) {\n\t\t\ttable = $( table )[ 0 ]; // see issue #243\n\t\t\tvar indx, widget,\n\t\t\t\tc = table.config,\n\t\t\t\tcurWidgets = c.widgets,\n\t\t\t\twidgets = ts.widgets,\n\t\t\t\tlen = widgets.length,\n\t\t\t\tlist = [],\n\t\t\t\tcallback = function( table ) {\n\t\t\t\t\t$( table ).triggerHandler( 'refreshComplete' );\n\t\t\t\t};\n\t\t\t// remove widgets not defined in config.widgets, unless doAll is true\n\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\twidget = widgets[ indx ];\n\t\t\t\tif ( widget && widget.id && ( doAll || $.inArray( widget.id, curWidgets ) < 0 ) ) {\n\t\t\t\t\tlist[ list.length ] = widget.id;\n\t\t\t\t}\n\t\t\t}\n\t\t\tts.removeWidget( table, list.join( ',' ), true );\n\t\t\tif ( dontapply !== true ) {\n\t\t\t\t// call widget init if\n\t\t\t\tts.applyWidget( table, doAll || false, callback );\n\t\t\t\tif ( doAll ) {\n\t\t\t\t\t// apply widget format\n\t\t\t\t\tts.applyWidget( table, false, callback );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcallback( table );\n\t\t\t}\n\t\t},\n\n\t\t/*\n\t\t██ ██ ██████ ██ ██ ██ ██████ ██ ██████ ▄█████\n\t\t██ ██ ██ ██ ██ ██ ██ ██ ██▄▄ ▀█▄\n\t\t██ ██ ██ ██ ██ ██ ██ ██ ██▀▀ ▀█▄\n\t\t▀████▀ ██ ██ ██████ ██ ██ ██ ██████ █████▀\n\t\t*/\n\t\tbenchmark : function( diff ) {\n\t\t\treturn ( ' (' + ( new Date().getTime() - diff.getTime() ) + ' ms)' );\n\t\t},\n\t\t// deprecated ts.log\n\t\tlog : function() {\n\t\t\tconsole.log( arguments );\n\t\t},\n\t\tdebug : function(c, name) {\n\t\t\treturn c && (\n\t\t\t\tc.debug === true ||\n\t\t\t\ttypeof c.debug === 'string' && c.debug.indexOf(name) > -1\n\t\t\t);\n\t\t},\n\n\t\t// $.isEmptyObject from jQuery v1.4\n\t\tisEmptyObject : function( obj ) {\n\t\t\t/*jshint forin: false */\n\t\t\tfor ( var name in obj ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\tisValueInArray : function( column, arry ) {\n\t\t\tvar indx,\n\t\t\t\tlen = arry && arry.length || 0;\n\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\tif ( arry[ indx ][ 0 ] === column ) {\n\t\t\t\t\treturn indx;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn -1;\n\t\t},\n\n\t\tformatFloat : function( str, table ) {\n\t\t\tif ( typeof str !== 'string' || str === '' ) { return str; }\n\t\t\t// allow using formatFloat without a table; defaults to US number format\n\t\t\tvar num,\n\t\t\t\tusFormat = table && table.config ? table.config.usNumberFormat !== false :\n\t\t\t\t\ttypeof table !== 'undefined' ? table : true;\n\t\t\tif ( usFormat ) {\n\t\t\t\t// US Format - 1,234,567.89 -> 1234567.89\n\t\t\t\tstr = str.replace( ts.regex.comma, '' );\n\t\t\t} else {\n\t\t\t\t// German Format = 1.234.567,89 -> 1234567.89\n\t\t\t\t// French Format = 1 234 567,89 -> 1234567.89\n\t\t\t\tstr = str.replace( ts.regex.digitNonUS, '' ).replace( ts.regex.comma, '.' );\n\t\t\t}\n\t\t\tif ( ts.regex.digitNegativeTest.test( str ) ) {\n\t\t\t\t// make (#) into a negative number -> (10) = -10\n\t\t\t\tstr = str.replace( ts.regex.digitNegativeReplace, '-$1' );\n\t\t\t}\n\t\t\tnum = parseFloat( str );\n\t\t\t// return the text instead of zero\n\t\t\treturn isNaN( num ) ? $.trim( str ) : num;\n\t\t},\n\n\t\tisDigit : function( str ) {\n\t\t\t// replace all unwanted chars and match\n\t\t\treturn isNaN( str ) ?\n\t\t\t\tts.regex.digitTest.test( str.toString().replace( ts.regex.digitReplace, '' ) ) :\n\t\t\t\tstr !== '';\n\t\t},\n\n\t\t// computeTableHeaderCellIndexes from:\n\t\t// http://www.javascripttoolbox.com/lib/table/examples.php\n\t\t// http://www.javascripttoolbox.com/temp/table_cellindex.html\n\t\tcomputeColumnIndex : function( $rows, c ) {\n\t\t\tvar i, j, k, l, cell, cells, rowIndex, rowSpan, colSpan, firstAvailCol,\n\t\t\t\t// total columns has been calculated, use it to set the matrixrow\n\t\t\t\tcolumns = c && c.columns || 0,\n\t\t\t\tmatrix = [],\n\t\t\t\tmatrixrow = new Array( columns );\n\t\t\tfor ( i = 0; i < $rows.length; i++ ) {\n\t\t\t\tcells = $rows[ i ].cells;\n\t\t\t\tfor ( j = 0; j < cells.length; j++ ) {\n\t\t\t\t\tcell = cells[ j ];\n\t\t\t\t\trowIndex = i;\n\t\t\t\t\trowSpan = cell.rowSpan || 1;\n\t\t\t\t\tcolSpan = cell.colSpan || 1;\n\t\t\t\t\tif ( typeof matrix[ rowIndex ] === 'undefined' ) {\n\t\t\t\t\t\tmatrix[ rowIndex ] = [];\n\t\t\t\t\t}\n\t\t\t\t\t// Find first available column in the first row\n\t\t\t\t\tfor ( k = 0; k < matrix[ rowIndex ].length + 1; k++ ) {\n\t\t\t\t\t\tif ( typeof matrix[ rowIndex ][ k ] === 'undefined' ) {\n\t\t\t\t\t\t\tfirstAvailCol = k;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// jscs:disable disallowEmptyBlocks\n\t\t\t\t\tif ( columns && cell.cellIndex === firstAvailCol ) {\n\t\t\t\t\t\t// don't to anything\n\t\t\t\t\t} else if ( cell.setAttribute ) {\n\t\t\t\t\t\t// jscs:enable disallowEmptyBlocks\n\t\t\t\t\t\t// add data-column (setAttribute = IE8+)\n\t\t\t\t\t\tcell.setAttribute( 'data-column', firstAvailCol );\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// remove once we drop support for IE7 - 1/12/2016\n\t\t\t\t\t\t$( cell ).attr( 'data-column', firstAvailCol );\n\t\t\t\t\t}\n\t\t\t\t\tfor ( k = rowIndex; k < rowIndex + rowSpan; k++ ) {\n\t\t\t\t\t\tif ( typeof matrix[ k ] === 'undefined' ) {\n\t\t\t\t\t\t\tmatrix[ k ] = [];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatrixrow = matrix[ k ];\n\t\t\t\t\t\tfor ( l = firstAvailCol; l < firstAvailCol + colSpan; l++ ) {\n\t\t\t\t\t\t\tmatrixrow[ l ] = 'x';\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\tts.checkColumnCount($rows, matrix, matrixrow.length);\n\t\t\treturn matrixrow.length;\n\t\t},\n\n\t\tcheckColumnCount : function($rows, matrix, columns) {\n\t\t\t// this DOES NOT report any tbody column issues, except for the math and\n\t\t\t// and column selector widgets\n\t\t\tvar i, len,\n\t\t\t\tvalid = true,\n\t\t\t\tcells = [];\n\t\t\tfor ( i = 0; i < matrix.length; i++ ) {\n\t\t\t\t// some matrix entries are undefined when testing the footer because\n\t\t\t\t// it is using the rowIndex property\n\t\t\t\tif ( matrix[i] ) {\n\t\t\t\t\tlen = matrix[i].length;\n\t\t\t\t\tif ( matrix[i].length !== columns ) {\n\t\t\t\t\t\tvalid = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( !valid ) {\n\t\t\t\t$rows.each( function( indx, el ) {\n\t\t\t\t\tvar cell = el.parentElement.nodeName;\n\t\t\t\t\tif ( cells.indexOf( cell ) < 0 ) {\n\t\t\t\t\t\tcells.push( cell );\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tconsole.error(\n\t\t\t\t\t'Invalid or incorrect number of columns in the ' +\n\t\t\t\t\tcells.join( ' or ' ) + '; expected ' + columns +\n\t\t\t\t\t', but found ' + len + ' columns'\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\n\t\t// automatically add a colgroup with col elements set to a percentage width\n\t\tfixColumnWidth : function( table ) {\n\t\t\ttable = $( table )[ 0 ];\n\t\t\tvar overallWidth, percent, $tbodies, len, index,\n\t\t\t\tc = table.config,\n\t\t\t\t$colgroup = c.$table.children( 'colgroup' );\n\t\t\t// remove plugin-added colgroup, in case we need to refresh the widths\n\t\t\tif ( $colgroup.length && $colgroup.hasClass( ts.css.colgroup ) ) {\n\t\t\t\t$colgroup.remove();\n\t\t\t}\n\t\t\tif ( c.widthFixed && c.$table.children( 'colgroup' ).length === 0 ) {\n\t\t\t\t$colgroup = $( '' );\n\t\t\t\toverallWidth = c.$table.width();\n\t\t\t\t// only add col for visible columns - fixes #371\n\t\t\t\t$tbodies = c.$tbodies.find( 'tr:first' ).children( ':visible' );\n\t\t\t\tlen = $tbodies.length;\n\t\t\t\tfor ( index = 0; index < len; index++ ) {\n\t\t\t\t\tpercent = parseInt( ( $tbodies.eq( index ).width() / overallWidth ) * 1000, 10 ) / 10 + '%';\n\t\t\t\t\t$colgroup.append( $( '' ).css( 'width', percent ) );\n\t\t\t\t}\n\t\t\t\tc.$table.prepend( $colgroup );\n\t\t\t}\n\t\t},\n\n\t\t// get sorter, string, empty, etc options for each column from\n\t\t// jQuery data, metadata, header option or header class name ('sorter-false')\n\t\t// priority = jQuery data > meta > headers option > header class name\n\t\tgetData : function( header, configHeader, key ) {\n\t\t\tvar meta, cl4ss,\n\t\t\t\tval = '',\n\t\t\t\t$header = $( header );\n\t\t\tif ( !$header.length ) { return ''; }\n\t\t\tmeta = $.metadata ? $header.metadata() : false;\n\t\t\tcl4ss = ' ' + ( $header.attr( 'class' ) || '' );\n\t\t\tif ( typeof $header.data( key ) !== 'undefined' ||\n\t\t\t\ttypeof $header.data( key.toLowerCase() ) !== 'undefined' ) {\n\t\t\t\t// 'data-lockedOrder' is assigned to 'lockedorder'; but 'data-locked-order' is assigned to 'lockedOrder'\n\t\t\t\t// 'data-sort-initial-order' is assigned to 'sortInitialOrder'\n\t\t\t\tval += $header.data( key ) || $header.data( key.toLowerCase() );\n\t\t\t} else if ( meta && typeof meta[ key ] !== 'undefined' ) {\n\t\t\t\tval += meta[ key ];\n\t\t\t} else if ( configHeader && typeof configHeader[ key ] !== 'undefined' ) {\n\t\t\t\tval += configHeader[ key ];\n\t\t\t} else if ( cl4ss !== ' ' && cl4ss.match( ' ' + key + '-' ) ) {\n\t\t\t\t// include sorter class name 'sorter-text', etc; now works with 'sorter-my-custom-parser'\n\t\t\t\tval = cl4ss.match( new RegExp( '\\\\s' + key + '-([\\\\w-]+)' ) )[ 1 ] || '';\n\t\t\t}\n\t\t\treturn $.trim( val );\n\t\t},\n\n\t\tgetColumnData : function( table, obj, indx, getCell, $headers ) {\n\t\t\tif ( typeof obj !== 'object' || obj === null ) {\n\t\t\t\treturn obj;\n\t\t\t}\n\t\t\ttable = $( table )[ 0 ];\n\t\t\tvar $header, key,\n\t\t\t\tc = table.config,\n\t\t\t\t$cells = ( $headers || c.$headers ),\n\t\t\t\t// c.$headerIndexed is not defined initially\n\t\t\t\t$cell = c.$headerIndexed && c.$headerIndexed[ indx ] ||\n\t\t\t\t\t$cells.find( '[data-column=\"' + indx + '\"]:last' );\n\t\t\tif ( typeof obj[ indx ] !== 'undefined' ) {\n\t\t\t\treturn getCell ? obj[ indx ] : obj[ $cells.index( $cell ) ];\n\t\t\t}\n\t\t\tfor ( key in obj ) {\n\t\t\t\tif ( typeof key === 'string' ) {\n\t\t\t\t\t$header = $cell\n\t\t\t\t\t\t// header cell with class/id\n\t\t\t\t\t\t.filter( key )\n\t\t\t\t\t\t// find elements within the header cell with cell/id\n\t\t\t\t\t\t.add( $cell.find( key ) );\n\t\t\t\t\tif ( $header.length ) {\n\t\t\t\t\t\treturn obj[ key ];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t},\n\n\t\t// *** Process table ***\n\t\t// add processing indicator\n\t\tisProcessing : function( $table, toggle, $headers ) {\n\t\t\t$table = $( $table );\n\t\t\tvar c = $table[ 0 ].config,\n\t\t\t\t// default to all headers\n\t\t\t\t$header = $headers || $table.find( '.' + ts.css.header );\n\t\t\tif ( toggle ) {\n\t\t\t\t// don't use sortList if custom $headers used\n\t\t\t\tif ( typeof $headers !== 'undefined' && c.sortList.length > 0 ) {\n\t\t\t\t\t// get headers from the sortList\n\t\t\t\t\t$header = $header.filter( function() {\n\t\t\t\t\t\t// get data-column from attr to keep compatibility with jQuery 1.2.6\n\t\t\t\t\t\treturn this.sortDisabled ?\n\t\t\t\t\t\t\tfalse :\n\t\t\t\t\t\t\tts.isValueInArray( parseFloat( $( this ).attr( 'data-column' ) ), c.sortList ) >= 0;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\t$table.add( $header ).addClass( ts.css.processing + ' ' + c.cssProcessing );\n\t\t\t} else {\n\t\t\t\t$table.add( $header ).removeClass( ts.css.processing + ' ' + c.cssProcessing );\n\t\t\t}\n\t\t},\n\n\t\t// detach tbody but save the position\n\t\t// don't use tbody because there are portions that look for a tbody index (updateCell)\n\t\tprocessTbody : function( table, $tb, getIt ) {\n\t\t\ttable = $( table )[ 0 ];\n\t\t\tif ( getIt ) {\n\t\t\t\ttable.isProcessing = true;\n\t\t\t\t$tb.before( '' );\n\t\t\t\treturn $.fn.detach ? $tb.detach() : $tb.remove();\n\t\t\t}\n\t\t\tvar holdr = $( table ).find( 'colgroup.tablesorter-savemyplace' );\n\t\t\t$tb.insertAfter( holdr );\n\t\t\tholdr.remove();\n\t\t\ttable.isProcessing = false;\n\t\t},\n\n\t\tclearTableBody : function( table ) {\n\t\t\t$( table )[ 0 ].config.$tbodies.children().detach();\n\t\t},\n\n\t\t// used when replacing accented characters during sorting\n\t\tcharacterEquivalents : {\n\t\t\t'a' : '\\u00e1\\u00e0\\u00e2\\u00e3\\u00e4\\u0105\\u00e5', // áàâãäąå\n\t\t\t'A' : '\\u00c1\\u00c0\\u00c2\\u00c3\\u00c4\\u0104\\u00c5', // ÁÀÂÃÄĄÅ\n\t\t\t'c' : '\\u00e7\\u0107\\u010d', // çćč\n\t\t\t'C' : '\\u00c7\\u0106\\u010c', // ÇĆČ\n\t\t\t'e' : '\\u00e9\\u00e8\\u00ea\\u00eb\\u011b\\u0119', // éèêëěę\n\t\t\t'E' : '\\u00c9\\u00c8\\u00ca\\u00cb\\u011a\\u0118', // ÉÈÊËĚĘ\n\t\t\t'i' : '\\u00ed\\u00ec\\u0130\\u00ee\\u00ef\\u0131', // íìİîïı\n\t\t\t'I' : '\\u00cd\\u00cc\\u0130\\u00ce\\u00cf', // ÍÌİÎÏ\n\t\t\t'o' : '\\u00f3\\u00f2\\u00f4\\u00f5\\u00f6\\u014d', // óòôõöō\n\t\t\t'O' : '\\u00d3\\u00d2\\u00d4\\u00d5\\u00d6\\u014c', // ÓÒÔÕÖŌ\n\t\t\t'ss': '\\u00df', // ß (s sharp)\n\t\t\t'SS': '\\u1e9e', // ẞ (Capital sharp s)\n\t\t\t'u' : '\\u00fa\\u00f9\\u00fb\\u00fc\\u016f', // úùûüů\n\t\t\t'U' : '\\u00da\\u00d9\\u00db\\u00dc\\u016e' // ÚÙÛÜŮ\n\t\t},\n\n\t\treplaceAccents : function( str ) {\n\t\t\tvar chr,\n\t\t\t\tacc = '[',\n\t\t\t\teq = ts.characterEquivalents;\n\t\t\tif ( !ts.characterRegex ) {\n\t\t\t\tts.characterRegexArray = {};\n\t\t\t\tfor ( chr in eq ) {\n\t\t\t\t\tif ( typeof chr === 'string' ) {\n\t\t\t\t\t\tacc += eq[ chr ];\n\t\t\t\t\t\tts.characterRegexArray[ chr ] = new RegExp( '[' + eq[ chr ] + ']', 'g' );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tts.characterRegex = new RegExp( acc + ']' );\n\t\t\t}\n\t\t\tif ( ts.characterRegex.test( str ) ) {\n\t\t\t\tfor ( chr in eq ) {\n\t\t\t\t\tif ( typeof chr === 'string' ) {\n\t\t\t\t\t\tstr = str.replace( ts.characterRegexArray[ chr ], chr );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn str;\n\t\t},\n\n\t\tvalidateOptions : function( c ) {\n\t\t\tvar setting, setting2, typ, timer,\n\t\t\t\t// ignore options containing an array\n\t\t\t\tignore = 'headers sortForce sortList sortAppend widgets'.split( ' ' ),\n\t\t\t\torig = c.originalSettings;\n\t\t\tif ( orig ) {\n\t\t\t\tif ( ts.debug(c, 'core') ) {\n\t\t\t\t\ttimer = new Date();\n\t\t\t\t}\n\t\t\t\tfor ( setting in orig ) {\n\t\t\t\t\ttyp = typeof ts.defaults[setting];\n\t\t\t\t\tif ( typ === 'undefined' ) {\n\t\t\t\t\t\tconsole.warn( 'Tablesorter Warning! \"table.config.' + setting + '\" option not recognized' );\n\t\t\t\t\t} else if ( typ === 'object' ) {\n\t\t\t\t\t\tfor ( setting2 in orig[setting] ) {\n\t\t\t\t\t\t\ttyp = ts.defaults[setting] && typeof ts.defaults[setting][setting2];\n\t\t\t\t\t\t\tif ( $.inArray( setting, ignore ) < 0 && typ === 'undefined' ) {\n\t\t\t\t\t\t\t\tconsole.warn( 'Tablesorter Warning! \"table.config.' + setting + '.' + setting2 + '\" option not recognized' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif ( ts.debug(c, 'core') ) {\n\t\t\t\t\tconsole.log( 'validate options time:' + ts.benchmark( timer ) );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// restore headers\n\t\trestoreHeaders : function( table ) {\n\t\t\tvar index, $cell,\n\t\t\t\tc = $( table )[ 0 ].config,\n\t\t\t\t$headers = c.$table.find( c.selectorHeaders ),\n\t\t\t\tlen = $headers.length;\n\t\t\t// don't use c.$headers here in case header cells were swapped\n\t\t\tfor ( index = 0; index < len; index++ ) {\n\t\t\t\t$cell = $headers.eq( index );\n\t\t\t\t// only restore header cells if it is wrapped\n\t\t\t\t// because this is also used by the updateAll method\n\t\t\t\tif ( $cell.find( '.' + ts.css.headerIn ).length ) {\n\t\t\t\t\t$cell.html( c.headerContent[ index ] );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tdestroy : function( table, removeClasses, callback ) {\n\t\t\ttable = $( table )[ 0 ];\n\t\t\tif ( !table.hasInitialized ) { return; }\n\t\t\t// remove all widgets\n\t\t\tts.removeWidget( table, true, false );\n\t\t\tvar events,\n\t\t\t\t$t = $( table ),\n\t\t\t\tc = table.config,\n\t\t\t\t$h = $t.find( 'thead:first' ),\n\t\t\t\t$r = $h.find( 'tr.' + ts.css.headerRow ).removeClass( ts.css.headerRow + ' ' + c.cssHeaderRow ),\n\t\t\t\t$f = $t.find( 'tfoot:first > tr' ).children( 'th, td' );\n\t\t\tif ( removeClasses === false && $.inArray( 'uitheme', c.widgets ) >= 0 ) {\n\t\t\t\t// reapply uitheme classes, in case we want to maintain appearance\n\t\t\t\t$t.triggerHandler( 'applyWidgetId', [ 'uitheme' ] );\n\t\t\t\t$t.triggerHandler( 'applyWidgetId', [ 'zebra' ] );\n\t\t\t}\n\t\t\t// remove widget added rows, just in case\n\t\t\t$h.find( 'tr' ).not( $r ).remove();\n\t\t\t// disable tablesorter - not using .unbind( namespace ) because namespacing was\n\t\t\t// added in jQuery v1.4.3 - see http://api.jquery.com/event.namespace/\n\t\t\tevents = 'sortReset update updateRows updateAll updateHeaders updateCell addRows updateComplete sorton ' +\n\t\t\t\t'appendCache updateCache applyWidgetId applyWidgets refreshWidgets removeWidget destroy mouseup mouseleave ' +\n\t\t\t\t'keypress sortBegin sortEnd resetToLoadState '.split( ' ' )\n\t\t\t\t.join( c.namespace + ' ' );\n\t\t\t$t\n\t\t\t\t.removeData( 'tablesorter' )\n\t\t\t\t.unbind( events.replace( ts.regex.spaces, ' ' ) );\n\t\t\tc.$headers\n\t\t\t\t.add( $f )\n\t\t\t\t.removeClass( [ ts.css.header, c.cssHeader, c.cssAsc, c.cssDesc, ts.css.sortAsc, ts.css.sortDesc, ts.css.sortNone ].join( ' ' ) )\n\t\t\t\t.removeAttr( 'data-column' )\n\t\t\t\t.removeAttr( 'aria-label' )\n\t\t\t\t.attr( 'aria-disabled', 'true' );\n\t\t\t$r\n\t\t\t\t.find( c.selectorSort )\n\t\t\t\t.unbind( ( 'mousedown mouseup keypress '.split( ' ' ).join( c.namespace + ' ' ) ).replace( ts.regex.spaces, ' ' ) );\n\t\t\tts.restoreHeaders( table );\n\t\t\t$t.toggleClass( ts.css.table + ' ' + c.tableClass + ' tablesorter-' + c.theme, removeClasses === false );\n\t\t\t$t.removeClass(c.namespace.slice(1));\n\t\t\t// clear flag in case the plugin is initialized again\n\t\t\ttable.hasInitialized = false;\n\t\t\tdelete table.config.cache;\n\t\t\tif ( typeof callback === 'function' ) {\n\t\t\t\tcallback( table );\n\t\t\t}\n\t\t\tif ( ts.debug(c, 'core') ) {\n\t\t\t\tconsole.log( 'tablesorter has been removed' );\n\t\t\t}\n\t\t}\n\n\t};\n\n\t$.fn.tablesorter = function( settings ) {\n\t\treturn this.each( function() {\n\t\t\tvar table = this,\n\t\t\t// merge & extend config options\n\t\t\tc = $.extend( true, {}, ts.defaults, settings, ts.instanceMethods );\n\t\t\t// save initial settings\n\t\t\tc.originalSettings = settings;\n\t\t\t// create a table from data (build table widget)\n\t\t\tif ( !table.hasInitialized && ts.buildTable && this.nodeName !== 'TABLE' ) {\n\t\t\t\t// return the table (in case the original target is the table's container)\n\t\t\t\tts.buildTable( table, c );\n\t\t\t} else {\n\t\t\t\tts.setup( table, c );\n\t\t\t}\n\t\t});\n\t};\n\n\t// set up debug logs\n\tif ( !( window.console && window.console.log ) ) {\n\t\t// access $.tablesorter.logs for browsers that don't have a console...\n\t\tts.logs = [];\n\t\t/*jshint -W020 */\n\t\tconsole = {};\n\t\tconsole.log = console.warn = console.error = console.table = function() {\n\t\t\tvar arg = arguments.length > 1 ? arguments : arguments[0];\n\t\t\tts.logs[ ts.logs.length ] = { date: Date.now(), log: arg };\n\t\t};\n\t}\n\n\t// add default parsers\n\tts.addParser({\n\t\tid : 'no-parser',\n\t\tis : function() {\n\t\t\treturn false;\n\t\t},\n\t\tformat : function() {\n\t\t\treturn '';\n\t\t},\n\t\ttype : 'text'\n\t});\n\n\tts.addParser({\n\t\tid : 'text',\n\t\tis : function() {\n\t\t\treturn true;\n\t\t},\n\t\tformat : function( str, table ) {\n\t\t\tvar c = table.config;\n\t\t\tif ( str ) {\n\t\t\t\tstr = $.trim( c.ignoreCase ? str.toLocaleLowerCase() : str );\n\t\t\t\tstr = c.sortLocaleCompare ? ts.replaceAccents( str ) : str;\n\t\t\t}\n\t\t\treturn str;\n\t\t},\n\t\ttype : 'text'\n\t});\n\n\tts.regex.nondigit = /[^\\w,. \\-()]/g;\n\tts.addParser({\n\t\tid : 'digit',\n\t\tis : function( str ) {\n\t\t\treturn ts.isDigit( str );\n\t\t},\n\t\tformat : function( str, table ) {\n\t\t\tvar num = ts.formatFloat( ( str || '' ).replace( ts.regex.nondigit, '' ), table );\n\t\t\treturn str && typeof num === 'number' ? num :\n\t\t\t\tstr ? $.trim( str && table.config.ignoreCase ? str.toLocaleLowerCase() : str ) : str;\n\t\t},\n\t\ttype : 'numeric'\n\t});\n\n\tts.regex.currencyReplace = /[+\\-,. ]/g;\n\tts.regex.currencyTest = /^\\(?\\d+[\\u00a3$\\u20ac\\u00a4\\u00a5\\u00a2?.]|[\\u00a3$\\u20ac\\u00a4\\u00a5\\u00a2?.]\\d+\\)?$/;\n\tts.addParser({\n\t\tid : 'currency',\n\t\tis : function( str ) {\n\t\t\tstr = ( str || '' ).replace( ts.regex.currencyReplace, '' );\n\t\t\t// test for £$€¤¥¢\n\t\t\treturn ts.regex.currencyTest.test( str );\n\t\t},\n\t\tformat : function( str, table ) {\n\t\t\tvar num = ts.formatFloat( ( str || '' ).replace( ts.regex.nondigit, '' ), table );\n\t\t\treturn str && typeof num === 'number' ? num :\n\t\t\t\tstr ? $.trim( str && table.config.ignoreCase ? str.toLocaleLowerCase() : str ) : str;\n\t\t},\n\t\ttype : 'numeric'\n\t});\n\n\t// too many protocols to add them all https://en.wikipedia.org/wiki/URI_scheme\n\t// now, this regex can be updated before initialization\n\tts.regex.urlProtocolTest = /^(https?|ftp|file):\\/\\//;\n\tts.regex.urlProtocolReplace = /(https?|ftp|file):\\/\\/(www\\.)?/;\n\tts.addParser({\n\t\tid : 'url',\n\t\tis : function( str ) {\n\t\t\treturn ts.regex.urlProtocolTest.test( str );\n\t\t},\n\t\tformat : function( str ) {\n\t\t\treturn str ? $.trim( str.replace( ts.regex.urlProtocolReplace, '' ) ) : str;\n\t\t},\n\t\ttype : 'text'\n\t});\n\n\tts.regex.dash = /-/g;\n\tts.regex.isoDate = /^\\d{4}[\\/\\-]\\d{1,2}[\\/\\-]\\d{1,2}/;\n\tts.addParser({\n\t\tid : 'isoDate',\n\t\tis : function( str ) {\n\t\t\treturn ts.regex.isoDate.test( str );\n\t\t},\n\t\tformat : function( str ) {\n\t\t\tvar date = str ? new Date( str.replace( ts.regex.dash, '/' ) ) : str;\n\t\t\treturn date instanceof Date && isFinite( date ) ? date.getTime() : str;\n\t\t},\n\t\ttype : 'numeric'\n\t});\n\n\tts.regex.percent = /%/g;\n\tts.regex.percentTest = /(\\d\\s*?%|%\\s*?\\d)/;\n\tts.addParser({\n\t\tid : 'percent',\n\t\tis : function( str ) {\n\t\t\treturn ts.regex.percentTest.test( str ) && str.length < 15;\n\t\t},\n\t\tformat : function( str, table ) {\n\t\t\treturn str ? ts.formatFloat( str.replace( ts.regex.percent, '' ), table ) : str;\n\t\t},\n\t\ttype : 'numeric'\n\t});\n\n\t// added image parser to core v2.17.9\n\tts.addParser({\n\t\tid : 'image',\n\t\tis : function( str, table, node, $node ) {\n\t\t\treturn $node.find( 'img' ).length > 0;\n\t\t},\n\t\tformat : function( str, table, cell ) {\n\t\t\treturn $( cell ).find( 'img' ).attr( table.config.imgAttr || 'alt' ) || str;\n\t\t},\n\t\tparsed : true, // filter widget flag\n\t\ttype : 'text'\n\t});\n\n\tts.regex.dateReplace = /(\\S)([AP]M)$/i; // used by usLongDate & time parser\n\tts.regex.usLongDateTest1 = /^[A-Z]{3,10}\\.?\\s+\\d{1,2},?\\s+(\\d{4})(\\s+\\d{1,2}:\\d{2}(:\\d{2})?(\\s+[AP]M)?)?$/i;\n\tts.regex.usLongDateTest2 = /^\\d{1,2}\\s+[A-Z]{3,10}\\s+\\d{4}/i;\n\tts.addParser({\n\t\tid : 'usLongDate',\n\t\tis : function( str ) {\n\t\t\t// two digit years are not allowed cross-browser\n\t\t\t// Jan 01, 2013 12:34:56 PM or 01 Jan 2013\n\t\t\treturn ts.regex.usLongDateTest1.test( str ) || ts.regex.usLongDateTest2.test( str );\n\t\t},\n\t\tformat : function( str ) {\n\t\t\tvar date = str ? new Date( str.replace( ts.regex.dateReplace, '$1 $2' ) ) : str;\n\t\t\treturn date instanceof Date && isFinite( date ) ? date.getTime() : str;\n\t\t},\n\t\ttype : 'numeric'\n\t});\n\n\t// testing for ##-##-#### or ####-##-##, so it's not perfect; time can be included\n\tts.regex.shortDateTest = /(^\\d{1,2}[\\/\\s]\\d{1,2}[\\/\\s]\\d{4})|(^\\d{4}[\\/\\s]\\d{1,2}[\\/\\s]\\d{1,2})/;\n\t// escaped \"-\" because JSHint in Firefox was showing it as an error\n\tts.regex.shortDateReplace = /[\\-.,]/g;\n\t// XXY covers MDY & DMY formats\n\tts.regex.shortDateXXY = /(\\d{1,2})[\\/\\s](\\d{1,2})[\\/\\s](\\d{4})/;\n\tts.regex.shortDateYMD = /(\\d{4})[\\/\\s](\\d{1,2})[\\/\\s](\\d{1,2})/;\n\tts.convertFormat = function( dateString, format ) {\n\t\tdateString = ( dateString || '' )\n\t\t\t.replace( ts.regex.spaces, ' ' )\n\t\t\t.replace( ts.regex.shortDateReplace, '/' );\n\t\tif ( format === 'mmddyyyy' ) {\n\t\t\tdateString = dateString.replace( ts.regex.shortDateXXY, '$3/$1/$2' );\n\t\t} else if ( format === 'ddmmyyyy' ) {\n\t\t\tdateString = dateString.replace( ts.regex.shortDateXXY, '$3/$2/$1' );\n\t\t} else if ( format === 'yyyymmdd' ) {\n\t\t\tdateString = dateString.replace( ts.regex.shortDateYMD, '$1/$2/$3' );\n\t\t}\n\t\tvar date = new Date( dateString );\n\t\treturn date instanceof Date && isFinite( date ) ? date.getTime() : '';\n\t};\n\n\tts.addParser({\n\t\tid : 'shortDate', // 'mmddyyyy', 'ddmmyyyy' or 'yyyymmdd'\n\t\tis : function( str ) {\n\t\t\tstr = ( str || '' ).replace( ts.regex.spaces, ' ' ).replace( ts.regex.shortDateReplace, '/' );\n\t\t\treturn ts.regex.shortDateTest.test( str );\n\t\t},\n\t\tformat : function( str, table, cell, cellIndex ) {\n\t\t\tif ( str ) {\n\t\t\t\tvar c = table.config,\n\t\t\t\t\t$header = c.$headerIndexed[ cellIndex ],\n\t\t\t\t\tformat = $header.length && $header.data( 'dateFormat' ) ||\n\t\t\t\t\t\tts.getData( $header, ts.getColumnData( table, c.headers, cellIndex ), 'dateFormat' ) ||\n\t\t\t\t\t\tc.dateFormat;\n\t\t\t\t// save format because getData can be slow...\n\t\t\t\tif ( $header.length ) {\n\t\t\t\t\t$header.data( 'dateFormat', format );\n\t\t\t\t}\n\t\t\t\treturn ts.convertFormat( str, format ) || str;\n\t\t\t}\n\t\t\treturn str;\n\t\t},\n\t\ttype : 'numeric'\n\t});\n\n\t// match 24 hour time & 12 hours time + am/pm - see http://regexr.com/3c3tk\n\tts.regex.timeTest = /^(0?[1-9]|1[0-2]):([0-5]\\d)(\\s[AP]M)$|^((?:[01]\\d|[2][0-4]):[0-5]\\d)$/i;\n\tts.regex.timeMatch = /(0?[1-9]|1[0-2]):([0-5]\\d)(\\s[AP]M)|((?:[01]\\d|[2][0-4]):[0-5]\\d)/i;\n\tts.addParser({\n\t\tid : 'time',\n\t\tis : function( str ) {\n\t\t\treturn ts.regex.timeTest.test( str );\n\t\t},\n\t\tformat : function( str ) {\n\t\t\t// isolate time... ignore month, day and year\n\t\t\tvar temp,\n\t\t\t\ttimePart = ( str || '' ).match( ts.regex.timeMatch ),\n\t\t\t\torig = new Date( str ),\n\t\t\t\t// no time component? default to 00:00 by leaving it out, but only if str is defined\n\t\t\t\ttime = str && ( timePart !== null ? timePart[ 0 ] : '00:00 AM' ),\n\t\t\t\tdate = time ? new Date( '2000/01/01 ' + time.replace( ts.regex.dateReplace, '$1 $2' ) ) : time;\n\t\t\tif ( date instanceof Date && isFinite( date ) ) {\n\t\t\t\ttemp = orig instanceof Date && isFinite( orig ) ? orig.getTime() : 0;\n\t\t\t\t// if original string was a valid date, add it to the decimal so the column sorts in some kind of order\n\t\t\t\t// luckily new Date() ignores the decimals\n\t\t\t\treturn temp ? parseFloat( date.getTime() + '.' + orig.getTime() ) : date.getTime();\n\t\t\t}\n\t\t\treturn str;\n\t\t},\n\t\ttype : 'numeric'\n\t});\n\n\tts.addParser({\n\t\tid : 'metadata',\n\t\tis : function() {\n\t\t\treturn false;\n\t\t},\n\t\tformat : function( str, table, cell ) {\n\t\t\tvar c = table.config,\n\t\t\tp = ( !c.parserMetadataName ) ? 'sortValue' : c.parserMetadataName;\n\t\t\treturn $( cell ).metadata()[ p ];\n\t\t},\n\t\ttype : 'numeric'\n\t});\n\n\t/*\n\t\t██████ ██████ █████▄ █████▄ ▄████▄\n\t\t ▄█▀ ██▄▄ ██▄▄██ ██▄▄██ ██▄▄██\n\t\t▄█▀ ██▀▀ ██▀▀██ ██▀▀█ ██▀▀██\n\t\t██████ ██████ █████▀ ██ ██ ██ ██\n\t\t*/\n\t// add default widgets\n\tts.addWidget({\n\t\tid : 'zebra',\n\t\tpriority : 90,\n\t\tformat : function( table, c, wo ) {\n\t\t\tvar $visibleRows, $row, count, isEven, tbodyIndex, rowIndex, len,\n\t\t\t\tchild = new RegExp( c.cssChildRow, 'i' ),\n\t\t\t\t$tbodies = c.$tbodies.add( $( c.namespace + '_extra_table' ).children( 'tbody:not(.' + c.cssInfoBlock + ')' ) );\n\t\t\tfor ( tbodyIndex = 0; tbodyIndex < $tbodies.length; tbodyIndex++ ) {\n\t\t\t\t// loop through the visible rows\n\t\t\t\tcount = 0;\n\t\t\t\t$visibleRows = $tbodies.eq( tbodyIndex ).children( 'tr:visible' ).not( c.selectorRemove );\n\t\t\t\tlen = $visibleRows.length;\n\t\t\t\tfor ( rowIndex = 0; rowIndex < len; rowIndex++ ) {\n\t\t\t\t\t$row = $visibleRows.eq( rowIndex );\n\t\t\t\t\t// style child rows the same way the parent row was styled\n\t\t\t\t\tif ( !child.test( $row[ 0 ].className ) ) { count++; }\n\t\t\t\t\tisEven = ( count % 2 === 0 );\n\t\t\t\t\t$row\n\t\t\t\t\t\t.removeClass( wo.zebra[ isEven ? 1 : 0 ] )\n\t\t\t\t\t\t.addClass( wo.zebra[ isEven ? 0 : 1 ] );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tremove : function( table, c, wo, refreshing ) {\n\t\t\tif ( refreshing ) { return; }\n\t\t\tvar tbodyIndex, $tbody,\n\t\t\t\t$tbodies = c.$tbodies,\n\t\t\t\ttoRemove = ( wo.zebra || [ 'even', 'odd' ] ).join( ' ' );\n\t\t\tfor ( tbodyIndex = 0; tbodyIndex < $tbodies.length; tbodyIndex++ ) {\n\t\t\t\t$tbody = ts.processTbody( table, $tbodies.eq( tbodyIndex ), true ); // remove tbody\n\t\t\t\t$tbody.children().removeClass( toRemove );\n\t\t\t\tts.processTbody( table, $tbody, false ); // restore tbody\n\t\t\t}\n\t\t}\n\t});\n\n})( jQuery );\n\nreturn jQuery.tablesorter;\n}));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/tablesorter/dist/js/jquery.tablesorter.js\n// module id = ./node_modules/tablesorter/dist/js/jquery.tablesorter.js\n// module chunks = 1 4","import {runDBexport} from \"./run.db.export.js\";\n\nexport function swal_backup(wpPath, DBname){\n\tswal({\n\t\ttitle:\"backup WP\",\n\t\ttext: \"WP backup will be both in \\n OZwpDev's basedir /tmp folder and \\n WP's upload/ozwpdev folder...\",\n\t\ticon: \"warning\",\n\t\tcloseOnClickOutside: false,\n\t\tdangerMode: true,\n\t\tbuttons: {\n\t\t\tcancel: true,\n\t\t\t\tconfirm: {\n\t\t\t\ttext: \"OK, backup now\",\n\t\t\t\tvalue: true,\n\t\t\t\tvisible: true,\n\t\t\t\tclassName: \"bg-danger\",\n\t\t\t\tcloseModal: false\n\t\t\t\t}\n\t\t\t},\n\t}).then( (value) => {\n\t\tif(value){\n\t\t\treturn runDBexport(wpPath, DBname, \"tmp\");\n\t\t}\n\t}).then( (value) => {\n\t\tif(value){\n\t\t\treturn runDBexport(wpPath, DBname, \"wp\");\n\t\t} else {\n\t\t\tswal(\"WP Backup\", \"something went wrong!\",\"error\");\n\t\t}\n\t}).then( (value) => {\n\t\tif(value){\n\t\t\tswal(\"WP Backup\", \"Successful!\",\"success\");\n\t\t} else {\n\t\t\tswal(\"WP Backup\", \"process canceled\",\"warning\");\n\t\t}\n\t});\n\n}//end function\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/editwp.backup.js\n// module id = ./src/editwp.backup.js\n// module chunks = 1","import {runBash} from \"./run.bash.js\";\nimport {runDBdelete} from \"./run.db.delete.js\";\nimport {runDBexport} from \"./run.db.export.js\";\n\nexport function swal_delete(wpName, wpPath, DBname){\n\n\tswal({\n\t\ttitle:\"DELETE WP\",\n\t\tcontent:{\n\t\t\telement:\"span\",\n\t\t\tattributes:{\n\t\t\tclassName:\"alert alert-danger\",\n\t\t\tinnerHTML:\"Do you want to delete \"+wpName+\" folder and drop \"+DBname+\"?\",\n\t\t\t}\n\t\t},\n\t\tdangerMode:true,\n\t\ticon: \"warning\",\n\t\tcloseOnClickOutside: false,\n\t\tbuttons: {\n\t\t\tcancel: true,\n\t\t\t\tconfirm: {\n\t\t\t\ttext: \"OK, delete everything\",\n\t\t\t\tvalue: true,\n\t\t\t\tvisible: true,\n\t\t\t\tclassName: \"bg-danger\",\n\t\t\t\tcloseModal: false\n\t\t\t\t}\n\t\t\t},\n\t}).then((value)=>{\n\t\tif(value){\n\t\t\treturn runDBexport(wpPath, DBname, \"tmp\");\n\t\t}\n\t}).then((value)=>{\n\t\tif(value){\n\t\t\treturn runDBdelete(DBname);\n\t\t} else {\n\t\t\tswal(\"oops\",\"DB Export \\n something went wrong\",\"error\");\n\t\t}\n\t}).then((value)=>{\n\t\tif(value){\n\t\t\treturn runBash(\"rm -rf \"+wpPath);\n\t\t} else {\n\t\t\tswal(\"oops\",\"DB delete \\n something went wrong\",\"error\");\n\t\t}\n\t}).then((value)=>{\n\t\tif(value){\n\t\t\tswal(\"DELETED\",\"WP: \"+wpName,\"success\").then((value)=>{\n\t\t\t\twindow.location=\"./editwp.php\";\n\t\t\t});\n\t\t} else{\n\t\t\tswal(\"oops\",\"process canceled\",\"warning\");\n\t\t}\n\t});\n\n\n}//end of function\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/editwp.delete.js\n// module id = ./src/editwp.delete.js\n// module chunks = 1","import {runWPlock} from \"./run.wp.lock.js\";\nimport {runFinder} from \"./run.finder.js\";\nimport {runWPconfigGet} from \"./run.wp.config.get.js\";\nimport {runBash} from \"./run.bash.js\";\n\n\nimport {swal_backup} from \"./editwp.backup.js\";\nimport {swal_delete} from \"./editwp.delete.js\";\n\nimport \"./editwp.tab.config.js\";\nimport \"./editwp.tab.options.js\";\nimport \"./editwp.tab.plugins.js\";\nimport \"./editwp.tab.themes.js\";\nimport \"./editwp.tab.users.js\";\n\nimport \"tablesorter/dist/js/jquery.tablesorter.js\";\nimport \"tablesorter/dist/css/theme.bootstrap_4.min.css\";\n\n\n\n$(document).ready(function(){ \n\t\n\n\t/*********************** select_wp on change ***********************/\n\t$(\"#select_wp\").on(\"change\", function(e){\n\t\twindow.location= \"./editwp.php?wp=\" + $(e.target).val();\n\t});\n\n\t/*********************** wpLock status ***********************/\n\t$(function(){\n\n\t\tif($(\"#select_wp\").val()!==\"0\"){\n\t\t\tif(runWPlock($(\"#select_wp\").val(), \"status\")){\n\t\t\t\t$(\"#btn_del_wp\").prop(\"disabled\", true)\n\t\t\t\t.attr(\"title\", \"you cannot delete this wp \\n ozwpdev.txt must exists in the wp folder...\")\n\t\t\t\t\n\n\t\t\t}\n\n\t\t\t$(\".update-tabs tr:eq(1) td:eq(1)\").text($(\"#select_wp\").val());\n\n\t\t}\n\t});\n\n\t/*********************** open WP in finder + open PhpMyAdmin + open WP-ADMIN***********************/\n \t$(\".update-tabs tr\").on(\"click\", function(e){\n \t\tvar tr=$(e.target).closest(\"tr\");\n \t\tvar txt=$(tr).find(\"td:eq(1)\").text();\n \t\tvar wpPath=$(tr).parent().find(\"td:eq(1)\").text();\n \t\tif($(tr).find(\"td:eq(0) i\").hasClass(\"fa-file\")){\n \t\t\trunFinder(txt);\n \t\t} else if($(tr).find(\"td:eq(0) i\").hasClass(\"fa-database\")) {\n \t\t\twindow.open(\"http://localhost/phpmyadmin/db_structure.php?db=\"+txt);\n \t\t} else if($(tr).find(\"td:eq(0) i\").hasClass(\"fa-user-secret\")){\n \t\t\trunBash(\"wp admin --path=\" + wpPath);\n \t\n \t\t}\n \t\t\n \t});\n\n \t/*********************** runDBexport - Export DB ***********************/\n \t$(\"#btn_backup_wp\").on(\"click\", function(e){\n \t\tvar DBname=$(\".update-tabs tr:eq(1) td:eq(1)\").text();\n \t\tvar wpPath=$(\".update-tabs tr:eq(0) td:eq(1)\").text();\n \t\tswal_backup(wpPath, DBname);\n \t});\n\n \t/*********************** runDELwp - Delete WP ***********************/\n \t$(\"#btn_del_wp\").on(\"click\", function(e){\n \t\tvar wpPath=$(e.target).attr(\"data-path\");\n \t\tvar wpName=$(e.target).attr(\"data-wp\");\n \t\tvar DBname=$(\".update-tabs tr:eq(1) td:eq(1)\").text();\n \t\tswal_delete(wpName, wpPath, DBname);\n \t});\n\n\n \t/*********************** tabs-edit on tab shown ***********************/\n \t$(document).find('#tabs-edit a[data-toggle=\"tab\"]').on('shown.bs.tab', function (e) {\n\n \t\t$(\"#tabs-edit\").find(\"i\").removeClass(\"fa-spin\");\n \t\tif($(e.target).attr(\"href\")!==\"#home\"){\n \t\t\t$(e.target).find(\"i\").toggleClass('fa-spin');\n\t \t\t\n\t \t\tvar theTab=$(e.target).attr(\"href\").replace(\"#\",\"\");\n\t \t\tvar wpPath=$(\".update-tabs tr:eq(0) td:eq(1)\").text();\n\t \t\t$.busyLoadFull(\"show\",{text:\"tab loading...\"});\n\t \t\tLoadEditTab(theTab, wpPath).then(()=>{\n\t \t\t\t$.busyLoadFull(\"hide\");\n\t \t\t});\n\t \t\t\n\t \t\t\n\n \t\t}\n\n\n\n \t});//tabs-edit on tab shown\n\n\n\n});//end of Document Ready Function\n\nexport function LoadEditTab(theTab, wpPath){\n\n\tvar dfd = new $.Deferred();\n\n\t$(document).find(\"#tab-\"+theTab).load(\"editwp.tab.\"+theTab+\".php\",{wpPath:wpPath},function(){\n\t\t$('[data-toggle=\"tooltip\"]').tooltip();\n\t\t$(document).find(\"#tabs-edit i\").removeClass(\"fa-spin\");\n\t\tdfd.resolve(\"done\");\n\n\t});\n\treturn dfd.promise();\n}\n\n/*********************** Loads or Reloads the tab contents with a given inner-tab ***********************/\nexport function loadMe(theTab, what=\"home\"){\n\t\t$('#tabs-edit a[data-toggle=\"tab\"][href=\"#'+theTab+'\"]').tab(\"show\");\n\t\t$.busyLoadFull(\"show\",{text:\"tab loading...\"});\n\t\tLoadEditTab(theTab,$(\"table.update-tabs tbody tr:eq(0) td:eq(1)\").text().trim()).done(function(){\n\n\t\t\t$(\"#tabs-\"+theTab+\" a[href='#\"+theTab+\"-\"+what+\"']\").tab(\"show\");\n\n\t\t}).then(()=>{\n\t \t\t\t$.busyLoadFull(\"hide\");\n\t \t\t});\n\n\t\t/*********************** reload tab on dblclick ***********************/\n\t\t$(document).on(\"dblclick\",\".card a.nav-link.active\",function(e){\n\t\t\t\t\t\n\t\t\tvar tabs=$(e.target).attr(\"href\").match(/\\w+/ig);\n\n\t\t\tif(tabs.length>1){\n\t\t\t\tloadMe(tabs[0],tabs[1]);\n\t\t\t\tswal(\"reloaded\",tabs[0]+\"-\"+tabs[1],{buttons:false,timer:1000});\n\t\t\t} else {\n\t\t\t\tvar tabs=$(e.target).closest(\".card\").find(\".card a.nav-link.active\").attr(\"href\").match(/\\w+/ig);\n\t\t\t\tloadMe(tabs[0],tabs[1]);\n\t\t\t\tswal(\"reloaded\",tabs[0]+\"-\"+tabs[1],{buttons:false,timer:1000});\n\t\t\t}\n\t\t\t\n\t\t});\n\t}\n\n\n\n\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/editwp.js\n// module id = ./src/editwp.js\n// module chunks = 1","import {runBash} from \"./run.bash.js\";\n\n\t/*********************** reload tab contents and inner-tabs ***********************/\n\timport {LoadEditTab, loadMe} from \"./editwp.js\";\n\t//loadMe(\"config\",\"lang\");\n\n\n$(document).on(\"shown.bs.tab\",\"#tabs-config\",function(e){\n\n\tvar theTabb=$(e.target).attr(\"href\").match(/\\w+/ig)[1];\n\t\n\tif(theTabb==\"debug\"){\n\t\t//$(e.target).parent().find(\"i\").toggleClass('fa-spin');\n\t\trunDebugValues(e, \"get\");\n\t\t//$(e.target).parent().find(\"i\").toggleClass('fa-spin');\n\t}\n\n});\n\n\n\n/*********************** WP_LANG ***********************/\n$(document).on(\"change\", \"#lang-select\", function(e){\n\t\n\tvar cmd = \"wp config set WP_LANG \" + $(e.target).val() \n\t\t\t+ \" --type=constant \"\n\t\t\t+ \" --path=\" + $(\".update-tabs tr:eq(0) td:eq(1)\").text();\n\trunBash(cmd);\n\tswal(\"config\", \"WP_LANG = \"+ $(e.target).val(), \"success\");\n});\n\n/*********************** DEBUG GET VALUES ***********************/\n$(document).on(\"click\",\"#btn-get-debug-values\", function(e){\n\trunDebugValues(e, \"get\");\n});\n\n/*********************** DEBUG SET DEFAULT VALUES ***********************/\n$(document).on(\"click\",\"#btn-set-debug\", function(e){\n\trunDebugValues(e, \"set\");\n});\n\n/*********************** DEBUG UNSET DEFAULT VALUES ***********************/\n$(document).on(\"click\",\"#btn-unset-debug\", function(e){\n\trunDebugValues(e, \"unset\");\n});\n\n/*********************** DEBUG DELETE VALUES ***********************/\n$(document).on(\"click\",\"#btn-del-debug\", function(e){\n\trunDebugValues(e, \"del\");\n});\n\n/*********************** DEBUG DELETE single VALUES ***********************/\n$(document).on(\"click\",\"button[name=btn-del-debug-single]\", function(e){\n\tvar debug=$(e.target).closest(\"tr\").find(\"td:eq(0)\").text();\n\tvar wpPath=$(e.target).closest(\"tr\").find(\"td:eq(4) button\").attr(\"data-path\");\n\trunBash(\"wp config delete \" + debug + \" --path=\" + wpPath + \" --type=constant\");\n\trunDebugValues(e, \"get\");\n});\n\n/*********************** Change Debug Value - INPUT ***********************/\n$(document).on(\"change\",\"input[data-config='debug']\", function(e){\n\tvar valyu=$(e.target).val();\n\tvar debug=$(e.target).attr(\"name\");\n\tvar wpPath=$(\".update-tabs tr:eq(0) td:eq(1)\").text();\n\trunBash(\"wp config set \" + debug + \" \" + valyu + \" --type=constant --raw --path=\" + wpPath );\n\trunDebugValues(e, \"get\");\n});\n\n\n\n/*********************** function: runDebugValues ***********************/\nfunction runDebugValues(e, run){\n\t$.ajax({\n\t\turl:\"editwp.tab.config.debug.php\",\n\t\tdataType:\"json\",\n\t\tmethod:\"post\",\n\t\tasync: true,\n\t\tdata:{\n\t\t\tdo:\"run\",\n\t\t\twp:\"debug\",\n\t\t\trun:run,\n\t\t\twpPath:$(\".update-tabs tr:eq(0) td:eq(1)\").text()\n\t\t},\n\t\tbeforeSend: function(){\n\t\t\t$(e.target).parent().find(\"i\").addClass('fa-spin');\n\t\t\t$(e.target).prop(\"disabled\", true);\n\t\t},\n\t\tsuccess:function(data){\n\t\t\t$(e.target).parent().find(\"i\").removeClass('fa-spin');\n\t\t\t$(e.target).prop(\"disabled\", false);\n\t\t\tif(run==\"get\"){\n\t\t\t$(\"#table-debug\").removeClass(\"invisible\");\n\t\t\t$(\"#btn-get-debug-values\").addClass(\"invisible\");\n\t\t\t$(\"#row-set-debug\").removeClass(\"invisible\");\n\t\t\t} \n\n\t\t\t$.each(data, function(i,v){\n\n\t\t\t\tvar TR=$(\"#table-debug tr td\").filter(function(){\n\t\t\t\t\treturn $(this).text()===i;\n\t\t\t\t}).parent()\n\n\t\t\t\tswitch(v){\n\t\t\t\t\tcase \"TRUE\":\n\t\t\t\t\tTR.find(\"td:eq(1)\").css(\"color\",\"green\");\n\t\t\t\t\tTR.find(\"td:eq(2) input\").prop(\"checked\", \"checked\");\n\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase \"FALSE\":\n\t\t\t\t\tTR.find(\"td:eq(1)\").css(\"color\",\"red\");\n\t\t\t\t\tTR.find(\"td:eq(3) input\").prop(\"checked\", \"checked\");\n\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\tTR.find(\"td:eq(1)\").css(\"color\",\"darkorange\");\n\t\t\t\t\tTR.find(\"td:eq(2) input\").prop(\"checked\", false);\n\t\t\t\t\tTR.find(\"td:eq(3) input\").prop(\"checked\", false);\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\tswitch (run){\n\t\t\t\tcase \"set\":\n\t\t\t\tswal(\"Debug Set\", \"all debug default values are set\", \"success\");\n\t\t\t\tbreak;\n\t\t\t\tcase \"unset\":\n\t\t\t\tswal(\"Debug UnSet\", \"all debug default values are unset\", \"success\");\n\t\t\t\tbreak;\n\t\t\t\tcase \"del\":\n\t\t\t\tswal(\"Debug Delete\", \"all debug values are deleted from config.php\", \"success\");\n\t\t\t}\n\n\n\t\t\t});\n\n\t\t},\n\t\terror:function(jqXHR,textStatus,errorThrown){\n\t\t\tswal(\"oops!\", errorThrown, \"error\");\n\t\t}\n\t});\n}//end getDebugValues\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/editwp.tab.config.js\n// module id = ./src/editwp.tab.config.js\n// module chunks = 1","import {runBash} from \"./run.bash.js\";\n\n/*********************** reload tab contents and inner-tabs ***********************/\n\timport {LoadEditTab, loadMe} from \"./editwp.js\";\n\t//loadMe(\"options\",\"list\");\n\n/*********************** search / filter option name ***********************/\n$(document).on(\"keyup\", \"#filter-option-table\", function(e){\n\tvar ne=$(e.target);\n\tvar VaL=ne.val();\n\n\tswitch(e.which){\n\t\tcase 13:\n\t\t$(e.target).blur();\n\t\tbreak;\n\n\t\tcase 27:\n\t\t$(e.target).blur().val(\"\");\n\t\t$(\"#table-options-all tbody tr\").show();\n\t\tbreak;\n\n\t\tdefault:\n\t\tif(VaL.length>2){\n\t\t\t$(\"#table-options-all tbody tr\").hide();\n\t\t\t$(\"#table-options-all tbody tr:contains('\"+VaL+\"')\").show();\n\t\t}\n\t\tbreak;\n\t}\n\n});\n\n/*********************** on dbl click option ***********************/\n$(document).on(\"dblclick\",\"#table-options-all tr\", function(e){\n\n\tvar TR = $(e.target).closest('tr');\n\tvar option_name=TR.find(\"td:eq(0)\").text();\n\tvar option_value=TR.find(\"td:eq(1)\").text();\n\tswal(\n\t\toption_name,\n\t\toption_value\n\t\t)\n\n});\n\n/*********************** update options ***********************/\n$(document).on(\"click\",\"table[id^='table-options-'] button\", function(e){\n\tvar option=$(e.target).closest(\"tr\").find(\"td:eq(0)\").text().trim();\n\tvar VaL=$(e.target).closest(\"tr\").find(\"input\").val();\n\tvar cmd=\"wp option update \" + option + \" '\" + VaL + \"' --path=\" + $(\".update-tabs tr:eq(0) td:eq(1)\").text();\n\t$(e.target).toggleClass('fa-spin fa-2x');\n\tvar status=runBash(cmd);\n\t$(e.target).toggleClass('fa-spin fa-2x');\n\tif(status){\n\t\tswal({\n\t\t\ttitle:\"updated\",\n\t\t\ttimer:2000,\n\t\t\ticon:\"success\",\n\t\t\ttext: option + \": \\n\" + VaL,\n\t\t\tbuttons:false\n\t\t});\n\t}\n\n});\n\n/*********************** dblclik default value of options ***********************/\n$(document).on(\"dblclick\",\"table[id^='table-options-'] tbody a\", function(e){\n\tvar option=$(e.target).closest(\"tr\").find(\"td:eq(0)\").text().trim();\n\tvar defVal=$(e.target).attr(\"data-default\");\n\tvar inp=$(e.target).closest(\"tr\").find(\"input\");\n\tinp.val(defVal);\n\tinp.focus();\n\t\n});\n\n/*********************** goto settings page ***********************/\n$(document).on(\"click\", \"#btn-goto-settings\", function(e){\n\nwindow.location=$(e.target).attr(\"data-location\");\n\n});\n\n/*********************** update all option with default values ***********************/\n$(document).on(\"click\", \"#btn-update-all-default-options\", function(e){\n\tvar TR=$(document).find(\"#table-update-all-default-options tbody tr\");\n\t$(e.target).toggleClass(\"fa-spin\");\n\t$.each(TR, function(i,v){\n\t\tvar cmd=\"wp option update \";\n\t\tcmd+=$(v).find(\"td\").eq(0).text().trim();\n\t\tcmd+=\" '\";\n\t\tcmd+=$(v).find(\"td\").eq(1).text().trim();\n\t\tcmd+=\"' \";\n\t\tcmd+=\"--path=\" + $(\".update-tabs tr:eq(0) td:eq(1)\").text();\n\t\t\n\t\tvar status=runBash(cmd);\n\t\tif(status){\n\t\t\t$(v).find(\"td\").eq(2).removeClass('fa-minus').addClass('fa-check').css(\"color\", \"green\");\n\t\t} else {\n\t\t\t$(v).find(\"td\").eq(2).removeClass('fa-minus').addClass('fa-times').css(\"color\", \"red\");\n\t\t}\n\t\t\n\t});\n\t$(e.target).toggleClass(\"fa-spin\");\n\t\n});\n\n\n\n\n\n\n\n\n\n\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/editwp.tab.options.js\n// module id = ./src/editwp.tab.options.js\n// module chunks = 1","import {runBash} from \"./run.bash.js\";\n\n\n\n\n\t/*********************** reload tab contents and inner-tabs ***********************/\n\timport {LoadEditTab, loadMe} from \"./editwp.js\";\n\t//loadMe(\"plugins\",\"list\");\n\n\nvar theTabb;\n$(document).on('shown.bs.tab', '#tabs-plugins a[data-toggle=\"tab\"]', function (e) {\n\n\ttheTabb= $(e.target).attr(\"href\").match(/\\w+/ig)[1].trim();\n\n});\n\n/*********************** HOME - default plugins list dblclikk to read better ***********************/\n$(document).on(\"dblclick\",\"#plugins-home table tbody tr\",function(e){\n\n\tvar plugin=$(e.target).closest(\"tr\").find(\"td:eq(0)\").text();\n\tvar group=$(e.target).closest(\"tr\").find(\"td:eq(1)\").text();\n\tvar def=$(e.target).closest(\"tr\").find(\"td:eq(2)\").text();\n\tvar desc=$(e.target).closest(\"tr\").find(\"td:eq(3)\").text();\n\tvar comment=$(e.target).closest(\"tr\").find(\"td:eq(4)\").text();\n\tvar msg = \"default (URL): \" + def + \"
\" +\n\t\t\"group: \" + group + \"
\" +\n\t\t\"desc: \" + desc + \"
\" +\n\t\t\"comment: \" + comment\n\n\tswal({\n\t\t\ttitle:plugin,\n\t\t\tcontent:{\n\t\t\t\telement:\"div\",\n\t\t\t\tattributes:{\n\t\t\t\t\tclassName:\"alert alert-warning text-left\",\n\t\t\t\t\tinnerHTML:msg\n\t\t\t\t}\n\t\t\t},\n\t\t\tclassName:\"alert-info\"\n\t\t\t});\n\n\n\n});\n\n\n/*********************** plugin info ***********************/\n$(document).on(\"dblclick\",\"[id^=table-plugins-] tbody tr td:nth-child(2)\",function(e){\n\tvar plugin=$(e.target).text().trim();\n\tvar wpPath=$(\"table.update-tabs tbody tr:eq(0) td:eq(1)\").text();\n\trunBash(\"wp plugin get \" + plugin + \" --format=json --path=\"+wpPath).done(function(status,output){\n\n\t\tif(status===0){\n\t\t\toutput=$.parseJSON(output);\n\t\t\tvar info=\"\";\n\t\t\t$.each(output, function(i,v){\n\t\t\t\tinfo+=\"\" + i + \": \" + v + \"
\";\n\t\t\t})\n\t\t\tswal({\n\t\t\t\ttitle:plugin,\n\t\t\t\tcontent:\n\t\t\t\t{\n\t\t\t\telement:\"div\",\n\t\t\t\t\tattributes:{\n\t\t\t\t\tclassName:\"alert alert-info text-left\",\n\t\t\t\t\tinnerHTML:info\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t});\n\t\t} else {\n\t\t\tswal(plugin,\"info is available only after install\",\"info\");\n\t\t}\n\t});\n});\n\n/*********************** single plugin update ***********************/\n$(document).on(\"click\", \"button[name='btn-plugins-update']\", function(e){\n\tvar plugin=$(e.target).attr(\"data-plugin\");\n\tvar wpPath=$(e.target).attr(\"data-path\");\n\tvar thisTD=$(e.target).closest(\"td\");\n\trunBash(\"wp plugin update \"+plugin+\" --path=\"+wpPath).done(function(status,output){\n\t\tif(status===0){\n\t\t\tswal(plugin,output,\"success\", {timer:2000, buttons:false}).then(()=>{\n\t\t\t\tloadMe(\"plugins\",theTabb);\n\t\t\t});\n\t\t} else {\n\t\t\tswal(\"ooops\",output,\"error\");\n\t\t}\n\n\t});\n});\n\n/*********************** single plugin delete ***********************/\n$(document).on(\"click\",\"button[name='btn-plugins-delete']\", function(e){\n\tvar plugin=$(e.target).attr(\"data-plugin\");\n\tvar wpPath=$(e.target).attr(\"data-path\");\n\n\t\tswal({\n\t\t\ttitle:plugin,\n\t\t\ticon:\"warning\",\n\t\t\ttext: \"delete this plugin?\",\n\t\t\tdangerMode:true,\n\t\t\tbuttons:{\n\t\t\t\tcancel:true,\n\t\t\t\tconfirm:{\n\t\t\t\t\ttext:\"delete Plugin\"\n\t\t\t\t}\n\t\t\t}\n\n\t\t}).then((value)=>{\n\t\t\tif(value){\n\t\t\t\trunBash(\"wp plugin delete \"+plugin+\" --path=\"+wpPath).done(function(status, output){\n\t\t\t\tif(status===0){\n\t\t\t\t\tswal(plugin,output,\"success\", {timer:2000, buttons:false}).then(()=>{\n\t\t\t\t\t\tloadMe(\"plugins\",theTabb);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tswal(\"ooops\",output,\"error\");\n\t\t\t\t}\n\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n});\n\n/*********************** single plugin Install ***********************/\n$(document).on(\"click\",\"button[name='btn-plugins-install']\", function(e){\n\tvar plugin=$(e.target).attr(\"data-plugin\");\n\tvar wpPath=$(e.target).attr(\"data-path\");\n\n\trunBash(\"wp plugin install \"+plugin+\" --path=\"+wpPath).done(function(status,output){\n\t\tif(status===0){\n\t\t\tswal(\"installed!\",plugin + \" is installed!\",\"success\",{buttons:false,timer:2000}).then(()=>{\n\t\t\t\tloadMe(\"plugins\",theTabb);\n\t\t\t});\n\t\t} else {\n\t\t\tswal(\"ooops\",\"something went wrong\",\"error\",{buttons:false,timer:2000});\n\t\t}\n\t});\n\n\n});\n\n\n/*********************** any checkbox checked ***********************/\n$(document).on(\"change\",\"input[name='check-plugins']\",function(e){\n\t\n\tif($(\"#table-plugins-\"+theTabb+\" tbody input:checked\").length>0){\n\t\t$(\"#table-plugins-\"+theTabb+\" tfoot\").removeClass('d-none');\t\n\t} else {\n\t\t$(\"#table-plugins-\"+theTabb+\" tfoot\").addClass('d-none');\n\t}\n \n});\n\n/*********************** check-pugins-all ***********************/\n$(document).on(\"change\",\"input[name^=check-plugins-all-]\", function(e){\n\t\tvar status = $(e.target).prop(\"checked\");\n\t\t$(\"#table-plugins-\"+theTabb+\" tbody input[type='checkbox']\").prop(\"checked\", status).trigger(\"change\");\n});\n\n\n/*********************** select-plugins-[theTabb]***********************/\n$(document).on(\"click\",\"[id^=btn-select-plugins-]\", function(e){\n\tvar VaL=$(\"#select-plugins-\"+theTabb).val();\n\tvar wpPath=$(e.target).attr(\"data-path\");\n\tvar ps=\"\";\n\t$(\"#table-plugins-\"+theTabb+\" tbody input:checked\").each(function(i,v){\n\t \n\t\tps+=$(v).closest(\"tr\").find(\"td:eq(1)\").text().trim() + \" \";\n\n\t});\n\tps.trim();\n\n\tswitch(parseInt(VaL)){\n\t\tcase 1:\n\t\t\trunBash(\"wp plugin activate \"+ps+\" --path=\"+wpPath).done(function(status,output){\n\t\t\t\tif(status===0){\n\t\t\t\t\tswal(\"all activated\",output,\"success\",{buttons:false,timer:2000}).then(()=>{\n\t\t\t\t\t\tloadMe(\"plugins\",theTabb);\n\t\t\t\t\t});\n\t\t\t\t} else {swal(\"oops\",output,\"error\");}\n\t\t\t});\n\t\tbreak;\n\t\tcase 2:\n\t\t\trunBash(\"wp plugin deactivate \"+ps+\" --path=\"+wpPath).done(function(status,output){\n\t\t\t\tif(status===0){\n\t\t\t\t\tswal(\"all deactivated\",output,\"success\",{buttons:false,timer:2000}).then(()=>{\n\t\t\t\t\t\tloadMe(\"plugins\",theTabb);\n\t\t\t\t\t});\n\t\t\t\t} else {swal(\"oops\",output,\"error\");}\n\t\t\t});\n\t\tbreak;\n\t\tcase 3:\n\t\t\trunBash(\"wp plugin install \"+ps+\" --path=\"+wpPath).done(function(status,output){\n\t\t\t\tif(status===0){\n\t\t\t\t\tswal(\"all installed\",output,\"success\",{buttons:false,timer:2000}).then(()=>{\n\t\t\t\t\t\tloadMe(\"plugins\",theTabb);\n\t\t\t\t\t});\n\t\t\t\t} else {swal(\"oops\",output,\"error\");}\n\t\t\t});\n\t\tbreak;\n\t\tcase 4:\n\t\t\trunBash(\"wp plugin update \"+ps+\" --path=\"+wpPath).done(function(status,output){\n\t\t\t\tif(status===0){\n\t\t\t\t\tswal(\"all updated\",output,\"success\",{buttons:false,timer:2000}).then(()=>{\n\t\t\t\t\t\tloadMe(\"plugins\",theTabb);\n\t\t\t\t\t});\n\t\t\t\t} else {swal(\"oops\",output,\"error\").then(()=>{\n\t\t\t\t\t\tloadMe(\"plugins\",theTabb);\n\t\t\t\t\t});}\n\t\t\t});\n\t\tbreak;\n\t\tcase 5:\n\t\t\trunBash(\"wp plugin delete \"+ps+\" --path=\"+wpPath).done(function(status,output){\n\t\t\t\tif(status===0){\n\t\t\t\t\tswal(\"all deleted\",output,\"success\",{buttons:false,timer:2000}).then(()=>{\n\t\t\t\t\t\tloadMe(\"plugins\",theTabb);\n\t\t\t\t\t});\n\t\t\t\t} else {swal(\"oops\",output,\"error\");}\n\t\t\t});\n\t\tbreak;\n\n\t}\n});\n\n/*********************** filter plugins ***********************/\n$(document).on(\"keyup\", \"input[name='filter-plugins']\", function(e){\n\tvar ne=$(e.target);\n\tvar VaL=$(e.target).val();\n\t$(e.target).attr(\"AUTOCOMPLETE\",\"OFF\");\n\n\tswitch(e.which){\n\t\tcase 13:\n\t\t$(e.target).blur();\n\t\tbreak;\n\n\t\tcase 27:\n\t\t$(\"#table-plugins-\"+theTabb+\" thead th input[name='filter-plugins']\").blur().val(\"\");\n\t\t$(\"#table-plugins-\"+theTabb+\" tbody tr\").show();\n\t\tbreak;\n\n\t\tdefault:\n\t\t$(\"#table-plugins-\"+theTabb+\" tbody tr\").hide();\n\t\t$(\"#table-plugins-\"+theTabb+\" tbody tr td:nth-child(2):contains('\"+VaL+\"')\").closest(\"tr\").show();\n\n\t\tbreak;\n\t}\n\n});\n\n\n/*********************** toggle active/inactive status - dblclick td ***********************/\n$(document).on(\"dblclick\",\"[id^=table-plugins-] tbody tr td:nth-child(3)\", function(e){\n\tvar status=$(e.target).text().trim();\n\tvar plugin=$(e.target).closest(\"tr\").find(\"td:eq(1)\").text().trim();\n\tvar wpPath=$(\"table.update-tabs tbody tr:eq(0) td:eq(1)\").text();\n\n\tif(status==\"active\" || status==\"inactive\"){\n\n\t\trunBash(\"wp plugin toggle \"+plugin+\" --path=\"+wpPath).done(function(exit, output){\n\t\t\tif(exit===0){\n\t\t\t\tswal(plugin,output,\"success\",{buttons:false,timer:2000}).then(()=>{\n\t\t\t\t\tloadMe(\"plugins\",theTabb);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tswal(\"ooops\",output,\"error\",{buttons:false,timer:2000});\n\t\t\t}\n\t\t});\n\n\t} else {\n\n\t\tswal(\"only installed plugins may toggle status!\",{buttons:false, timer:2000, icon:\"warning\"});\n\t}\n\t\n});\n\n\n\n\n\n\n\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/editwp.tab.plugins.js\n// module id = ./src/editwp.tab.plugins.js\n// module chunks = 1","import {runBash} from \"./run.bash.js\";\n\n\n\n\n\t/*********************** reload tab contents and inner-tabs ***********************/\n\timport {LoadEditTab, loadMe} from \"./editwp.js\";\n\t//loadMe(\"themes\",\"list\");\n\n\nvar theTabb;\n$(document).on('shown.bs.tab', '#tabs-themes a[data-toggle=\"tab\"]', function (e) {\n\n\ttheTabb= $(e.target).attr(\"href\").match(/\\w+/ig)[1].trim();\n\n});\n\n/*********************** HOME - default themes list dblclikk to read better ***********************/\n$(document).on(\"dblclick\",\"#themes-home table tbody tr\",function(e){\n\n\tvar theme=$(e.target).closest(\"tr\").find(\"td:eq(0)\").text();\n\tvar group=$(e.target).closest(\"tr\").find(\"td:eq(1)\").text();\n\tvar def=$(e.target).closest(\"tr\").find(\"td:eq(2)\").text();\n\tvar desc=$(e.target).closest(\"tr\").find(\"td:eq(3)\").text();\n\tvar comment=$(e.target).closest(\"tr\").find(\"td:eq(4)\").text();\n\tvar msg = \"default (URL): \" + def + \"
\" +\n\t\t\"group: \" + group + \"
\" +\n\t\t\"desc: \" + desc + \"
\" +\n\t\t\"comment: \" + comment\n\n\tswal({\n\t\t\ttitle:theme,\n\t\t\tcontent:{\n\t\t\t\telement:\"div\",\n\t\t\t\tattributes:{\n\t\t\t\t\tclassName:\"alert alert-warning text-left\",\n\t\t\t\t\tinnerHTML:msg\n\t\t\t\t}\n\t\t\t},\n\t\t\tclassName:\"alert-info\"\n\t\t\t});\n\n\n\n});\n\n\n/*********************** theme info ***********************/\n$(document).on(\"dblclick\",\"[id^=table-themes-] tbody tr td:nth-child(2)\",function(e){\n\tvar theme=$(e.target).text().trim();\n\tvar wpPath=$(\"table.update-tabs tbody tr:eq(0) td:eq(1)\").text();\n\trunBash(\"wp theme get \" + theme + \" --format=json --path=\"+wpPath).done(function(status,output){\n\n\t\tif(status===0){\n\t\t\toutput=$.parseJSON(output);\n\t\t\tvar info=\"\";\n\t\t\t$.each(output, function(i,v){\n\t\t\t\tinfo+=\"\" + i + \": \" + v + \"
\";\n\t\t\t})\n\t\t\tswal({\n\t\t\t\ttitle:theme,\n\t\t\t\tcontent:\n\t\t\t\t{\n\t\t\t\telement:\"div\",\n\t\t\t\t\tattributes:{\n\t\t\t\t\tclassName:\"alert alert-info text-left\",\n\t\t\t\t\tinnerHTML:info\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t});\n\t\t} else {\n\t\t\tswal(theme,\"info is available only after install\",\"info\");\n\t\t}\n\t});\n});\n\n/*********************** single theme update ***********************/\n$(document).on(\"click\", \"button[name='btn-themes-update']\", function(e){\n\tvar theme=$(e.target).attr(\"data-theme\");\n\tvar wpPath=$(e.target).attr(\"data-path\");\n\tvar thisTD=$(e.target).closest(\"td\");\n\trunBash(\"wp theme update \"+theme+\" --path=\"+wpPath).done(function(status,output){\n\t\tif(status===0){\n\t\t\tswal(theme,output,\"success\", {timer:2000, buttons:false}).then(()=>{\n\t\t\t\tloadMe(\"themes\",theTabb);\n\t\t\t});\n\t\t} else {\n\t\t\tswal(\"ooops\",output,\"error\");\n\t\t}\n\n\t});\n});\n\n/*********************** single theme delete ***********************/\n$(document).on(\"click\",\"button[name='btn-themes-delete']\", function(e){\n\tvar theme=$(e.target).attr(\"data-theme\");\n\tvar wpPath=$(e.target).attr(\"data-path\");\n\n\t\tswal({\n\t\t\ttitle:theme,\n\t\t\ticon:\"warning\",\n\t\t\ttext: \"delete this theme?\",\n\t\t\tdangerMode:true,\n\t\t\tbuttons:{\n\t\t\t\tcancel:true,\n\t\t\t\tconfirm:{\n\t\t\t\t\ttext:\"delete theme\"\n\t\t\t\t}\n\t\t\t}\n\n\t\t}).then((value)=>{\n\t\t\tif(value){\n\t\t\t\trunBash(\"wp theme delete \"+theme+\" --path=\"+wpPath).done(function(status, output){\n\t\t\t\tif(status===0){\n\t\t\t\t\tswal(theme,output,\"success\", {timer:2000, buttons:false}).then(()=>{\n\t\t\t\t\t\tloadMe(\"themes\",theTabb);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tswal(\"ooops\",output,\"error\");\n\t\t\t\t}\n\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n});\n\n/*********************** single theme Install ***********************/\n$(document).on(\"click\",\"button[name='btn-themes-install']\", function(e){\n\tvar theme=$(e.target).attr(\"data-theme\");\n\tvar wpPath=$(e.target).attr(\"data-path\");\n\n\trunBash(\"wp theme install \"+theme+\" --path=\"+wpPath).done(function(status,output){\n\t\tif(status===0){\n\t\t\tswal(\"installed!\",theme + \" is installed!\",\"success\",{buttons:false,timer:2000}).then(()=>{\n\t\t\t\tloadMe(\"themes\",theTabb);\n\t\t\t});\n\t\t} else {\n\t\t\tswal(\"ooops\",\"something went wrong\",\"error\",{buttons:false,timer:2000});\n\t\t}\n\t});\n\n\n});\n\n\n/*********************** any checkbox checked ***********************/\n$(document).on(\"change\",\"input[name='check-themes']\",function(e){\n\tif($(\"#table-themes-\"+theTabb+\" tbody input:checked\").length>0){\n\t\t$(\"#table-themes-\"+theTabb+\" tfoot\").removeClass('d-none');\t\n\t} else {\n\t\t$(\"#table-themes-\"+theTabb+\" tfoot\").addClass('d-none');\n\t}\n\n});\n\n/*********************** check-pugins-all ***********************/\n$(document).on(\"change\",\"input[name^=check-themes-all-]\", function(e){\n\t\tvar status = $(e.target).prop(\"checked\");\n\t\t$(\"#table-themes-\"+theTabb+\" tbody input[type='checkbox']\").prop(\"checked\", status).trigger(\"change\");\n});\n\n\n/*********************** select-themes-[theTabb]***********************/\n$(document).on(\"click\",\"[id^=btn-select-themes-]\", function(e){\n\tvar VaL=$(\"#select-themes-\"+theTabb).val();\n\tvar wpPath=$(e.target).attr(\"data-path\");\n\tvar ps=\"\";\n\t$(\"#table-themes-\"+theTabb+\" tbody input:checked\").each(function(i,v){\n\t \n\t\tps+=$(v).closest(\"tr\").find(\"td:eq(1)\").text().trim() + \" \";\n\n\t});\n\tps.trim();\n\n\tswitch(parseInt(VaL)){\n\t\tcase 3:\n\t\t\trunBash(\"wp theme install \"+ps+\" --path=\"+wpPath).done(function(status,output){\n\t\t\t\tif(status===0){\n\t\t\t\t\tswal(\"all installed\",output,\"success\",{buttons:false,timer:2000}).then(()=>{\n\t\t\t\t\t\tloadMe(\"themes\",theTabb);\n\t\t\t\t\t});\n\t\t\t\t} else {swal(\"oops\",output,\"error\");}\n\t\t\t});\n\t\tbreak;\n\t\tcase 4:\n\t\t\trunBash(\"wp theme update \"+ps+\" --path=\"+wpPath).done(function(status,output){\n\t\t\t\tif(status===0){\n\t\t\t\t\tswal(\"all updated\",output,\"success\",{buttons:false,timer:2000}).then(()=>{\n\t\t\t\t\t\tloadMe(\"themes\",theTabb);\n\t\t\t\t\t});\n\t\t\t\t} else {swal(\"oops\",output,\"error\").then(()=>{\n\t\t\t\t\t\tloadMe(\"themes\",theTabb);\n\t\t\t\t\t});}\n\t\t\t});\n\t\tbreak;\n\t\tcase 5:\n\t\t\trunBash(\"wp theme delete \"+ps+\" --path=\"+wpPath).done(function(status,output){\n\t\t\t\tif(status===0){\n\t\t\t\t\tswal(\"all deleted\",output,\"success\",{buttons:false,timer:2000}).then(()=>{\n\t\t\t\t\t\tloadMe(\"themes\",theTabb);\n\t\t\t\t\t});\n\t\t\t\t} else {swal(\"oops\",output,\"error\");}\n\t\t\t});\n\t\tbreak;\n\n\t}\n});\n\n/*********************** filter themes ***********************/\n$(document).on(\"keyup\", \"input[name='filter-themes']\", function(e){\n\tvar ne=$(e.target);\n\tvar VaL=$(e.target).val();\n\t$(e.target).attr(\"AUTOCOMPLETE\",\"OFF\");\n\n\tswitch(e.which){\n\t\tcase 13:\n\t\t$(e.target).blur();\n\t\tbreak;\n\n\t\tcase 27:\n\t\t$(\"#table-themes-\"+theTabb+\" thead th input[name='filter-themes']\").blur().val(\"\");\n\t\t$(\"#table-themes-\"+theTabb+\" tbody tr\").show();\n\t\tbreak;\n\n\t\tdefault:\n\t\t$(\"#table-themes-\"+theTabb+\" tbody tr\").hide();\n\t\t$(\"#table-themes-\"+theTabb+\" tbody tr td:nth-child(2):contains('\"+VaL+\"')\").closest(\"tr\").show();\n\n\t\tbreak;\n\t}\n\n});\n\n\n/*********************** toggle active/inactive status - dblclick td ***********************/\n$(document).on(\"dblclick\",\"[id^=table-themes-] tbody tr td:nth-child(3)\", function(e){\n\tvar status=$(e.target).text().trim();\n\tvar theme=$(e.target).closest(\"tr\").find(\"td:eq(1)\").text().trim();\n\tvar wpPath=$(\"table.update-tabs tbody tr:eq(0) td:eq(1)\").text();\n\n\tif(status==\"active\" || status==\"inactive\"){\n\n\t\trunBash(\"wp theme activate \"+theme+\" --path=\"+wpPath).done(function(exit, output){\n\t\t\tif(exit===0){\n\t\t\t\tswal(theme,output,\"success\",{buttons:false,timer:2000}).then(()=>{\n\t\t\t\t\tloadMe(\"themes\",theTabb);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tswal(\"ooops\",output,\"error\",{buttons:false,timer:2000});\n\t\t\t}\n\t\t});\n\n\t} else {\n\n\t\tswal(\"only installed themes may toggle status!\",{buttons:false, timer:2000, icon:\"warning\"});\n\t}\n\t\n});\n\n\n\n\n\n\n\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/editwp.tab.themes.js\n// module id = ./src/editwp.tab.themes.js\n// module chunks = 1","import {runBash} from \"./run.bash.js\";\n\n\n\n\t/*********************** reload tab contents and inner-tabs ***********************/\n\timport {LoadEditTab, loadMe} from \"./editwp.js\";\n\t//loadMe(\"users\",\"admin\");\n\n/*********************** get theTabb ***********************/\n$(document).on(\"shown.bs.tab\",\"#tabs-config\",function(e){\n\n\tvar theTabb=$(e.target).attr(\"href\").match(/\\w+/ig)[1];\n\n\n});\n\n\n/*********************** user details dblclick ***********************/\n$(document).on(\"dblclick\", \"#users-list table tbody tr\", function(e){\n\tvar user=$(e.target).closest(\"tr\").find(\"td:eq(1)\").text().trim();\n\tvar wpPath=$(\"table.update-tabs tbody td:eq(1)\").text().trim();\n\n\trunBash(\"wp user meta list \"+user+\" --format=json --path=\"+wpPath).done(function(status, output){\n\t\toutput=$.parseJSON(output);\n\t\tvar msg=\"\";\n\t\tvar VaL=\"\";\n\t\t$.each(output, function(i,v){\n\t\t\tif($.type(v[\"meta_value\"])===\"object\"){\n\t\t\t VaL=JSON.stringify(v[\"meta_value\"]);\n\t\t\t} else { VaL=v[\"meta_value\"];}\n\t\tmsg+=\"\" + v[\"meta_key\"] + \": \" + \n\t\t\t\"\" + VaL + \"
\";\n\t\t\t\t\t\t\n\t\t\t\t\t\t});\n\t\t\n\n\t\tif(status===0){\n\t\t\tswal({\n\t\t\t\ttitle:user,\n\t\t\t\tcontent:{\n\t\t\t\t\telement:\"div\",\n\t\t\t\t\tattributes:{\n\t\t\t\t\t\tclassName:\"alert alert-warning text-left o-hidden smaller\",\n\t\t\t\t\t\tinnerHTML:msg\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tclassName:\"alert-info\"\n\t\t\t});\n\n\t\t} else {\n\n\t\t\tswal(\"oops\", output, \"error\");\n\t\t}\n\n\t});\n});\n\n\n/*********************** on change type of user-value >> radio + select***********************/\n$(document).on(\"change\",\"[name^=user-value-]\", function(e){\n\n\tvar theNode=$(e.target).prop(\"nodeName\");\n\tvar theType=$(e.target).attr(\"type\");\n\t\n\tif(theNode==\"SELECT\" || theType==\"radio\"){\n\t\tvar cmd=updateCMD($(e.target));\n\t\tupdateUser(cmd);\n\n\t}\n\n});\n\n/*********************** on click type of user-value >> text + textarea***********************/\n$(document).on(\"click\",\"[name^=btn-user-value-]\", function(e){\n\n\tvar theNode=$(e.target).parent().parent().children().eq(0).prop(\"nodeName\");\n\tvar theType=$(e.target).parent().parent().children().eq(0).attr(\"type\");\n\t\t\t//from button > input-group-append > input-group < 1st child =>text/textarea\n\t\n\tif(theNode==\"TEXTAREA\" || theType==\"text\"){\n\t\tvar cmd=updateCMD($(e.target));\n\t\tupdateUser(cmd);\n\n\t}\n\n\n});\n\n\n/*********************** function update user ***********************/\nfunction updateCMD(el){\n\tvar theNode=el.prop(\"nodeName\");\n\tvar admin=$(\"#users-admin\").attr(\"data-admin\");\n\tvar wpPath=$(\"#users-admin\").attr(\"data-path\");\n\tvar theGroup=el.closest(\"tr\").attr(\"data-group\");\n\tvar theField=el.closest(\"tr\").find(\"td:eq(0)\").text().trim();\n\tvar theVal=el.val();\n\t\tif(theNode==\"BUTTON\"){\n\t\t\ttheVal=el.parent().parent().children().eq(0).val();\n\t\t} \n\t\tif(theNode==\"I\" || theNode==\"TD\"){\n\t\t\ttheVal=el.closest(\"tr\").find(\"td:eq(1)\").attr(\"data-default\");\n\t\t}\n\t\n\tvar cmd=\"wp user \";\n\tif(theGroup==\"get\"){\n\t\tcmd+=\"update \" + admin + \" \";\n\t\tcmd+=\"--\" + theField + \"=\" + \"'\" + theVal + \"' \";\n\t\tcmd+= \"--path=\" + wpPath\n\t}\n\tif(theGroup==\"meta\"){\n\t\tcmd+=\"meta update \" + admin + \" \";\n\t\tcmd+= theField + \" \" + \"'\" + theVal + \"' \";\n\t\tcmd+= \"--path=\" + wpPath\n\t}\n\n\treturn cmd\n\t\n}//end function updateCMD\n\n\nfunction updateUser(cmd){\n\trunBash(cmd).done(function(status,output){\n\t\tif(status===0){\n\t\t\tswal(\"user updated!\",output,\"success\",{buttons:false,timer:2000}).then(()=>{\n\t\t\t\tloadMe(\"users\",\"admin\");\n\t\t\t});\n\t\t} else {\n\n\t\t\tswal(\"ooops!\",output,\"error\").then(()=>{loadMe(\"users\",\"admin\")});\n\t\t}\n\n\t});\n}//end function updateUser\n\n\n\n/*********************** dblclick assign default values ***********************/\n$(document).on(\"dblclick\",\"#table-users-admin tbody tr td:nth-child(2)\",function(e){\n\n\tvar cmd=updateCMD($(e.target));\n\t\tupdateUser(cmd);\n\n});\n\n/*********************** dblclick assign ALL default values ***********************/\n$(document).on(\"dblclick\",\"#table-users-admin thead tr th:nth-child(2)\",function(e){\n\n\tvar fields=$(e.target).closest(\"table\").find(\"[name^=user-value-]\");\n\tvar cmd=\"\";\n\t$.each(fields, function(i,v){\n\t\tcmd+=updateCMD($(v)) + \"; \";\n\t});\n\n\t\tupdateUser(cmd);\n\n});\n\n\n\n\n\n\n\n\n\n\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/editwp.tab.users.js\n// module id = ./src/editwp.tab.users.js\n// module chunks = 1","export function runBash(cmd){\n\tvar status=false;\n\tvar dfd = new $.Deferred();\n\n\t$.ajax({\n\t\turl: \"../inc/run.bash.php\",\n\t\ttype: \"post\",\n\t\tdataType: \"json\",\n\t\tasync:false,\n\t\tdata: {do:\"run\", run:\"bash\", cmd:cmd}\n\t}).done(function(data){\n\t\tdfd.resolve(data.exit_status,data.output);\n\t}).fail(function(jqXHR,textStatus,errorThrown){\n\t\t\tdfd.resolve(false,\"ajax failed!\\n\"+errorThrown);\n\t});\n\n\treturn dfd.promise();\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/run.bash.js\n// module id = ./src/run.bash.js\n// module chunks = 1 4 5","export function runDBdelete(dbNAME){\n\n\tvar status=false;\n\n\t$.ajax({\n\t\turl: \"../inc/run.db.delete.php\",\n\t\ttype: \"post\",\n\t\tasync:false,\n\t\tdata: {do:\"run\", run:\"DBdelete\", dbNAME:dbNAME}\n\t}).done(function(data){\n\t\tif(data!==\"false\"){\n\t\t\tstatus=true;\n\t\t} else {\n\t\t\tstatus=false;\n\t\t}\n\t\t\n\t}).fail(function(){\n\t\t\tswal(\"oops\",\"bad data from rub.db.delete.php\", \"warning\");\n\t});\n\n\treturn status;\n\n\n\t/*********************** returns true if database deleted ***********************/\n\n\n\n}//end function\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/run.db.delete.js\n// module id = ./src/run.db.delete.js\n// module chunks = 1","export function runDBexport(wpPath, DBname, export_path=\"tmp\"){\n/*********************** \nexport_path is can be \n\t\"tmp\" = ozwpdev basedir/tmp \n\t\"wp\" =wpPath/wp-content/uploads/ozwpdev\n\tor a specific path \n\tif path does not exists, mkdir cmd creates folder\n ***********************/\n\n\tvar status=false;\n\n\t$.ajax({\n\t\turl: \"../inc/run.db.export.php\",\n\t\ttype: \"post\",\n\t\tasync:false,\n\t\tdata: {do:\"run\", run:\"DBexport\", wpPath:wpPath, DBname:DBname, export_path:export_path}\n\t}).done(function(data){\n\t\tif(data!==\"false\"){\n\t\t\tstatus=true;\n\t\t} else {\n\t\t\tstatus=false;\n\t\t}\n\t\t\n\t}).fail(function(){\n\t\t\tswal(\"oops\",\"bad data from run.db.export.php\", \"warning\");\n\t});\n\n\treturn status;\n\n\n\t/*********************** returns true if database export is successful ***********************/\n\n\n\n}//end function\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/run.db.export.js\n// module id = ./src/run.db.export.js\n// module chunks = 1","export function runFinder(path=\" . \"){\n\tvar status=false;\n\n\t$.ajax({\n\t\turl: \"../inc/run.finder.php\",\n\t\ttype: \"post\",\n\t\tasync:false,\n\t\tdata: {do:\"run\", run:\"finder\", path:path}\n\t}).done(function(data){\n\n\t\tif(data==\"true\"){\n\t\t\t//swal(\"ok\",\"it came\", \"success\");\n\t\t\tstatus=true;\n\t\t} else {\n\t\t\tswal(\"oops\",\"path not found\", \"warning\");\n\t\t}\n\t}).fail(function(){\n\t\t\tswal(\"oops\",\"path not found\", \"warning\");\n\t});\n\n\treturn status;\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/run.finder.js\n// module id = ./src/run.finder.js\n// module chunks = 1 2","export function runWPconfigGet(wpPath,item=null){\n\n\tvar status=false;\n\tvar backData;\n\n\t$.ajax({\n\t\turl: \"../inc/run.wp.config.get.php\",\n\t\ttype: \"post\",\n\t\tdataType: 'json',\n\t\tasync:false,\n\t\tdata: {do:\"run\", run:\"WPconfigGet\", wpPath:wpPath}\n\n\t}).done(function(data){\n\n\t\tstatus=true;\n\t\tbackData = data;\n\t\t\n\t}).fail(function(){\n\t\t\tswal(\"oops\",\"bad data from run.wp.config.get.php\", \"warning\");\n\t});\n\n\tif(status) {\n\t\tif(item==null){\n\t\t\treturn backData;\n\t\t} else {\n\t\t\t/*** if item given then return its value ***/\n\t\t\tvar arr = $.parseJSON(backData);\n\t\t\t$.each(arr, function(i,v){\n\t\t\t\tif(v[\"name\"]==item){\n\t\t\t\t\tbackData= v[\"value\"];\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn backData;\n\t\t}\n\n\t} else {\n\t\treturn false;\n\t}\n\n\n\t/*********************** returns json string of WP config list or item value like: DB_NAME ***********************/\n\n\n\n}//end function\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/run.wp.config.get.js\n// module id = ./src/run.wp.config.get.js\n// module chunks = 1 2","export function runWPlock(wpName, lock){\n\n\t/*** \n\twpName is the folder name in the root dir\n\tlock=status returns if the wp install locked or not\n\tlocked status = true means there is no ozwpdev.txt in root dir\n\tlocked status = false means there is ozwpdev.txt in root dir and can be modified\n\tto set or unlik ozwpdev.txt assign lock = lock / unlock (unlock means free modify)\n \t***/\n\n\tvar status=false;\n\n\t$.ajax({\n\t\turl: \"../inc/run.wp.lock.php\",\n\t\ttype: \"post\",\n\t\tasync:false,\n\t\tdata: {\n\t\t\tdo:\"run\", \n\t\t\trun:\"WPlock\", \n\t\t\twpName:wpName,\n\t\t\tlock:lock\n\t\t}\n\n\t}).done(function(data){\n\n\t\tstatus=$.parseJSON(data);\n\t\t\n\t}).fail(function(){\n\t\t\tswal(\"oops\",\"bad data from run.wp.lock.php\", \"warning\");\n\t});\n\n\treturn status;\n\n\n\n}//end function\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/run.wp.lock.js\n// module id = ./src/run.wp.lock.js\n// module chunks = 1 3"],"sourceRoot":""}
\ No newline at end of file
diff --git a/dist/fonts/fontawesome-webfont.eot b/dist/fonts/fontawesome-webfont.eot
new file mode 100644
index 0000000..e9f60ca
Binary files /dev/null and b/dist/fonts/fontawesome-webfont.eot differ
diff --git a/dist/fonts/fontawesome-webfont.ttf b/dist/fonts/fontawesome-webfont.ttf
new file mode 100644
index 0000000..35acda2
Binary files /dev/null and b/dist/fonts/fontawesome-webfont.ttf differ
diff --git a/dist/fonts/fontawesome-webfont.woff b/dist/fonts/fontawesome-webfont.woff
new file mode 100644
index 0000000..400014a
Binary files /dev/null and b/dist/fonts/fontawesome-webfont.woff differ
diff --git a/dist/fonts/fontawesome-webfont.woff2 b/dist/fonts/fontawesome-webfont.woff2
new file mode 100644
index 0000000..4d13fc6
Binary files /dev/null and b/dist/fonts/fontawesome-webfont.woff2 differ
diff --git a/dist/img/fontawesome-webfont.svg b/dist/img/fontawesome-webfont.svg
new file mode 100644
index 0000000..855c845
--- /dev/null
+++ b/dist/img/fontawesome-webfont.svg
@@ -0,0 +1,2671 @@
+
+
+
diff --git a/dist/newwp.bundle.js b/dist/newwp.bundle.js
new file mode 100644
index 0000000..fa45f5e
--- /dev/null
+++ b/dist/newwp.bundle.js
@@ -0,0 +1,1948 @@
+webpackJsonp([3],{
+
+/***/ "./node_modules/jquery-validation/dist/jquery.validate.js":
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
+ * jQuery Validation Plugin v1.17.0
+ *
+ * https://jqueryvalidation.org/
+ *
+ * Copyright (c) 2017 Jörn Zaefferer
+ * Released under the MIT license
+ */
+(function( factory ) {
+ if ( true ) {
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__("./node_modules/jquery/dist/jquery.js-exposed")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
+ __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
+ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+$.extend( $.fn, {
+
+ // https://jqueryvalidation.org/validate/
+ validate: function( options ) {
+
+ // If nothing is selected, return nothing; can't chain anyway
+ if ( !this.length ) {
+ if ( options && options.debug && window.console ) {
+ console.warn( "Nothing selected, can't validate, returning nothing." );
+ }
+ return;
+ }
+
+ // Check if a validator for this form was already created
+ var validator = $.data( this[ 0 ], "validator" );
+ if ( validator ) {
+ return validator;
+ }
+
+ // Add novalidate tag if HTML5.
+ this.attr( "novalidate", "novalidate" );
+
+ validator = new $.validator( options, this[ 0 ] );
+ $.data( this[ 0 ], "validator", validator );
+
+ if ( validator.settings.onsubmit ) {
+
+ this.on( "click.validate", ":submit", function( event ) {
+
+ // Track the used submit button to properly handle scripted
+ // submits later.
+ validator.submitButton = event.currentTarget;
+
+ // Allow suppressing validation by adding a cancel class to the submit button
+ if ( $( this ).hasClass( "cancel" ) ) {
+ validator.cancelSubmit = true;
+ }
+
+ // Allow suppressing validation by adding the html5 formnovalidate attribute to the submit button
+ if ( $( this ).attr( "formnovalidate" ) !== undefined ) {
+ validator.cancelSubmit = true;
+ }
+ } );
+
+ // Validate the form on submit
+ this.on( "submit.validate", function( event ) {
+ if ( validator.settings.debug ) {
+
+ // Prevent form submit to be able to see console output
+ event.preventDefault();
+ }
+ function handle() {
+ var hidden, result;
+
+ // Insert a hidden input as a replacement for the missing submit button
+ // The hidden input is inserted in two cases:
+ // - A user defined a `submitHandler`
+ // - There was a pending request due to `remote` method and `stopRequest()`
+ // was called to submit the form in case it's valid
+ if ( validator.submitButton && ( validator.settings.submitHandler || validator.formSubmitted ) ) {
+ hidden = $( "" )
+ .attr( "name", validator.submitButton.name )
+ .val( $( validator.submitButton ).val() )
+ .appendTo( validator.currentForm );
+ }
+
+ if ( validator.settings.submitHandler ) {
+ result = validator.settings.submitHandler.call( validator, validator.currentForm, event );
+ if ( hidden ) {
+
+ // And clean up afterwards; thanks to no-block-scope, hidden can be referenced
+ hidden.remove();
+ }
+ if ( result !== undefined ) {
+ return result;
+ }
+ return false;
+ }
+ return true;
+ }
+
+ // Prevent submit for invalid forms or custom submit handlers
+ if ( validator.cancelSubmit ) {
+ validator.cancelSubmit = false;
+ return handle();
+ }
+ if ( validator.form() ) {
+ if ( validator.pendingRequest ) {
+ validator.formSubmitted = true;
+ return false;
+ }
+ return handle();
+ } else {
+ validator.focusInvalid();
+ return false;
+ }
+ } );
+ }
+
+ return validator;
+ },
+
+ // https://jqueryvalidation.org/valid/
+ valid: function() {
+ var valid, validator, errorList;
+
+ if ( $( this[ 0 ] ).is( "form" ) ) {
+ valid = this.validate().form();
+ } else {
+ errorList = [];
+ valid = true;
+ validator = $( this[ 0 ].form ).validate();
+ this.each( function() {
+ valid = validator.element( this ) && valid;
+ if ( !valid ) {
+ errorList = errorList.concat( validator.errorList );
+ }
+ } );
+ validator.errorList = errorList;
+ }
+ return valid;
+ },
+
+ // https://jqueryvalidation.org/rules/
+ rules: function( command, argument ) {
+ var element = this[ 0 ],
+ settings, staticRules, existingRules, data, param, filtered;
+
+ // If nothing is selected, return empty object; can't chain anyway
+ if ( element == null ) {
+ return;
+ }
+
+ if ( !element.form && element.hasAttribute( "contenteditable" ) ) {
+ element.form = this.closest( "form" )[ 0 ];
+ element.name = this.attr( "name" );
+ }
+
+ if ( element.form == null ) {
+ return;
+ }
+
+ if ( command ) {
+ settings = $.data( element.form, "validator" ).settings;
+ staticRules = settings.rules;
+ existingRules = $.validator.staticRules( element );
+ switch ( command ) {
+ case "add":
+ $.extend( existingRules, $.validator.normalizeRule( argument ) );
+
+ // Remove messages from rules, but allow them to be set separately
+ delete existingRules.messages;
+ staticRules[ element.name ] = existingRules;
+ if ( argument.messages ) {
+ settings.messages[ element.name ] = $.extend( settings.messages[ element.name ], argument.messages );
+ }
+ break;
+ case "remove":
+ if ( !argument ) {
+ delete staticRules[ element.name ];
+ return existingRules;
+ }
+ filtered = {};
+ $.each( argument.split( /\s/ ), function( index, method ) {
+ filtered[ method ] = existingRules[ method ];
+ delete existingRules[ method ];
+ } );
+ return filtered;
+ }
+ }
+
+ data = $.validator.normalizeRules(
+ $.extend(
+ {},
+ $.validator.classRules( element ),
+ $.validator.attributeRules( element ),
+ $.validator.dataRules( element ),
+ $.validator.staticRules( element )
+ ), element );
+
+ // Make sure required is at front
+ if ( data.required ) {
+ param = data.required;
+ delete data.required;
+ data = $.extend( { required: param }, data );
+ }
+
+ // Make sure remote is at back
+ if ( data.remote ) {
+ param = data.remote;
+ delete data.remote;
+ data = $.extend( data, { remote: param } );
+ }
+
+ return data;
+ }
+} );
+
+// Custom selectors
+$.extend( $.expr.pseudos || $.expr[ ":" ], { // '|| $.expr[ ":" ]' here enables backwards compatibility to jQuery 1.7. Can be removed when dropping jQ 1.7.x support
+
+ // https://jqueryvalidation.org/blank-selector/
+ blank: function( a ) {
+ return !$.trim( "" + $( a ).val() );
+ },
+
+ // https://jqueryvalidation.org/filled-selector/
+ filled: function( a ) {
+ var val = $( a ).val();
+ return val !== null && !!$.trim( "" + val );
+ },
+
+ // https://jqueryvalidation.org/unchecked-selector/
+ unchecked: function( a ) {
+ return !$( a ).prop( "checked" );
+ }
+} );
+
+// Constructor for validator
+$.validator = function( options, form ) {
+ this.settings = $.extend( true, {}, $.validator.defaults, options );
+ this.currentForm = form;
+ this.init();
+};
+
+// https://jqueryvalidation.org/jQuery.validator.format/
+$.validator.format = function( source, params ) {
+ if ( arguments.length === 1 ) {
+ return function() {
+ var args = $.makeArray( arguments );
+ args.unshift( source );
+ return $.validator.format.apply( this, args );
+ };
+ }
+ if ( params === undefined ) {
+ return source;
+ }
+ if ( arguments.length > 2 && params.constructor !== Array ) {
+ params = $.makeArray( arguments ).slice( 1 );
+ }
+ if ( params.constructor !== Array ) {
+ params = [ params ];
+ }
+ $.each( params, function( i, n ) {
+ source = source.replace( new RegExp( "\\{" + i + "\\}", "g" ), function() {
+ return n;
+ } );
+ } );
+ return source;
+};
+
+$.extend( $.validator, {
+
+ defaults: {
+ messages: {},
+ groups: {},
+ rules: {},
+ errorClass: "error",
+ pendingClass: "pending",
+ validClass: "valid",
+ errorElement: "label",
+ focusCleanup: false,
+ focusInvalid: true,
+ errorContainer: $( [] ),
+ errorLabelContainer: $( [] ),
+ onsubmit: true,
+ ignore: ":hidden",
+ ignoreTitle: false,
+ onfocusin: function( element ) {
+ this.lastActive = element;
+
+ // Hide error label and remove error class on focus if enabled
+ if ( this.settings.focusCleanup ) {
+ if ( this.settings.unhighlight ) {
+ this.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.validClass );
+ }
+ this.hideThese( this.errorsFor( element ) );
+ }
+ },
+ onfocusout: function( element ) {
+ if ( !this.checkable( element ) && ( element.name in this.submitted || !this.optional( element ) ) ) {
+ this.element( element );
+ }
+ },
+ onkeyup: function( element, event ) {
+
+ // Avoid revalidate the field when pressing one of the following keys
+ // Shift => 16
+ // Ctrl => 17
+ // Alt => 18
+ // Caps lock => 20
+ // End => 35
+ // Home => 36
+ // Left arrow => 37
+ // Up arrow => 38
+ // Right arrow => 39
+ // Down arrow => 40
+ // Insert => 45
+ // Num lock => 144
+ // AltGr key => 225
+ var excludedKeys = [
+ 16, 17, 18, 20, 35, 36, 37,
+ 38, 39, 40, 45, 144, 225
+ ];
+
+ if ( event.which === 9 && this.elementValue( element ) === "" || $.inArray( event.keyCode, excludedKeys ) !== -1 ) {
+ return;
+ } else if ( element.name in this.submitted || element.name in this.invalid ) {
+ this.element( element );
+ }
+ },
+ onclick: function( element ) {
+
+ // Click on selects, radiobuttons and checkboxes
+ if ( element.name in this.submitted ) {
+ this.element( element );
+
+ // Or option elements, check parent select in that case
+ } else if ( element.parentNode.name in this.submitted ) {
+ this.element( element.parentNode );
+ }
+ },
+ highlight: function( element, errorClass, validClass ) {
+ if ( element.type === "radio" ) {
+ this.findByName( element.name ).addClass( errorClass ).removeClass( validClass );
+ } else {
+ $( element ).addClass( errorClass ).removeClass( validClass );
+ }
+ },
+ unhighlight: function( element, errorClass, validClass ) {
+ if ( element.type === "radio" ) {
+ this.findByName( element.name ).removeClass( errorClass ).addClass( validClass );
+ } else {
+ $( element ).removeClass( errorClass ).addClass( validClass );
+ }
+ }
+ },
+
+ // https://jqueryvalidation.org/jQuery.validator.setDefaults/
+ setDefaults: function( settings ) {
+ $.extend( $.validator.defaults, settings );
+ },
+
+ messages: {
+ required: "This field is required.",
+ remote: "Please fix this field.",
+ email: "Please enter a valid email address.",
+ url: "Please enter a valid URL.",
+ date: "Please enter a valid date.",
+ dateISO: "Please enter a valid date (ISO).",
+ number: "Please enter a valid number.",
+ digits: "Please enter only digits.",
+ equalTo: "Please enter the same value again.",
+ maxlength: $.validator.format( "Please enter no more than {0} characters." ),
+ minlength: $.validator.format( "Please enter at least {0} characters." ),
+ rangelength: $.validator.format( "Please enter a value between {0} and {1} characters long." ),
+ range: $.validator.format( "Please enter a value between {0} and {1}." ),
+ max: $.validator.format( "Please enter a value less than or equal to {0}." ),
+ min: $.validator.format( "Please enter a value greater than or equal to {0}." ),
+ step: $.validator.format( "Please enter a multiple of {0}." )
+ },
+
+ autoCreateRanges: false,
+
+ prototype: {
+
+ init: function() {
+ this.labelContainer = $( this.settings.errorLabelContainer );
+ this.errorContext = this.labelContainer.length && this.labelContainer || $( this.currentForm );
+ this.containers = $( this.settings.errorContainer ).add( this.settings.errorLabelContainer );
+ this.submitted = {};
+ this.valueCache = {};
+ this.pendingRequest = 0;
+ this.pending = {};
+ this.invalid = {};
+ this.reset();
+
+ var groups = ( this.groups = {} ),
+ rules;
+ $.each( this.settings.groups, function( key, value ) {
+ if ( typeof value === "string" ) {
+ value = value.split( /\s/ );
+ }
+ $.each( value, function( index, name ) {
+ groups[ name ] = key;
+ } );
+ } );
+ rules = this.settings.rules;
+ $.each( rules, function( key, value ) {
+ rules[ key ] = $.validator.normalizeRule( value );
+ } );
+
+ function delegate( event ) {
+
+ // Set form expando on contenteditable
+ if ( !this.form && this.hasAttribute( "contenteditable" ) ) {
+ this.form = $( this ).closest( "form" )[ 0 ];
+ this.name = $( this ).attr( "name" );
+ }
+
+ var validator = $.data( this.form, "validator" ),
+ eventType = "on" + event.type.replace( /^validate/, "" ),
+ settings = validator.settings;
+ if ( settings[ eventType ] && !$( this ).is( settings.ignore ) ) {
+ settings[ eventType ].call( validator, this, event );
+ }
+ }
+
+ $( this.currentForm )
+ .on( "focusin.validate focusout.validate keyup.validate",
+ ":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], " +
+ "[type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], " +
+ "[type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], " +
+ "[type='radio'], [type='checkbox'], [contenteditable], [type='button']", delegate )
+
+ // Support: Chrome, oldIE
+ // "select" is provided as event.target when clicking a option
+ .on( "click.validate", "select, option, [type='radio'], [type='checkbox']", delegate );
+
+ if ( this.settings.invalidHandler ) {
+ $( this.currentForm ).on( "invalid-form.validate", this.settings.invalidHandler );
+ }
+ },
+
+ // https://jqueryvalidation.org/Validator.form/
+ form: function() {
+ this.checkForm();
+ $.extend( this.submitted, this.errorMap );
+ this.invalid = $.extend( {}, this.errorMap );
+ if ( !this.valid() ) {
+ $( this.currentForm ).triggerHandler( "invalid-form", [ this ] );
+ }
+ this.showErrors();
+ return this.valid();
+ },
+
+ checkForm: function() {
+ this.prepareForm();
+ for ( var i = 0, elements = ( this.currentElements = this.elements() ); elements[ i ]; i++ ) {
+ this.check( elements[ i ] );
+ }
+ return this.valid();
+ },
+
+ // https://jqueryvalidation.org/Validator.element/
+ element: function( element ) {
+ var cleanElement = this.clean( element ),
+ checkElement = this.validationTargetFor( cleanElement ),
+ v = this,
+ result = true,
+ rs, group;
+
+ if ( checkElement === undefined ) {
+ delete this.invalid[ cleanElement.name ];
+ } else {
+ this.prepareElement( checkElement );
+ this.currentElements = $( checkElement );
+
+ // If this element is grouped, then validate all group elements already
+ // containing a value
+ group = this.groups[ checkElement.name ];
+ if ( group ) {
+ $.each( this.groups, function( name, testgroup ) {
+ if ( testgroup === group && name !== checkElement.name ) {
+ cleanElement = v.validationTargetFor( v.clean( v.findByName( name ) ) );
+ if ( cleanElement && cleanElement.name in v.invalid ) {
+ v.currentElements.push( cleanElement );
+ result = v.check( cleanElement ) && result;
+ }
+ }
+ } );
+ }
+
+ rs = this.check( checkElement ) !== false;
+ result = result && rs;
+ if ( rs ) {
+ this.invalid[ checkElement.name ] = false;
+ } else {
+ this.invalid[ checkElement.name ] = true;
+ }
+
+ if ( !this.numberOfInvalids() ) {
+
+ // Hide error containers on last error
+ this.toHide = this.toHide.add( this.containers );
+ }
+ this.showErrors();
+
+ // Add aria-invalid status for screen readers
+ $( element ).attr( "aria-invalid", !rs );
+ }
+
+ return result;
+ },
+
+ // https://jqueryvalidation.org/Validator.showErrors/
+ showErrors: function( errors ) {
+ if ( errors ) {
+ var validator = this;
+
+ // Add items to error list and map
+ $.extend( this.errorMap, errors );
+ this.errorList = $.map( this.errorMap, function( message, name ) {
+ return {
+ message: message,
+ element: validator.findByName( name )[ 0 ]
+ };
+ } );
+
+ // Remove items from success list
+ this.successList = $.grep( this.successList, function( element ) {
+ return !( element.name in errors );
+ } );
+ }
+ if ( this.settings.showErrors ) {
+ this.settings.showErrors.call( this, this.errorMap, this.errorList );
+ } else {
+ this.defaultShowErrors();
+ }
+ },
+
+ // https://jqueryvalidation.org/Validator.resetForm/
+ resetForm: function() {
+ if ( $.fn.resetForm ) {
+ $( this.currentForm ).resetForm();
+ }
+ this.invalid = {};
+ this.submitted = {};
+ this.prepareForm();
+ this.hideErrors();
+ var elements = this.elements()
+ .removeData( "previousValue" )
+ .removeAttr( "aria-invalid" );
+
+ this.resetElements( elements );
+ },
+
+ resetElements: function( elements ) {
+ var i;
+
+ if ( this.settings.unhighlight ) {
+ for ( i = 0; elements[ i ]; i++ ) {
+ this.settings.unhighlight.call( this, elements[ i ],
+ this.settings.errorClass, "" );
+ this.findByName( elements[ i ].name ).removeClass( this.settings.validClass );
+ }
+ } else {
+ elements
+ .removeClass( this.settings.errorClass )
+ .removeClass( this.settings.validClass );
+ }
+ },
+
+ numberOfInvalids: function() {
+ return this.objectLength( this.invalid );
+ },
+
+ objectLength: function( obj ) {
+ /* jshint unused: false */
+ var count = 0,
+ i;
+ for ( i in obj ) {
+
+ // This check allows counting elements with empty error
+ // message as invalid elements
+ if ( obj[ i ] !== undefined && obj[ i ] !== null && obj[ i ] !== false ) {
+ count++;
+ }
+ }
+ return count;
+ },
+
+ hideErrors: function() {
+ this.hideThese( this.toHide );
+ },
+
+ hideThese: function( errors ) {
+ errors.not( this.containers ).text( "" );
+ this.addWrapper( errors ).hide();
+ },
+
+ valid: function() {
+ return this.size() === 0;
+ },
+
+ size: function() {
+ return this.errorList.length;
+ },
+
+ focusInvalid: function() {
+ if ( this.settings.focusInvalid ) {
+ try {
+ $( this.findLastActive() || this.errorList.length && this.errorList[ 0 ].element || [] )
+ .filter( ":visible" )
+ .focus()
+
+ // Manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find
+ .trigger( "focusin" );
+ } catch ( e ) {
+
+ // Ignore IE throwing errors when focusing hidden elements
+ }
+ }
+ },
+
+ findLastActive: function() {
+ var lastActive = this.lastActive;
+ return lastActive && $.grep( this.errorList, function( n ) {
+ return n.element.name === lastActive.name;
+ } ).length === 1 && lastActive;
+ },
+
+ elements: function() {
+ var validator = this,
+ rulesCache = {};
+
+ // Select all valid inputs inside the form (no submit or reset buttons)
+ return $( this.currentForm )
+ .find( "input, select, textarea, [contenteditable]" )
+ .not( ":submit, :reset, :image, :disabled" )
+ .not( this.settings.ignore )
+ .filter( function() {
+ var name = this.name || $( this ).attr( "name" ); // For contenteditable
+ if ( !name && validator.settings.debug && window.console ) {
+ console.error( "%o has no name assigned", this );
+ }
+
+ // Set form expando on contenteditable
+ if ( this.hasAttribute( "contenteditable" ) ) {
+ this.form = $( this ).closest( "form" )[ 0 ];
+ this.name = name;
+ }
+
+ // Select only the first element for each name, and only those with rules specified
+ if ( name in rulesCache || !validator.objectLength( $( this ).rules() ) ) {
+ return false;
+ }
+
+ rulesCache[ name ] = true;
+ return true;
+ } );
+ },
+
+ clean: function( selector ) {
+ return $( selector )[ 0 ];
+ },
+
+ errors: function() {
+ var errorClass = this.settings.errorClass.split( " " ).join( "." );
+ return $( this.settings.errorElement + "." + errorClass, this.errorContext );
+ },
+
+ resetInternals: function() {
+ this.successList = [];
+ this.errorList = [];
+ this.errorMap = {};
+ this.toShow = $( [] );
+ this.toHide = $( [] );
+ },
+
+ reset: function() {
+ this.resetInternals();
+ this.currentElements = $( [] );
+ },
+
+ prepareForm: function() {
+ this.reset();
+ this.toHide = this.errors().add( this.containers );
+ },
+
+ prepareElement: function( element ) {
+ this.reset();
+ this.toHide = this.errorsFor( element );
+ },
+
+ elementValue: function( element ) {
+ var $element = $( element ),
+ type = element.type,
+ val, idx;
+
+ if ( type === "radio" || type === "checkbox" ) {
+ return this.findByName( element.name ).filter( ":checked" ).val();
+ } else if ( type === "number" && typeof element.validity !== "undefined" ) {
+ return element.validity.badInput ? "NaN" : $element.val();
+ }
+
+ if ( element.hasAttribute( "contenteditable" ) ) {
+ val = $element.text();
+ } else {
+ val = $element.val();
+ }
+
+ if ( type === "file" ) {
+
+ // Modern browser (chrome & safari)
+ if ( val.substr( 0, 12 ) === "C:\\fakepath\\" ) {
+ return val.substr( 12 );
+ }
+
+ // Legacy browsers
+ // Unix-based path
+ idx = val.lastIndexOf( "/" );
+ if ( idx >= 0 ) {
+ return val.substr( idx + 1 );
+ }
+
+ // Windows-based path
+ idx = val.lastIndexOf( "\\" );
+ if ( idx >= 0 ) {
+ return val.substr( idx + 1 );
+ }
+
+ // Just the file name
+ return val;
+ }
+
+ if ( typeof val === "string" ) {
+ return val.replace( /\r/g, "" );
+ }
+ return val;
+ },
+
+ check: function( element ) {
+ element = this.validationTargetFor( this.clean( element ) );
+
+ var rules = $( element ).rules(),
+ rulesCount = $.map( rules, function( n, i ) {
+ return i;
+ } ).length,
+ dependencyMismatch = false,
+ val = this.elementValue( element ),
+ result, method, rule, normalizer;
+
+ // Prioritize the local normalizer defined for this element over the global one
+ // if the former exists, otherwise user the global one in case it exists.
+ if ( typeof rules.normalizer === "function" ) {
+ normalizer = rules.normalizer;
+ } else if ( typeof this.settings.normalizer === "function" ) {
+ normalizer = this.settings.normalizer;
+ }
+
+ // If normalizer is defined, then call it to retreive the changed value instead
+ // of using the real one.
+ // Note that `this` in the normalizer is `element`.
+ if ( normalizer ) {
+ val = normalizer.call( element, val );
+
+ if ( typeof val !== "string" ) {
+ throw new TypeError( "The normalizer should return a string value." );
+ }
+
+ // Delete the normalizer from rules to avoid treating it as a pre-defined method.
+ delete rules.normalizer;
+ }
+
+ for ( method in rules ) {
+ rule = { method: method, parameters: rules[ method ] };
+ try {
+ result = $.validator.methods[ method ].call( this, val, element, rule.parameters );
+
+ // If a method indicates that the field is optional and therefore valid,
+ // don't mark it as valid when there are no other rules
+ if ( result === "dependency-mismatch" && rulesCount === 1 ) {
+ dependencyMismatch = true;
+ continue;
+ }
+ dependencyMismatch = false;
+
+ if ( result === "pending" ) {
+ this.toHide = this.toHide.not( this.errorsFor( element ) );
+ return;
+ }
+
+ if ( !result ) {
+ this.formatAndAdd( element, rule );
+ return false;
+ }
+ } catch ( e ) {
+ if ( this.settings.debug && window.console ) {
+ console.log( "Exception occurred when checking element " + element.id + ", check the '" + rule.method + "' method.", e );
+ }
+ if ( e instanceof TypeError ) {
+ e.message += ". Exception occurred when checking element " + element.id + ", check the '" + rule.method + "' method.";
+ }
+
+ throw e;
+ }
+ }
+ if ( dependencyMismatch ) {
+ return;
+ }
+ if ( this.objectLength( rules ) ) {
+ this.successList.push( element );
+ }
+ return true;
+ },
+
+ // Return the custom message for the given element and validation method
+ // specified in the element's HTML5 data attribute
+ // return the generic message if present and no method specific message is present
+ customDataMessage: function( element, method ) {
+ return $( element ).data( "msg" + method.charAt( 0 ).toUpperCase() +
+ method.substring( 1 ).toLowerCase() ) || $( element ).data( "msg" );
+ },
+
+ // Return the custom message for the given element name and validation method
+ customMessage: function( name, method ) {
+ var m = this.settings.messages[ name ];
+ return m && ( m.constructor === String ? m : m[ method ] );
+ },
+
+ // Return the first defined argument, allowing empty strings
+ findDefined: function() {
+ for ( var i = 0; i < arguments.length; i++ ) {
+ if ( arguments[ i ] !== undefined ) {
+ return arguments[ i ];
+ }
+ }
+ return undefined;
+ },
+
+ // The second parameter 'rule' used to be a string, and extended to an object literal
+ // of the following form:
+ // rule = {
+ // method: "method name",
+ // parameters: "the given method parameters"
+ // }
+ //
+ // The old behavior still supported, kept to maintain backward compatibility with
+ // old code, and will be removed in the next major release.
+ defaultMessage: function( element, rule ) {
+ if ( typeof rule === "string" ) {
+ rule = { method: rule };
+ }
+
+ var message = this.findDefined(
+ this.customMessage( element.name, rule.method ),
+ this.customDataMessage( element, rule.method ),
+
+ // 'title' is never undefined, so handle empty string as undefined
+ !this.settings.ignoreTitle && element.title || undefined,
+ $.validator.messages[ rule.method ],
+ "Warning: No message defined for " + element.name + ""
+ ),
+ theregex = /\$?\{(\d+)\}/g;
+ if ( typeof message === "function" ) {
+ message = message.call( this, rule.parameters, element );
+ } else if ( theregex.test( message ) ) {
+ message = $.validator.format( message.replace( theregex, "{$1}" ), rule.parameters );
+ }
+
+ return message;
+ },
+
+ formatAndAdd: function( element, rule ) {
+ var message = this.defaultMessage( element, rule );
+
+ this.errorList.push( {
+ message: message,
+ element: element,
+ method: rule.method
+ } );
+
+ this.errorMap[ element.name ] = message;
+ this.submitted[ element.name ] = message;
+ },
+
+ addWrapper: function( toToggle ) {
+ if ( this.settings.wrapper ) {
+ toToggle = toToggle.add( toToggle.parent( this.settings.wrapper ) );
+ }
+ return toToggle;
+ },
+
+ defaultShowErrors: function() {
+ var i, elements, error;
+ for ( i = 0; this.errorList[ i ]; i++ ) {
+ error = this.errorList[ i ];
+ if ( this.settings.highlight ) {
+ this.settings.highlight.call( this, error.element, this.settings.errorClass, this.settings.validClass );
+ }
+ this.showLabel( error.element, error.message );
+ }
+ if ( this.errorList.length ) {
+ this.toShow = this.toShow.add( this.containers );
+ }
+ if ( this.settings.success ) {
+ for ( i = 0; this.successList[ i ]; i++ ) {
+ this.showLabel( this.successList[ i ] );
+ }
+ }
+ if ( this.settings.unhighlight ) {
+ for ( i = 0, elements = this.validElements(); elements[ i ]; i++ ) {
+ this.settings.unhighlight.call( this, elements[ i ], this.settings.errorClass, this.settings.validClass );
+ }
+ }
+ this.toHide = this.toHide.not( this.toShow );
+ this.hideErrors();
+ this.addWrapper( this.toShow ).show();
+ },
+
+ validElements: function() {
+ return this.currentElements.not( this.invalidElements() );
+ },
+
+ invalidElements: function() {
+ return $( this.errorList ).map( function() {
+ return this.element;
+ } );
+ },
+
+ showLabel: function( element, message ) {
+ var place, group, errorID, v,
+ error = this.errorsFor( element ),
+ elementID = this.idOrName( element ),
+ describedBy = $( element ).attr( "aria-describedby" );
+
+ if ( error.length ) {
+
+ // Refresh error/success class
+ error.removeClass( this.settings.validClass ).addClass( this.settings.errorClass );
+
+ // Replace message on existing label
+ error.html( message );
+ } else {
+
+ // Create error element
+ error = $( "<" + this.settings.errorElement + ">" )
+ .attr( "id", elementID + "-error" )
+ .addClass( this.settings.errorClass )
+ .html( message || "" );
+
+ // Maintain reference to the element to be placed into the DOM
+ place = error;
+ if ( this.settings.wrapper ) {
+
+ // Make sure the element is visible, even in IE
+ // actually showing the wrapped element is handled elsewhere
+ place = error.hide().show().wrap( "<" + this.settings.wrapper + "/>" ).parent();
+ }
+ if ( this.labelContainer.length ) {
+ this.labelContainer.append( place );
+ } else if ( this.settings.errorPlacement ) {
+ this.settings.errorPlacement.call( this, place, $( element ) );
+ } else {
+ place.insertAfter( element );
+ }
+
+ // Link error back to the element
+ if ( error.is( "label" ) ) {
+
+ // If the error is a label, then associate using 'for'
+ error.attr( "for", elementID );
+
+ // If the element is not a child of an associated label, then it's necessary
+ // to explicitly apply aria-describedby
+ } else if ( error.parents( "label[for='" + this.escapeCssMeta( elementID ) + "']" ).length === 0 ) {
+ errorID = error.attr( "id" );
+
+ // Respect existing non-error aria-describedby
+ if ( !describedBy ) {
+ describedBy = errorID;
+ } else if ( !describedBy.match( new RegExp( "\\b" + this.escapeCssMeta( errorID ) + "\\b" ) ) ) {
+
+ // Add to end of list if not already present
+ describedBy += " " + errorID;
+ }
+ $( element ).attr( "aria-describedby", describedBy );
+
+ // If this element is grouped, then assign to all elements in the same group
+ group = this.groups[ element.name ];
+ if ( group ) {
+ v = this;
+ $.each( v.groups, function( name, testgroup ) {
+ if ( testgroup === group ) {
+ $( "[name='" + v.escapeCssMeta( name ) + "']", v.currentForm )
+ .attr( "aria-describedby", error.attr( "id" ) );
+ }
+ } );
+ }
+ }
+ }
+ if ( !message && this.settings.success ) {
+ error.text( "" );
+ if ( typeof this.settings.success === "string" ) {
+ error.addClass( this.settings.success );
+ } else {
+ this.settings.success( error, element );
+ }
+ }
+ this.toShow = this.toShow.add( error );
+ },
+
+ errorsFor: function( element ) {
+ var name = this.escapeCssMeta( this.idOrName( element ) ),
+ describer = $( element ).attr( "aria-describedby" ),
+ selector = "label[for='" + name + "'], label[for='" + name + "'] *";
+
+ // 'aria-describedby' should directly reference the error element
+ if ( describer ) {
+ selector = selector + ", #" + this.escapeCssMeta( describer )
+ .replace( /\s+/g, ", #" );
+ }
+
+ return this
+ .errors()
+ .filter( selector );
+ },
+
+ // See https://api.jquery.com/category/selectors/, for CSS
+ // meta-characters that should be escaped in order to be used with JQuery
+ // as a literal part of a name/id or any selector.
+ escapeCssMeta: function( string ) {
+ return string.replace( /([\\!"#$%&'()*+,./:;<=>?@\[\]^`{|}~])/g, "\\$1" );
+ },
+
+ idOrName: function( element ) {
+ return this.groups[ element.name ] || ( this.checkable( element ) ? element.name : element.id || element.name );
+ },
+
+ validationTargetFor: function( element ) {
+
+ // If radio/checkbox, validate first element in group instead
+ if ( this.checkable( element ) ) {
+ element = this.findByName( element.name );
+ }
+
+ // Always apply ignore filter
+ return $( element ).not( this.settings.ignore )[ 0 ];
+ },
+
+ checkable: function( element ) {
+ return ( /radio|checkbox/i ).test( element.type );
+ },
+
+ findByName: function( name ) {
+ return $( this.currentForm ).find( "[name='" + this.escapeCssMeta( name ) + "']" );
+ },
+
+ getLength: function( value, element ) {
+ switch ( element.nodeName.toLowerCase() ) {
+ case "select":
+ return $( "option:selected", element ).length;
+ case "input":
+ if ( this.checkable( element ) ) {
+ return this.findByName( element.name ).filter( ":checked" ).length;
+ }
+ }
+ return value.length;
+ },
+
+ depend: function( param, element ) {
+ return this.dependTypes[ typeof param ] ? this.dependTypes[ typeof param ]( param, element ) : true;
+ },
+
+ dependTypes: {
+ "boolean": function( param ) {
+ return param;
+ },
+ "string": function( param, element ) {
+ return !!$( param, element.form ).length;
+ },
+ "function": function( param, element ) {
+ return param( element );
+ }
+ },
+
+ optional: function( element ) {
+ var val = this.elementValue( element );
+ return !$.validator.methods.required.call( this, val, element ) && "dependency-mismatch";
+ },
+
+ startRequest: function( element ) {
+ if ( !this.pending[ element.name ] ) {
+ this.pendingRequest++;
+ $( element ).addClass( this.settings.pendingClass );
+ this.pending[ element.name ] = true;
+ }
+ },
+
+ stopRequest: function( element, valid ) {
+ this.pendingRequest--;
+
+ // Sometimes synchronization fails, make sure pendingRequest is never < 0
+ if ( this.pendingRequest < 0 ) {
+ this.pendingRequest = 0;
+ }
+ delete this.pending[ element.name ];
+ $( element ).removeClass( this.settings.pendingClass );
+ if ( valid && this.pendingRequest === 0 && this.formSubmitted && this.form() ) {
+ $( this.currentForm ).submit();
+
+ // Remove the hidden input that was used as a replacement for the
+ // missing submit button. The hidden input is added by `handle()`
+ // to ensure that the value of the used submit button is passed on
+ // for scripted submits triggered by this method
+ if ( this.submitButton ) {
+ $( "input:hidden[name='" + this.submitButton.name + "']", this.currentForm ).remove();
+ }
+
+ this.formSubmitted = false;
+ } else if ( !valid && this.pendingRequest === 0 && this.formSubmitted ) {
+ $( this.currentForm ).triggerHandler( "invalid-form", [ this ] );
+ this.formSubmitted = false;
+ }
+ },
+
+ previousValue: function( element, method ) {
+ method = typeof method === "string" && method || "remote";
+
+ return $.data( element, "previousValue" ) || $.data( element, "previousValue", {
+ old: null,
+ valid: true,
+ message: this.defaultMessage( element, { method: method } )
+ } );
+ },
+
+ // Cleans up all forms and elements, removes validator-specific events
+ destroy: function() {
+ this.resetForm();
+
+ $( this.currentForm )
+ .off( ".validate" )
+ .removeData( "validator" )
+ .find( ".validate-equalTo-blur" )
+ .off( ".validate-equalTo" )
+ .removeClass( "validate-equalTo-blur" );
+ }
+
+ },
+
+ classRuleSettings: {
+ required: { required: true },
+ email: { email: true },
+ url: { url: true },
+ date: { date: true },
+ dateISO: { dateISO: true },
+ number: { number: true },
+ digits: { digits: true },
+ creditcard: { creditcard: true }
+ },
+
+ addClassRules: function( className, rules ) {
+ if ( className.constructor === String ) {
+ this.classRuleSettings[ className ] = rules;
+ } else {
+ $.extend( this.classRuleSettings, className );
+ }
+ },
+
+ classRules: function( element ) {
+ var rules = {},
+ classes = $( element ).attr( "class" );
+
+ if ( classes ) {
+ $.each( classes.split( " " ), function() {
+ if ( this in $.validator.classRuleSettings ) {
+ $.extend( rules, $.validator.classRuleSettings[ this ] );
+ }
+ } );
+ }
+ return rules;
+ },
+
+ normalizeAttributeRule: function( rules, type, method, value ) {
+
+ // Convert the value to a number for number inputs, and for text for backwards compability
+ // allows type="date" and others to be compared as strings
+ if ( /min|max|step/.test( method ) && ( type === null || /number|range|text/.test( type ) ) ) {
+ value = Number( value );
+
+ // Support Opera Mini, which returns NaN for undefined minlength
+ if ( isNaN( value ) ) {
+ value = undefined;
+ }
+ }
+
+ if ( value || value === 0 ) {
+ rules[ method ] = value;
+ } else if ( type === method && type !== "range" ) {
+
+ // Exception: the jquery validate 'range' method
+ // does not test for the html5 'range' type
+ rules[ method ] = true;
+ }
+ },
+
+ attributeRules: function( element ) {
+ var rules = {},
+ $element = $( element ),
+ type = element.getAttribute( "type" ),
+ method, value;
+
+ for ( method in $.validator.methods ) {
+
+ // Support for in both html5 and older browsers
+ if ( method === "required" ) {
+ value = element.getAttribute( method );
+
+ // Some browsers return an empty string for the required attribute
+ // and non-HTML5 browsers might have required="" markup
+ if ( value === "" ) {
+ value = true;
+ }
+
+ // Force non-HTML5 browsers to return bool
+ value = !!value;
+ } else {
+ value = $element.attr( method );
+ }
+
+ this.normalizeAttributeRule( rules, type, method, value );
+ }
+
+ // 'maxlength' may be returned as -1, 2147483647 ( IE ) and 524288 ( safari ) for text inputs
+ if ( rules.maxlength && /-1|2147483647|524288/.test( rules.maxlength ) ) {
+ delete rules.maxlength;
+ }
+
+ return rules;
+ },
+
+ dataRules: function( element ) {
+ var rules = {},
+ $element = $( element ),
+ type = element.getAttribute( "type" ),
+ method, value;
+
+ for ( method in $.validator.methods ) {
+ value = $element.data( "rule" + method.charAt( 0 ).toUpperCase() + method.substring( 1 ).toLowerCase() );
+ this.normalizeAttributeRule( rules, type, method, value );
+ }
+ return rules;
+ },
+
+ staticRules: function( element ) {
+ var rules = {},
+ validator = $.data( element.form, "validator" );
+
+ if ( validator.settings.rules ) {
+ rules = $.validator.normalizeRule( validator.settings.rules[ element.name ] ) || {};
+ }
+ return rules;
+ },
+
+ normalizeRules: function( rules, element ) {
+
+ // Handle dependency check
+ $.each( rules, function( prop, val ) {
+
+ // Ignore rule when param is explicitly false, eg. required:false
+ if ( val === false ) {
+ delete rules[ prop ];
+ return;
+ }
+ if ( val.param || val.depends ) {
+ var keepRule = true;
+ switch ( typeof val.depends ) {
+ case "string":
+ keepRule = !!$( val.depends, element.form ).length;
+ break;
+ case "function":
+ keepRule = val.depends.call( element, element );
+ break;
+ }
+ if ( keepRule ) {
+ rules[ prop ] = val.param !== undefined ? val.param : true;
+ } else {
+ $.data( element.form, "validator" ).resetElements( $( element ) );
+ delete rules[ prop ];
+ }
+ }
+ } );
+
+ // Evaluate parameters
+ $.each( rules, function( rule, parameter ) {
+ rules[ rule ] = $.isFunction( parameter ) && rule !== "normalizer" ? parameter( element ) : parameter;
+ } );
+
+ // Clean number parameters
+ $.each( [ "minlength", "maxlength" ], function() {
+ if ( rules[ this ] ) {
+ rules[ this ] = Number( rules[ this ] );
+ }
+ } );
+ $.each( [ "rangelength", "range" ], function() {
+ var parts;
+ if ( rules[ this ] ) {
+ if ( $.isArray( rules[ this ] ) ) {
+ rules[ this ] = [ Number( rules[ this ][ 0 ] ), Number( rules[ this ][ 1 ] ) ];
+ } else if ( typeof rules[ this ] === "string" ) {
+ parts = rules[ this ].replace( /[\[\]]/g, "" ).split( /[\s,]+/ );
+ rules[ this ] = [ Number( parts[ 0 ] ), Number( parts[ 1 ] ) ];
+ }
+ }
+ } );
+
+ if ( $.validator.autoCreateRanges ) {
+
+ // Auto-create ranges
+ if ( rules.min != null && rules.max != null ) {
+ rules.range = [ rules.min, rules.max ];
+ delete rules.min;
+ delete rules.max;
+ }
+ if ( rules.minlength != null && rules.maxlength != null ) {
+ rules.rangelength = [ rules.minlength, rules.maxlength ];
+ delete rules.minlength;
+ delete rules.maxlength;
+ }
+ }
+
+ return rules;
+ },
+
+ // Converts a simple string to a {string: true} rule, e.g., "required" to {required:true}
+ normalizeRule: function( data ) {
+ if ( typeof data === "string" ) {
+ var transformed = {};
+ $.each( data.split( /\s/ ), function() {
+ transformed[ this ] = true;
+ } );
+ data = transformed;
+ }
+ return data;
+ },
+
+ // https://jqueryvalidation.org/jQuery.validator.addMethod/
+ addMethod: function( name, method, message ) {
+ $.validator.methods[ name ] = method;
+ $.validator.messages[ name ] = message !== undefined ? message : $.validator.messages[ name ];
+ if ( method.length < 3 ) {
+ $.validator.addClassRules( name, $.validator.normalizeRule( name ) );
+ }
+ },
+
+ // https://jqueryvalidation.org/jQuery.validator.methods/
+ methods: {
+
+ // https://jqueryvalidation.org/required-method/
+ required: function( value, element, param ) {
+
+ // Check if dependency is met
+ if ( !this.depend( param, element ) ) {
+ return "dependency-mismatch";
+ }
+ if ( element.nodeName.toLowerCase() === "select" ) {
+
+ // Could be an array for select-multiple or a string, both are fine this way
+ var val = $( element ).val();
+ return val && val.length > 0;
+ }
+ if ( this.checkable( element ) ) {
+ return this.getLength( value, element ) > 0;
+ }
+ return value.length > 0;
+ },
+
+ // https://jqueryvalidation.org/email-method/
+ email: function( value, element ) {
+
+ // From https://html.spec.whatwg.org/multipage/forms.html#valid-e-mail-address
+ // Retrieved 2014-01-14
+ // If you have a problem with this implementation, report a bug against the above spec
+ // Or use custom methods to implement your own email validation
+ return this.optional( element ) || /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test( value );
+ },
+
+ // https://jqueryvalidation.org/url-method/
+ url: function( value, element ) {
+
+ // Copyright (c) 2010-2013 Diego Perini, MIT licensed
+ // https://gist.github.com/dperini/729294
+ // see also https://mathiasbynens.be/demo/url-regex
+ // modified to allow protocol-relative URLs
+ return this.optional( element ) || /^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})).?)(?::\d{2,5})?(?:[/?#]\S*)?$/i.test( value );
+ },
+
+ // https://jqueryvalidation.org/date-method/
+ date: function( value, element ) {
+ return this.optional( element ) || !/Invalid|NaN/.test( new Date( value ).toString() );
+ },
+
+ // https://jqueryvalidation.org/dateISO-method/
+ dateISO: function( value, element ) {
+ return this.optional( element ) || /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test( value );
+ },
+
+ // https://jqueryvalidation.org/number-method/
+ number: function( value, element ) {
+ return this.optional( element ) || /^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test( value );
+ },
+
+ // https://jqueryvalidation.org/digits-method/
+ digits: function( value, element ) {
+ return this.optional( element ) || /^\d+$/.test( value );
+ },
+
+ // https://jqueryvalidation.org/minlength-method/
+ minlength: function( value, element, param ) {
+ var length = $.isArray( value ) ? value.length : this.getLength( value, element );
+ return this.optional( element ) || length >= param;
+ },
+
+ // https://jqueryvalidation.org/maxlength-method/
+ maxlength: function( value, element, param ) {
+ var length = $.isArray( value ) ? value.length : this.getLength( value, element );
+ return this.optional( element ) || length <= param;
+ },
+
+ // https://jqueryvalidation.org/rangelength-method/
+ rangelength: function( value, element, param ) {
+ var length = $.isArray( value ) ? value.length : this.getLength( value, element );
+ return this.optional( element ) || ( length >= param[ 0 ] && length <= param[ 1 ] );
+ },
+
+ // https://jqueryvalidation.org/min-method/
+ min: function( value, element, param ) {
+ return this.optional( element ) || value >= param;
+ },
+
+ // https://jqueryvalidation.org/max-method/
+ max: function( value, element, param ) {
+ return this.optional( element ) || value <= param;
+ },
+
+ // https://jqueryvalidation.org/range-method/
+ range: function( value, element, param ) {
+ return this.optional( element ) || ( value >= param[ 0 ] && value <= param[ 1 ] );
+ },
+
+ // https://jqueryvalidation.org/step-method/
+ step: function( value, element, param ) {
+ var type = $( element ).attr( "type" ),
+ errorMessage = "Step attribute on input type " + type + " is not supported.",
+ supportedTypes = [ "text", "number", "range" ],
+ re = new RegExp( "\\b" + type + "\\b" ),
+ notSupported = type && !re.test( supportedTypes.join() ),
+ decimalPlaces = function( num ) {
+ var match = ( "" + num ).match( /(?:\.(\d+))?$/ );
+ if ( !match ) {
+ return 0;
+ }
+
+ // Number of digits right of decimal point.
+ return match[ 1 ] ? match[ 1 ].length : 0;
+ },
+ toInt = function( num ) {
+ return Math.round( num * Math.pow( 10, decimals ) );
+ },
+ valid = true,
+ decimals;
+
+ // Works only for text, number and range input types
+ // TODO find a way to support input types date, datetime, datetime-local, month, time and week
+ if ( notSupported ) {
+ throw new Error( errorMessage );
+ }
+
+ decimals = decimalPlaces( param );
+
+ // Value can't have too many decimals
+ if ( decimalPlaces( value ) > decimals || toInt( value ) % toInt( param ) !== 0 ) {
+ valid = false;
+ }
+
+ return this.optional( element ) || valid;
+ },
+
+ // https://jqueryvalidation.org/equalTo-method/
+ equalTo: function( value, element, param ) {
+
+ // Bind to the blur event of the target in order to revalidate whenever the target field is updated
+ var target = $( param );
+ if ( this.settings.onfocusout && target.not( ".validate-equalTo-blur" ).length ) {
+ target.addClass( "validate-equalTo-blur" ).on( "blur.validate-equalTo", function() {
+ $( element ).valid();
+ } );
+ }
+ return value === target.val();
+ },
+
+ // https://jqueryvalidation.org/remote-method/
+ remote: function( value, element, param, method ) {
+ if ( this.optional( element ) ) {
+ return "dependency-mismatch";
+ }
+
+ method = typeof method === "string" && method || "remote";
+
+ var previous = this.previousValue( element, method ),
+ validator, data, optionDataString;
+
+ if ( !this.settings.messages[ element.name ] ) {
+ this.settings.messages[ element.name ] = {};
+ }
+ previous.originalMessage = previous.originalMessage || this.settings.messages[ element.name ][ method ];
+ this.settings.messages[ element.name ][ method ] = previous.message;
+
+ param = typeof param === "string" && { url: param } || param;
+ optionDataString = $.param( $.extend( { data: value }, param.data ) );
+ if ( previous.old === optionDataString ) {
+ return previous.valid;
+ }
+
+ previous.old = optionDataString;
+ validator = this;
+ this.startRequest( element );
+ data = {};
+ data[ element.name ] = value;
+ $.ajax( $.extend( true, {
+ mode: "abort",
+ port: "validate" + element.name,
+ dataType: "json",
+ data: data,
+ context: validator.currentForm,
+ success: function( response ) {
+ var valid = response === true || response === "true",
+ errors, message, submitted;
+
+ validator.settings.messages[ element.name ][ method ] = previous.originalMessage;
+ if ( valid ) {
+ submitted = validator.formSubmitted;
+ validator.resetInternals();
+ validator.toHide = validator.errorsFor( element );
+ validator.formSubmitted = submitted;
+ validator.successList.push( element );
+ validator.invalid[ element.name ] = false;
+ validator.showErrors();
+ } else {
+ errors = {};
+ message = response || validator.defaultMessage( element, { method: method, parameters: value } );
+ errors[ element.name ] = previous.message = message;
+ validator.invalid[ element.name ] = true;
+ validator.showErrors( errors );
+ }
+ previous.valid = valid;
+ validator.stopRequest( element, valid );
+ }
+ }, param ) );
+ return "pending";
+ }
+ }
+
+} );
+
+// Ajax mode: abort
+// usage: $.ajax({ mode: "abort"[, port: "uniqueport"]});
+// if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort()
+
+var pendingRequests = {},
+ ajax;
+
+// Use a prefilter if available (1.5+)
+if ( $.ajaxPrefilter ) {
+ $.ajaxPrefilter( function( settings, _, xhr ) {
+ var port = settings.port;
+ if ( settings.mode === "abort" ) {
+ if ( pendingRequests[ port ] ) {
+ pendingRequests[ port ].abort();
+ }
+ pendingRequests[ port ] = xhr;
+ }
+ } );
+} else {
+
+ // Proxy ajax
+ ajax = $.ajax;
+ $.ajax = function( settings ) {
+ var mode = ( "mode" in settings ? settings : $.ajaxSettings ).mode,
+ port = ( "port" in settings ? settings : $.ajaxSettings ).port;
+ if ( mode === "abort" ) {
+ if ( pendingRequests[ port ] ) {
+ pendingRequests[ port ].abort();
+ }
+ pendingRequests[ port ] = ajax.apply( this, arguments );
+ return pendingRequests[ port ];
+ }
+ return ajax.apply( this, arguments );
+ };
+}
+return $;
+}));
+
+/***/ }),
+
+/***/ "./src/newwp.js":
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__run_wp_core_download_js__ = __webpack_require__("./src/run.wp.core.download.js");
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__run_wp_lock_js__ = __webpack_require__("./src/run.wp.lock.js");
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__run_wp_config_create_js__ = __webpack_require__("./src/run.wp.config.create.js");
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__run_wp_core_install_js__ = __webpack_require__("./src/run.wp.core.install.js");
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__run_db_create_js__ = __webpack_require__("./src/run.db.create.js");
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5_jquery_validation__ = __webpack_require__("./node_modules/jquery-validation/dist/jquery.validate.js");
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5_jquery_validation___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_jquery_validation__);
+
+/*** runWPcoreDownload(wpName) ***/
+
+
+/*** runWPlock(wpName, lock) ***/
+/***
+ wpName is the folder name in the root dir
+ lock=status returns if the wp install locked or not
+ locked status = true means there is no ozwpdev.txt in root dir
+ locked status = false means there is ozwpdev.txt in root dir and can be modified
+ to set or unlik ozwpdev.txt assign lock = lock / unlock (unlock means free modify)
+***/
+
+
+/*** runWPconfigCreate(wpName) ***/
+/*** DB_HOST, DB_USER, DB_PASS parameters taken from .env file ***/
+
+
+/*** runWPcoreInstall(wpName, usr, email, pass) ***/
+
+
+/*** runDBcreate(DBname) ***/
+
+
+
+
+
+ $("#frm_validate").submit(function(e){
+ return false;
+ });
+ $("#frm_user").submit(function(e){
+ return false;
+ });
+
+ $("#frm_user").validate();
+
+ $("#btn_validate").hide();
+ $("#frm_validate").validate({
+ success:function(){
+ $("#btn_validate").show();
+ //$("#btn_validate").click();
+ }
+ });
+
+
+$("#btn_validate").on("click", function(e){
+ var wpName=$("#input_validate").val();
+ var usr=$("#user").val();
+ var email=$("#email").val();
+ var pass=$("#pass").val();
+
+
+ $.ajax({
+ url:"../inc/newwp.validate.php",
+ type:"post",
+ async:false,
+ data:{
+ do:"run",
+ run:"validate",
+ wpName:wpName
+ }
+ }).done(function(datas){
+ var data = $.parseJSON(datas);
+ if(data){
+ //valid name!
+ createWP(wpName,usr,email,pass);
+
+ } else {
+ swal("invalid", "WP Name / DB Name already exists, \n please try another name","warning");
+ }
+
+ }). fail(function(){
+ swal("oops","failed to validate!","warning");
+ });
+});
+
+
+function createWP(wpName,usr,email,pass){
+
+ swal(
+ {
+ title: "Create new WP",
+ text: "WP & DB name: " + wpName + " \n "
+ + "User: " + usr + " \n"
+ + "e-Mail: " + email + " \n"
+ + "Pass: " + pass ,
+ icon: "warning",
+ closeOnClickOutside: false,
+ dangerMode: true,
+ buttons: {
+ cancel: true,
+ confirm: {
+ text: "OK, create WP",
+ value: true,
+ visible: true,
+ className: "bg-danger",
+ closeModal: false
+ }
+ },
+ }
+ )
+ . then( (value) => { if(value){ return Object(__WEBPACK_IMPORTED_MODULE_0__run_wp_core_download_js__["a" /* runWPcoreDownload */])(wpName); }})
+
+ .then((value) =>{ if(value){ return Object(__WEBPACK_IMPORTED_MODULE_1__run_wp_lock_js__["a" /* runWPlock */])(wpName,"unlock");} else {swal("oops","something went wrong!","warning");}})
+
+ .then((value) =>{ if(value){ return Object(__WEBPACK_IMPORTED_MODULE_2__run_wp_config_create_js__["a" /* runWPconfigCreate */])(wpName);} else {swal("oops","something went wrong!","warning");}})
+ .then((value) =>{ if(value){ return Object(__WEBPACK_IMPORTED_MODULE_4__run_db_create_js__["a" /* runDBcreate */])(wpName);} else {swal("oops","something went wrong!","warning");}})
+
+ .then((value) =>{ if(value){ return Object(__WEBPACK_IMPORTED_MODULE_3__run_wp_core_install_js__["a" /* runWPcoreInstall */])(wpName,usr,email,pass);} else {swal("oops","something went wrong!","warning");}})
+
+ .then((value) =>{
+ if(value){
+ swal("DONE", wpName + " is ready!", "success").then((value)=>{
+ window.location="./editwp.php?wp="+wpName;
+ });
+
+ } else {swal("oops","something went wrong!","warning");}
+ });
+
+
+
+} // end create WP
+
+
+
+
+
+/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__("./node_modules/jquery/dist/jquery.js-exposed")))
+
+/***/ }),
+
+/***/ "./src/run.db.create.js":
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* WEBPACK VAR INJECTION */(function($) {/* harmony export (immutable) */ __webpack_exports__["a"] = runDBcreate;
+function runDBcreate(dbNAME){
+
+ var status=false;
+
+ $.ajax({
+ url: "../inc/run.db.create.php",
+ type: "post",
+ async:false,
+ data: {do:"run", run:"DBcreate", dbNAME:dbNAME}
+ }).done(function(data){
+ if(data!=="false"){
+ status=true;
+ } else {
+ status=false;
+ }
+
+ }).fail(function(){
+ swal("oops","bad data from rub.db.create.php", "warning");
+ });
+
+ return status;
+
+
+ /*********************** returns true if database created ***********************/
+
+
+
+}//end function
+/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__("./node_modules/jquery/dist/jquery.js-exposed")))
+
+/***/ }),
+
+/***/ "./src/run.wp.config.create.js":
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* WEBPACK VAR INJECTION */(function($) {/* harmony export (immutable) */ __webpack_exports__["a"] = runWPconfigCreate;
+function runWPconfigCreate(wpName){
+
+ var status=false;
+
+ $.ajax({
+ url: "../inc/run.wp.config.create.php",
+ type: "post",
+ dataType: 'json',
+ async:false,
+ data: {do:"run", run:"WPconfigCreate", wpName:wpName}
+
+ }).done(function(data){
+
+ status=true;
+
+
+ }).fail(function(){
+ swal("oops","bad data from run.wp.config.get.php", "warning");
+ });
+
+ return status;
+
+
+
+
+}//end function
+/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__("./node_modules/jquery/dist/jquery.js-exposed")))
+
+/***/ }),
+
+/***/ "./src/run.wp.core.download.js":
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* WEBPACK VAR INJECTION */(function($) {/* harmony export (immutable) */ __webpack_exports__["a"] = runWPcoreDownload;
+function runWPcoreDownload(wpName){
+
+ var status=false;
+
+ $.ajax({
+ url: "../inc/run.wp.core.download.php",
+ type: "post",
+ dataType: 'json',
+ async:false,
+ data: {do:"run", run:"WPcoreDownload", wpName:wpName}
+
+ }).done(function(data){
+
+ status=true;
+
+ }).fail(function(){
+ swal("oops","bad data from run.wp.core.download.php", "warning");
+ });
+
+ return status;
+
+
+
+}//end function
+/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__("./node_modules/jquery/dist/jquery.js-exposed")))
+
+/***/ }),
+
+/***/ "./src/run.wp.core.install.js":
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* WEBPACK VAR INJECTION */(function($) {/* harmony export (immutable) */ __webpack_exports__["a"] = runWPcoreInstall;
+function runWPcoreInstall(wpName, usr, email, pass){
+
+ var status=false;
+
+ $.ajax({
+ url: "../inc/run.wp.core.install.php",
+ type: "post",
+ dataType: 'json',
+ async:false,
+ data: {do:"run", run:"WPcoreInstall", wpName:wpName, usr:usr, email:email, pass:pass}
+
+ }).done(function(data){
+
+ status=true;
+
+ }).fail(function(){
+ swal("oops","bad data from run.wp.core.download.php", "warning");
+ });
+
+ return status;
+
+
+
+}//end function
+/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__("./node_modules/jquery/dist/jquery.js-exposed")))
+
+/***/ }),
+
+/***/ "./src/run.wp.lock.js":
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* WEBPACK VAR INJECTION */(function($) {/* harmony export (immutable) */ __webpack_exports__["a"] = runWPlock;
+function runWPlock(wpName, lock){
+
+ /***
+ wpName is the folder name in the root dir
+ lock=status returns if the wp install locked or not
+ locked status = true means there is no ozwpdev.txt in root dir
+ locked status = false means there is ozwpdev.txt in root dir and can be modified
+ to set or unlik ozwpdev.txt assign lock = lock / unlock (unlock means free modify)
+ ***/
+
+ var status=false;
+
+ $.ajax({
+ url: "../inc/run.wp.lock.php",
+ type: "post",
+ async:false,
+ data: {
+ do:"run",
+ run:"WPlock",
+ wpName:wpName,
+ lock:lock
+ }
+
+ }).done(function(data){
+
+ status=$.parseJSON(data);
+
+ }).fail(function(){
+ swal("oops","bad data from run.wp.lock.php", "warning");
+ });
+
+ return status;
+
+
+
+}//end function
+/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__("./node_modules/jquery/dist/jquery.js-exposed")))
+
+/***/ }),
+
+/***/ 3:
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = __webpack_require__("./src/newwp.js");
+
+
+/***/ })
+
+},[3]);
+//# sourceMappingURL=newwp.bundle.js.map
\ No newline at end of file
diff --git a/dist/newwp.bundle.js.map b/dist/newwp.bundle.js.map
new file mode 100644
index 0000000..5e4f9fd
--- /dev/null
+++ b/dist/newwp.bundle.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack:///./node_modules/jquery-validation/dist/jquery.validate.js","webpack:///./src/newwp.js","webpack:///./src/run.db.create.js","webpack:///./src/run.wp.config.create.js","webpack:///./src/run.wp.core.download.js","webpack:///./src/run.wp.core.install.js","webpack:///./src/run.wp.lock.js"],"names":[],"mappings":";;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AACA,EAAE;AACF;AACA,EAAE;AACF;AACA;AACA,CAAC;;AAED;;AAEA;AACA;;AAEA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA,EAAE;;AAEF;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;;AAEA,iDAAiD;AACjD;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,qBAAqB,kBAAkB;AACvC;;AAEA;AACA;AACA;AACA;AACA,2BAA2B,gBAAgB;AAC3C;;AAEA;AACA;AACA,CAAC;;AAED;AACA,4CAA4C;;AAE5C;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA,mCAAmC;AACnC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,YAAY;AACvD;AACA,GAAG;AACH,EAAE;AACF;AACA;;AAEA;;AAEA;AACA,cAAc;AACd,YAAY;AACZ,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;;AAEA;AACA,IAAI;AACJ;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,EAAE;AAC/D,yDAAyD,EAAE;AAC3D,kEAAkE,EAAE,MAAM,EAAE;AAC5E,4DAA4D,EAAE,MAAM,EAAE;AACtE,wEAAwE,EAAE;AAC1E,2EAA2E,EAAE;AAC7E,yDAAyD,EAAE;AAC3D,EAAE;;AAEF;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,IAAI;AACJ;AACA;AACA;AACA,IAAI;;AAEJ;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,0EAA0E,eAAe;AACzF;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA,gBAAgB,eAAe;AAC/B;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA,uCAAuC;AACvC;AACA,KAAK;;AAEL;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,IAAI;AACJ,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,YAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,mBAAmB,sBAAsB;AACzC;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,qBAAqB,OAAO;AAC5B;AACA;AACA,IAAI;AACJ,+DAA+D,GAAG;AAClE;;AAEA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,eAAe,qBAAqB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,uBAAuB;AACvC;AACA;AACA;AACA;AACA,iDAAiD,eAAe;AAChE;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,IAAI;AACJ,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,MAAM;;AAEN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,+CAA+C,YAAY,EAAE;AAC7D,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,IAAI;AACJ;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA,4CAA4C,iBAAiB;AAC7D,IAAI;AACJ,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,EAAE;;AAEF;AACA,aAAa,iBAAiB;AAC9B,UAAU,cAAc;AACxB,QAAQ,YAAY;AACpB,SAAS,aAAa;AACtB,YAAY,gBAAgB;AAC5B,WAAW,eAAe;AAC1B,WAAW,eAAe;AAC1B,eAAe;AACf,EAAE;;AAEF;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,EAAE;;AAEF;AACA,gBAAgB;AAChB;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,EAAE;;AAEF;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,EAAE;;AAEF;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA,gBAAgB;AAChB;;AAEA;AACA;AACA;AACA;AACA,EAAE;;AAEF;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,EAAE;;AAEF,mCAAmC,aAAa,4BAA4B;AAC5E;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA,mEAAmE,EAAE,gCAAgC,KAAK,6CAA6C,KAAK;AAC5J,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA,8GAA8G,IAAI,EAAE,EAAE,iCAAiC,IAAI,EAAE,EAAE,sCAAsC,IAAI,EAAE,EAAE,gDAAgD,IAAI,oBAAoB,EAAE,oLAAoL,GAAG,YAAY,IAAI;AAC9d,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,2CAA2C,EAAE;AAC7C,GAAG;;AAEH;AACA;AACA,sDAAsD,IAAI,OAAO,EAAE;AACnE,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,yCAAyC,aAAa;AACtD,0CAA0C,cAAc;AACxD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,gEAAgE,oCAAoC;AACpG;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA,CAAC;;AAED;AACA,kBAAkB,qCAAqC;AACvD;;AAEA,wBAAwB;AACxB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,G;;;;;;;;;;;;;;;;AChkDyB;AAC1B;;AAEkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE0B;AAC1B;AACA;;AAEyB;AACzB;;AAEoB;AACpB;;;;AAIA;;AAEA;AACA;AACA,EAAE;AACF;AACA;AACA,EAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;;AAGF;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;;AAEA,GAAG;AACH;AACA;;AAEA,EAAE;AACF;AACA,EAAE;AACF,CAAC;;;AAGD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,qBAAqB,WAAW,4GAAkC,GAAG;;AAErE,kBAAkB,WAAW,qGAAoC,OAAO,iDAAiD;;AAEzH,kBAAkB,WAAW,6GAAmC,OAAO,iDAAiD;AACxH,kBAAkB,WAAW,gGAA6B,OAAO,iDAAiD;;AAElH,kBAAkB,WAAW,0HAAiD,OAAO,iDAAiD;;AAEtI;AACA;AACA;AACA;AACA,KAAK;;AAEL,IAAI,OAAO;AACX,GAAG;;;;AAIH,CAAC;;;;;;;;;;;;;;;ACzHD;;AAEA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT,EAAE;AACF;AACA;AACA,GAAG;AACH;AACA;;AAEA,EAAE;AACF;AACA,EAAE;;AAEF;;;AAGA;;;;AAIA,CAAC,c;;;;;;;;;;AC3BD;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET,EAAE;;AAEF;;;AAGA,EAAE;AACF;AACA,EAAE;;AAEF;;;;;AAKA,CAAC,c;;;;;;;;;;ACzBD;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET,EAAE;;AAEF;;AAEA,EAAE;AACF;AACA,EAAE;;AAEF;;;;AAIA,CAAC,c;;;;;;;;;;ACvBD;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET,EAAE;;AAEF;;AAEA,EAAE;AACF;AACA,EAAE;;AAEF;;;;AAIA,CAAC,c;;;;;;;;;;ACvBD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,EAAE;;AAEF;;AAEA,EAAE;AACF;AACA,EAAE;;AAEF;;;;AAIA,CAAC,c","file":"newwp.bundle.js","sourcesContent":["/*!\r\n * jQuery Validation Plugin v1.17.0\r\n *\r\n * https://jqueryvalidation.org/\r\n *\r\n * Copyright (c) 2017 Jörn Zaefferer\r\n * Released under the MIT license\r\n */\r\n(function( factory ) {\r\n\tif ( typeof define === \"function\" && define.amd ) {\r\n\t\tdefine( [\"jquery\"], factory );\r\n\t} else if (typeof module === \"object\" && module.exports) {\r\n\t\tmodule.exports = factory( require( \"jquery\" ) );\r\n\t} else {\r\n\t\tfactory( jQuery );\r\n\t}\r\n}(function( $ ) {\r\n\r\n$.extend( $.fn, {\n\n\t// https://jqueryvalidation.org/validate/\n\tvalidate: function( options ) {\n\n\t\t// If nothing is selected, return nothing; can't chain anyway\n\t\tif ( !this.length ) {\n\t\t\tif ( options && options.debug && window.console ) {\n\t\t\t\tconsole.warn( \"Nothing selected, can't validate, returning nothing.\" );\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Check if a validator for this form was already created\n\t\tvar validator = $.data( this[ 0 ], \"validator\" );\n\t\tif ( validator ) {\n\t\t\treturn validator;\n\t\t}\n\n\t\t// Add novalidate tag if HTML5.\n\t\tthis.attr( \"novalidate\", \"novalidate\" );\n\n\t\tvalidator = new $.validator( options, this[ 0 ] );\n\t\t$.data( this[ 0 ], \"validator\", validator );\n\n\t\tif ( validator.settings.onsubmit ) {\n\n\t\t\tthis.on( \"click.validate\", \":submit\", function( event ) {\n\n\t\t\t\t// Track the used submit button to properly handle scripted\n\t\t\t\t// submits later.\n\t\t\t\tvalidator.submitButton = event.currentTarget;\n\n\t\t\t\t// Allow suppressing validation by adding a cancel class to the submit button\n\t\t\t\tif ( $( this ).hasClass( \"cancel\" ) ) {\n\t\t\t\t\tvalidator.cancelSubmit = true;\n\t\t\t\t}\n\n\t\t\t\t// Allow suppressing validation by adding the html5 formnovalidate attribute to the submit button\n\t\t\t\tif ( $( this ).attr( \"formnovalidate\" ) !== undefined ) {\n\t\t\t\t\tvalidator.cancelSubmit = true;\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t// Validate the form on submit\n\t\t\tthis.on( \"submit.validate\", function( event ) {\n\t\t\t\tif ( validator.settings.debug ) {\n\n\t\t\t\t\t// Prevent form submit to be able to see console output\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t\tfunction handle() {\n\t\t\t\t\tvar hidden, result;\n\n\t\t\t\t\t// Insert a hidden input as a replacement for the missing submit button\n\t\t\t\t\t// The hidden input is inserted in two cases:\n\t\t\t\t\t// - A user defined a `submitHandler`\n\t\t\t\t\t// - There was a pending request due to `remote` method and `stopRequest()`\n\t\t\t\t\t// was called to submit the form in case it's valid\n\t\t\t\t\tif ( validator.submitButton && ( validator.settings.submitHandler || validator.formSubmitted ) ) {\n\t\t\t\t\t\thidden = $( \"\" )\n\t\t\t\t\t\t\t.attr( \"name\", validator.submitButton.name )\n\t\t\t\t\t\t\t.val( $( validator.submitButton ).val() )\n\t\t\t\t\t\t\t.appendTo( validator.currentForm );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( validator.settings.submitHandler ) {\n\t\t\t\t\t\tresult = validator.settings.submitHandler.call( validator, validator.currentForm, event );\n\t\t\t\t\t\tif ( hidden ) {\n\n\t\t\t\t\t\t\t// And clean up afterwards; thanks to no-block-scope, hidden can be referenced\n\t\t\t\t\t\t\thidden.remove();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( result !== undefined ) {\n\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\t// Prevent submit for invalid forms or custom submit handlers\n\t\t\t\tif ( validator.cancelSubmit ) {\n\t\t\t\t\tvalidator.cancelSubmit = false;\n\t\t\t\t\treturn handle();\n\t\t\t\t}\n\t\t\t\tif ( validator.form() ) {\n\t\t\t\t\tif ( validator.pendingRequest ) {\n\t\t\t\t\t\tvalidator.formSubmitted = true;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\treturn handle();\n\t\t\t\t} else {\n\t\t\t\t\tvalidator.focusInvalid();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\treturn validator;\n\t},\n\n\t// https://jqueryvalidation.org/valid/\n\tvalid: function() {\n\t\tvar valid, validator, errorList;\n\n\t\tif ( $( this[ 0 ] ).is( \"form\" ) ) {\n\t\t\tvalid = this.validate().form();\n\t\t} else {\n\t\t\terrorList = [];\n\t\t\tvalid = true;\n\t\t\tvalidator = $( this[ 0 ].form ).validate();\n\t\t\tthis.each( function() {\n\t\t\t\tvalid = validator.element( this ) && valid;\n\t\t\t\tif ( !valid ) {\n\t\t\t\t\terrorList = errorList.concat( validator.errorList );\n\t\t\t\t}\n\t\t\t} );\n\t\t\tvalidator.errorList = errorList;\n\t\t}\n\t\treturn valid;\n\t},\n\n\t// https://jqueryvalidation.org/rules/\n\trules: function( command, argument ) {\n\t\tvar element = this[ 0 ],\n\t\t\tsettings, staticRules, existingRules, data, param, filtered;\n\n\t\t// If nothing is selected, return empty object; can't chain anyway\n\t\tif ( element == null ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( !element.form && element.hasAttribute( \"contenteditable\" ) ) {\n\t\t\telement.form = this.closest( \"form\" )[ 0 ];\n\t\t\telement.name = this.attr( \"name\" );\n\t\t}\n\n\t\tif ( element.form == null ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( command ) {\n\t\t\tsettings = $.data( element.form, \"validator\" ).settings;\n\t\t\tstaticRules = settings.rules;\n\t\t\texistingRules = $.validator.staticRules( element );\n\t\t\tswitch ( command ) {\n\t\t\tcase \"add\":\n\t\t\t\t$.extend( existingRules, $.validator.normalizeRule( argument ) );\n\n\t\t\t\t// Remove messages from rules, but allow them to be set separately\n\t\t\t\tdelete existingRules.messages;\n\t\t\t\tstaticRules[ element.name ] = existingRules;\n\t\t\t\tif ( argument.messages ) {\n\t\t\t\t\tsettings.messages[ element.name ] = $.extend( settings.messages[ element.name ], argument.messages );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"remove\":\n\t\t\t\tif ( !argument ) {\n\t\t\t\t\tdelete staticRules[ element.name ];\n\t\t\t\t\treturn existingRules;\n\t\t\t\t}\n\t\t\t\tfiltered = {};\n\t\t\t\t$.each( argument.split( /\\s/ ), function( index, method ) {\n\t\t\t\t\tfiltered[ method ] = existingRules[ method ];\n\t\t\t\t\tdelete existingRules[ method ];\n\t\t\t\t} );\n\t\t\t\treturn filtered;\n\t\t\t}\n\t\t}\n\n\t\tdata = $.validator.normalizeRules(\n\t\t$.extend(\n\t\t\t{},\n\t\t\t$.validator.classRules( element ),\n\t\t\t$.validator.attributeRules( element ),\n\t\t\t$.validator.dataRules( element ),\n\t\t\t$.validator.staticRules( element )\n\t\t), element );\n\n\t\t// Make sure required is at front\n\t\tif ( data.required ) {\n\t\t\tparam = data.required;\n\t\t\tdelete data.required;\n\t\t\tdata = $.extend( { required: param }, data );\n\t\t}\n\n\t\t// Make sure remote is at back\n\t\tif ( data.remote ) {\n\t\t\tparam = data.remote;\n\t\t\tdelete data.remote;\n\t\t\tdata = $.extend( data, { remote: param } );\n\t\t}\n\n\t\treturn data;\n\t}\n} );\n\n// Custom selectors\n$.extend( $.expr.pseudos || $.expr[ \":\" ], {\t\t// '|| $.expr[ \":\" ]' here enables backwards compatibility to jQuery 1.7. Can be removed when dropping jQ 1.7.x support\n\n\t// https://jqueryvalidation.org/blank-selector/\n\tblank: function( a ) {\n\t\treturn !$.trim( \"\" + $( a ).val() );\n\t},\n\n\t// https://jqueryvalidation.org/filled-selector/\n\tfilled: function( a ) {\n\t\tvar val = $( a ).val();\n\t\treturn val !== null && !!$.trim( \"\" + val );\n\t},\n\n\t// https://jqueryvalidation.org/unchecked-selector/\n\tunchecked: function( a ) {\n\t\treturn !$( a ).prop( \"checked\" );\n\t}\n} );\n\n// Constructor for validator\n$.validator = function( options, form ) {\n\tthis.settings = $.extend( true, {}, $.validator.defaults, options );\n\tthis.currentForm = form;\n\tthis.init();\n};\n\n// https://jqueryvalidation.org/jQuery.validator.format/\n$.validator.format = function( source, params ) {\n\tif ( arguments.length === 1 ) {\n\t\treturn function() {\n\t\t\tvar args = $.makeArray( arguments );\n\t\t\targs.unshift( source );\n\t\t\treturn $.validator.format.apply( this, args );\n\t\t};\n\t}\n\tif ( params === undefined ) {\n\t\treturn source;\n\t}\n\tif ( arguments.length > 2 && params.constructor !== Array ) {\n\t\tparams = $.makeArray( arguments ).slice( 1 );\n\t}\n\tif ( params.constructor !== Array ) {\n\t\tparams = [ params ];\n\t}\n\t$.each( params, function( i, n ) {\n\t\tsource = source.replace( new RegExp( \"\\\\{\" + i + \"\\\\}\", \"g\" ), function() {\n\t\t\treturn n;\n\t\t} );\n\t} );\n\treturn source;\n};\n\n$.extend( $.validator, {\n\n\tdefaults: {\n\t\tmessages: {},\n\t\tgroups: {},\n\t\trules: {},\n\t\terrorClass: \"error\",\n\t\tpendingClass: \"pending\",\n\t\tvalidClass: \"valid\",\n\t\terrorElement: \"label\",\n\t\tfocusCleanup: false,\n\t\tfocusInvalid: true,\n\t\terrorContainer: $( [] ),\n\t\terrorLabelContainer: $( [] ),\n\t\tonsubmit: true,\n\t\tignore: \":hidden\",\n\t\tignoreTitle: false,\n\t\tonfocusin: function( element ) {\n\t\t\tthis.lastActive = element;\n\n\t\t\t// Hide error label and remove error class on focus if enabled\n\t\t\tif ( this.settings.focusCleanup ) {\n\t\t\t\tif ( this.settings.unhighlight ) {\n\t\t\t\t\tthis.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.validClass );\n\t\t\t\t}\n\t\t\t\tthis.hideThese( this.errorsFor( element ) );\n\t\t\t}\n\t\t},\n\t\tonfocusout: function( element ) {\n\t\t\tif ( !this.checkable( element ) && ( element.name in this.submitted || !this.optional( element ) ) ) {\n\t\t\t\tthis.element( element );\n\t\t\t}\n\t\t},\n\t\tonkeyup: function( element, event ) {\n\n\t\t\t// Avoid revalidate the field when pressing one of the following keys\n\t\t\t// Shift => 16\n\t\t\t// Ctrl => 17\n\t\t\t// Alt => 18\n\t\t\t// Caps lock => 20\n\t\t\t// End => 35\n\t\t\t// Home => 36\n\t\t\t// Left arrow => 37\n\t\t\t// Up arrow => 38\n\t\t\t// Right arrow => 39\n\t\t\t// Down arrow => 40\n\t\t\t// Insert => 45\n\t\t\t// Num lock => 144\n\t\t\t// AltGr key => 225\n\t\t\tvar excludedKeys = [\n\t\t\t\t16, 17, 18, 20, 35, 36, 37,\n\t\t\t\t38, 39, 40, 45, 144, 225\n\t\t\t];\n\n\t\t\tif ( event.which === 9 && this.elementValue( element ) === \"\" || $.inArray( event.keyCode, excludedKeys ) !== -1 ) {\n\t\t\t\treturn;\n\t\t\t} else if ( element.name in this.submitted || element.name in this.invalid ) {\n\t\t\t\tthis.element( element );\n\t\t\t}\n\t\t},\n\t\tonclick: function( element ) {\n\n\t\t\t// Click on selects, radiobuttons and checkboxes\n\t\t\tif ( element.name in this.submitted ) {\n\t\t\t\tthis.element( element );\n\n\t\t\t// Or option elements, check parent select in that case\n\t\t\t} else if ( element.parentNode.name in this.submitted ) {\n\t\t\t\tthis.element( element.parentNode );\n\t\t\t}\n\t\t},\n\t\thighlight: function( element, errorClass, validClass ) {\n\t\t\tif ( element.type === \"radio\" ) {\n\t\t\t\tthis.findByName( element.name ).addClass( errorClass ).removeClass( validClass );\n\t\t\t} else {\n\t\t\t\t$( element ).addClass( errorClass ).removeClass( validClass );\n\t\t\t}\n\t\t},\n\t\tunhighlight: function( element, errorClass, validClass ) {\n\t\t\tif ( element.type === \"radio\" ) {\n\t\t\t\tthis.findByName( element.name ).removeClass( errorClass ).addClass( validClass );\n\t\t\t} else {\n\t\t\t\t$( element ).removeClass( errorClass ).addClass( validClass );\n\t\t\t}\n\t\t}\n\t},\n\n\t// https://jqueryvalidation.org/jQuery.validator.setDefaults/\n\tsetDefaults: function( settings ) {\n\t\t$.extend( $.validator.defaults, settings );\n\t},\n\n\tmessages: {\n\t\trequired: \"This field is required.\",\n\t\tremote: \"Please fix this field.\",\n\t\temail: \"Please enter a valid email address.\",\n\t\turl: \"Please enter a valid URL.\",\n\t\tdate: \"Please enter a valid date.\",\n\t\tdateISO: \"Please enter a valid date (ISO).\",\n\t\tnumber: \"Please enter a valid number.\",\n\t\tdigits: \"Please enter only digits.\",\n\t\tequalTo: \"Please enter the same value again.\",\n\t\tmaxlength: $.validator.format( \"Please enter no more than {0} characters.\" ),\n\t\tminlength: $.validator.format( \"Please enter at least {0} characters.\" ),\n\t\trangelength: $.validator.format( \"Please enter a value between {0} and {1} characters long.\" ),\n\t\trange: $.validator.format( \"Please enter a value between {0} and {1}.\" ),\n\t\tmax: $.validator.format( \"Please enter a value less than or equal to {0}.\" ),\n\t\tmin: $.validator.format( \"Please enter a value greater than or equal to {0}.\" ),\n\t\tstep: $.validator.format( \"Please enter a multiple of {0}.\" )\n\t},\n\n\tautoCreateRanges: false,\n\n\tprototype: {\n\n\t\tinit: function() {\n\t\t\tthis.labelContainer = $( this.settings.errorLabelContainer );\n\t\t\tthis.errorContext = this.labelContainer.length && this.labelContainer || $( this.currentForm );\n\t\t\tthis.containers = $( this.settings.errorContainer ).add( this.settings.errorLabelContainer );\n\t\t\tthis.submitted = {};\n\t\t\tthis.valueCache = {};\n\t\t\tthis.pendingRequest = 0;\n\t\t\tthis.pending = {};\n\t\t\tthis.invalid = {};\n\t\t\tthis.reset();\n\n\t\t\tvar groups = ( this.groups = {} ),\n\t\t\t\trules;\n\t\t\t$.each( this.settings.groups, function( key, value ) {\n\t\t\t\tif ( typeof value === \"string\" ) {\n\t\t\t\t\tvalue = value.split( /\\s/ );\n\t\t\t\t}\n\t\t\t\t$.each( value, function( index, name ) {\n\t\t\t\t\tgroups[ name ] = key;\n\t\t\t\t} );\n\t\t\t} );\n\t\t\trules = this.settings.rules;\n\t\t\t$.each( rules, function( key, value ) {\n\t\t\t\trules[ key ] = $.validator.normalizeRule( value );\n\t\t\t} );\n\n\t\t\tfunction delegate( event ) {\n\n\t\t\t\t// Set form expando on contenteditable\n\t\t\t\tif ( !this.form && this.hasAttribute( \"contenteditable\" ) ) {\n\t\t\t\t\tthis.form = $( this ).closest( \"form\" )[ 0 ];\n\t\t\t\t\tthis.name = $( this ).attr( \"name\" );\n\t\t\t\t}\n\n\t\t\t\tvar validator = $.data( this.form, \"validator\" ),\n\t\t\t\t\teventType = \"on\" + event.type.replace( /^validate/, \"\" ),\n\t\t\t\t\tsettings = validator.settings;\n\t\t\t\tif ( settings[ eventType ] && !$( this ).is( settings.ignore ) ) {\n\t\t\t\t\tsettings[ eventType ].call( validator, this, event );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$( this.currentForm )\n\t\t\t\t.on( \"focusin.validate focusout.validate keyup.validate\",\n\t\t\t\t\t\":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], \" +\n\t\t\t\t\t\"[type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], \" +\n\t\t\t\t\t\"[type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], \" +\n\t\t\t\t\t\"[type='radio'], [type='checkbox'], [contenteditable], [type='button']\", delegate )\n\n\t\t\t\t// Support: Chrome, oldIE\n\t\t\t\t// \"select\" is provided as event.target when clicking a option\n\t\t\t\t.on( \"click.validate\", \"select, option, [type='radio'], [type='checkbox']\", delegate );\n\n\t\t\tif ( this.settings.invalidHandler ) {\n\t\t\t\t$( this.currentForm ).on( \"invalid-form.validate\", this.settings.invalidHandler );\n\t\t\t}\n\t\t},\n\n\t\t// https://jqueryvalidation.org/Validator.form/\n\t\tform: function() {\n\t\t\tthis.checkForm();\n\t\t\t$.extend( this.submitted, this.errorMap );\n\t\t\tthis.invalid = $.extend( {}, this.errorMap );\n\t\t\tif ( !this.valid() ) {\n\t\t\t\t$( this.currentForm ).triggerHandler( \"invalid-form\", [ this ] );\n\t\t\t}\n\t\t\tthis.showErrors();\n\t\t\treturn this.valid();\n\t\t},\n\n\t\tcheckForm: function() {\n\t\t\tthis.prepareForm();\n\t\t\tfor ( var i = 0, elements = ( this.currentElements = this.elements() ); elements[ i ]; i++ ) {\n\t\t\t\tthis.check( elements[ i ] );\n\t\t\t}\n\t\t\treturn this.valid();\n\t\t},\n\n\t\t// https://jqueryvalidation.org/Validator.element/\n\t\telement: function( element ) {\n\t\t\tvar cleanElement = this.clean( element ),\n\t\t\t\tcheckElement = this.validationTargetFor( cleanElement ),\n\t\t\t\tv = this,\n\t\t\t\tresult = true,\n\t\t\t\trs, group;\n\n\t\t\tif ( checkElement === undefined ) {\n\t\t\t\tdelete this.invalid[ cleanElement.name ];\n\t\t\t} else {\n\t\t\t\tthis.prepareElement( checkElement );\n\t\t\t\tthis.currentElements = $( checkElement );\n\n\t\t\t\t// If this element is grouped, then validate all group elements already\n\t\t\t\t// containing a value\n\t\t\t\tgroup = this.groups[ checkElement.name ];\n\t\t\t\tif ( group ) {\n\t\t\t\t\t$.each( this.groups, function( name, testgroup ) {\n\t\t\t\t\t\tif ( testgroup === group && name !== checkElement.name ) {\n\t\t\t\t\t\t\tcleanElement = v.validationTargetFor( v.clean( v.findByName( name ) ) );\n\t\t\t\t\t\t\tif ( cleanElement && cleanElement.name in v.invalid ) {\n\t\t\t\t\t\t\t\tv.currentElements.push( cleanElement );\n\t\t\t\t\t\t\t\tresult = v.check( cleanElement ) && result;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\trs = this.check( checkElement ) !== false;\n\t\t\t\tresult = result && rs;\n\t\t\t\tif ( rs ) {\n\t\t\t\t\tthis.invalid[ checkElement.name ] = false;\n\t\t\t\t} else {\n\t\t\t\t\tthis.invalid[ checkElement.name ] = true;\n\t\t\t\t}\n\n\t\t\t\tif ( !this.numberOfInvalids() ) {\n\n\t\t\t\t\t// Hide error containers on last error\n\t\t\t\t\tthis.toHide = this.toHide.add( this.containers );\n\t\t\t\t}\n\t\t\t\tthis.showErrors();\n\n\t\t\t\t// Add aria-invalid status for screen readers\n\t\t\t\t$( element ).attr( \"aria-invalid\", !rs );\n\t\t\t}\n\n\t\t\treturn result;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/Validator.showErrors/\n\t\tshowErrors: function( errors ) {\n\t\t\tif ( errors ) {\n\t\t\t\tvar validator = this;\n\n\t\t\t\t// Add items to error list and map\n\t\t\t\t$.extend( this.errorMap, errors );\n\t\t\t\tthis.errorList = $.map( this.errorMap, function( message, name ) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tmessage: message,\n\t\t\t\t\t\telement: validator.findByName( name )[ 0 ]\n\t\t\t\t\t};\n\t\t\t\t} );\n\n\t\t\t\t// Remove items from success list\n\t\t\t\tthis.successList = $.grep( this.successList, function( element ) {\n\t\t\t\t\treturn !( element.name in errors );\n\t\t\t\t} );\n\t\t\t}\n\t\t\tif ( this.settings.showErrors ) {\n\t\t\t\tthis.settings.showErrors.call( this, this.errorMap, this.errorList );\n\t\t\t} else {\n\t\t\t\tthis.defaultShowErrors();\n\t\t\t}\n\t\t},\n\n\t\t// https://jqueryvalidation.org/Validator.resetForm/\n\t\tresetForm: function() {\n\t\t\tif ( $.fn.resetForm ) {\n\t\t\t\t$( this.currentForm ).resetForm();\n\t\t\t}\n\t\t\tthis.invalid = {};\n\t\t\tthis.submitted = {};\n\t\t\tthis.prepareForm();\n\t\t\tthis.hideErrors();\n\t\t\tvar elements = this.elements()\n\t\t\t\t.removeData( \"previousValue\" )\n\t\t\t\t.removeAttr( \"aria-invalid\" );\n\n\t\t\tthis.resetElements( elements );\n\t\t},\n\n\t\tresetElements: function( elements ) {\n\t\t\tvar i;\n\n\t\t\tif ( this.settings.unhighlight ) {\n\t\t\t\tfor ( i = 0; elements[ i ]; i++ ) {\n\t\t\t\t\tthis.settings.unhighlight.call( this, elements[ i ],\n\t\t\t\t\t\tthis.settings.errorClass, \"\" );\n\t\t\t\t\tthis.findByName( elements[ i ].name ).removeClass( this.settings.validClass );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\telements\n\t\t\t\t\t.removeClass( this.settings.errorClass )\n\t\t\t\t\t.removeClass( this.settings.validClass );\n\t\t\t}\n\t\t},\n\n\t\tnumberOfInvalids: function() {\n\t\t\treturn this.objectLength( this.invalid );\n\t\t},\n\n\t\tobjectLength: function( obj ) {\n\t\t\t/* jshint unused: false */\n\t\t\tvar count = 0,\n\t\t\t\ti;\n\t\t\tfor ( i in obj ) {\n\n\t\t\t\t// This check allows counting elements with empty error\n\t\t\t\t// message as invalid elements\n\t\t\t\tif ( obj[ i ] !== undefined && obj[ i ] !== null && obj[ i ] !== false ) {\n\t\t\t\t\tcount++;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn count;\n\t\t},\n\n\t\thideErrors: function() {\n\t\t\tthis.hideThese( this.toHide );\n\t\t},\n\n\t\thideThese: function( errors ) {\n\t\t\terrors.not( this.containers ).text( \"\" );\n\t\t\tthis.addWrapper( errors ).hide();\n\t\t},\n\n\t\tvalid: function() {\n\t\t\treturn this.size() === 0;\n\t\t},\n\n\t\tsize: function() {\n\t\t\treturn this.errorList.length;\n\t\t},\n\n\t\tfocusInvalid: function() {\n\t\t\tif ( this.settings.focusInvalid ) {\n\t\t\t\ttry {\n\t\t\t\t\t$( this.findLastActive() || this.errorList.length && this.errorList[ 0 ].element || [] )\n\t\t\t\t\t.filter( \":visible\" )\n\t\t\t\t\t.focus()\n\n\t\t\t\t\t// Manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find\n\t\t\t\t\t.trigger( \"focusin\" );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// Ignore IE throwing errors when focusing hidden elements\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tfindLastActive: function() {\n\t\t\tvar lastActive = this.lastActive;\n\t\t\treturn lastActive && $.grep( this.errorList, function( n ) {\n\t\t\t\treturn n.element.name === lastActive.name;\n\t\t\t} ).length === 1 && lastActive;\n\t\t},\n\n\t\telements: function() {\n\t\t\tvar validator = this,\n\t\t\t\trulesCache = {};\n\n\t\t\t// Select all valid inputs inside the form (no submit or reset buttons)\n\t\t\treturn $( this.currentForm )\n\t\t\t.find( \"input, select, textarea, [contenteditable]\" )\n\t\t\t.not( \":submit, :reset, :image, :disabled\" )\n\t\t\t.not( this.settings.ignore )\n\t\t\t.filter( function() {\n\t\t\t\tvar name = this.name || $( this ).attr( \"name\" ); // For contenteditable\n\t\t\t\tif ( !name && validator.settings.debug && window.console ) {\n\t\t\t\t\tconsole.error( \"%o has no name assigned\", this );\n\t\t\t\t}\n\n\t\t\t\t// Set form expando on contenteditable\n\t\t\t\tif ( this.hasAttribute( \"contenteditable\" ) ) {\n\t\t\t\t\tthis.form = $( this ).closest( \"form\" )[ 0 ];\n\t\t\t\t\tthis.name = name;\n\t\t\t\t}\n\n\t\t\t\t// Select only the first element for each name, and only those with rules specified\n\t\t\t\tif ( name in rulesCache || !validator.objectLength( $( this ).rules() ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\trulesCache[ name ] = true;\n\t\t\t\treturn true;\n\t\t\t} );\n\t\t},\n\n\t\tclean: function( selector ) {\n\t\t\treturn $( selector )[ 0 ];\n\t\t},\n\n\t\terrors: function() {\n\t\t\tvar errorClass = this.settings.errorClass.split( \" \" ).join( \".\" );\n\t\t\treturn $( this.settings.errorElement + \".\" + errorClass, this.errorContext );\n\t\t},\n\n\t\tresetInternals: function() {\n\t\t\tthis.successList = [];\n\t\t\tthis.errorList = [];\n\t\t\tthis.errorMap = {};\n\t\t\tthis.toShow = $( [] );\n\t\t\tthis.toHide = $( [] );\n\t\t},\n\n\t\treset: function() {\n\t\t\tthis.resetInternals();\n\t\t\tthis.currentElements = $( [] );\n\t\t},\n\n\t\tprepareForm: function() {\n\t\t\tthis.reset();\n\t\t\tthis.toHide = this.errors().add( this.containers );\n\t\t},\n\n\t\tprepareElement: function( element ) {\n\t\t\tthis.reset();\n\t\t\tthis.toHide = this.errorsFor( element );\n\t\t},\n\n\t\telementValue: function( element ) {\n\t\t\tvar $element = $( element ),\n\t\t\t\ttype = element.type,\n\t\t\t\tval, idx;\n\n\t\t\tif ( type === \"radio\" || type === \"checkbox\" ) {\n\t\t\t\treturn this.findByName( element.name ).filter( \":checked\" ).val();\n\t\t\t} else if ( type === \"number\" && typeof element.validity !== \"undefined\" ) {\n\t\t\t\treturn element.validity.badInput ? \"NaN\" : $element.val();\n\t\t\t}\n\n\t\t\tif ( element.hasAttribute( \"contenteditable\" ) ) {\n\t\t\t\tval = $element.text();\n\t\t\t} else {\n\t\t\t\tval = $element.val();\n\t\t\t}\n\n\t\t\tif ( type === \"file\" ) {\n\n\t\t\t\t// Modern browser (chrome & safari)\n\t\t\t\tif ( val.substr( 0, 12 ) === \"C:\\\\fakepath\\\\\" ) {\n\t\t\t\t\treturn val.substr( 12 );\n\t\t\t\t}\n\n\t\t\t\t// Legacy browsers\n\t\t\t\t// Unix-based path\n\t\t\t\tidx = val.lastIndexOf( \"/\" );\n\t\t\t\tif ( idx >= 0 ) {\n\t\t\t\t\treturn val.substr( idx + 1 );\n\t\t\t\t}\n\n\t\t\t\t// Windows-based path\n\t\t\t\tidx = val.lastIndexOf( \"\\\\\" );\n\t\t\t\tif ( idx >= 0 ) {\n\t\t\t\t\treturn val.substr( idx + 1 );\n\t\t\t\t}\n\n\t\t\t\t// Just the file name\n\t\t\t\treturn val;\n\t\t\t}\n\n\t\t\tif ( typeof val === \"string\" ) {\n\t\t\t\treturn val.replace( /\\r/g, \"\" );\n\t\t\t}\n\t\t\treturn val;\n\t\t},\n\n\t\tcheck: function( element ) {\n\t\t\telement = this.validationTargetFor( this.clean( element ) );\n\n\t\t\tvar rules = $( element ).rules(),\n\t\t\t\trulesCount = $.map( rules, function( n, i ) {\n\t\t\t\t\treturn i;\n\t\t\t\t} ).length,\n\t\t\t\tdependencyMismatch = false,\n\t\t\t\tval = this.elementValue( element ),\n\t\t\t\tresult, method, rule, normalizer;\n\n\t\t\t// Prioritize the local normalizer defined for this element over the global one\n\t\t\t// if the former exists, otherwise user the global one in case it exists.\n\t\t\tif ( typeof rules.normalizer === \"function\" ) {\n\t\t\t\tnormalizer = rules.normalizer;\n\t\t\t} else if (\ttypeof this.settings.normalizer === \"function\" ) {\n\t\t\t\tnormalizer = this.settings.normalizer;\n\t\t\t}\n\n\t\t\t// If normalizer is defined, then call it to retreive the changed value instead\n\t\t\t// of using the real one.\n\t\t\t// Note that `this` in the normalizer is `element`.\n\t\t\tif ( normalizer ) {\n\t\t\t\tval = normalizer.call( element, val );\n\n\t\t\t\tif ( typeof val !== \"string\" ) {\n\t\t\t\t\tthrow new TypeError( \"The normalizer should return a string value.\" );\n\t\t\t\t}\n\n\t\t\t\t// Delete the normalizer from rules to avoid treating it as a pre-defined method.\n\t\t\t\tdelete rules.normalizer;\n\t\t\t}\n\n\t\t\tfor ( method in rules ) {\n\t\t\t\trule = { method: method, parameters: rules[ method ] };\n\t\t\t\ttry {\n\t\t\t\t\tresult = $.validator.methods[ method ].call( this, val, element, rule.parameters );\n\n\t\t\t\t\t// If a method indicates that the field is optional and therefore valid,\n\t\t\t\t\t// don't mark it as valid when there are no other rules\n\t\t\t\t\tif ( result === \"dependency-mismatch\" && rulesCount === 1 ) {\n\t\t\t\t\t\tdependencyMismatch = true;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tdependencyMismatch = false;\n\n\t\t\t\t\tif ( result === \"pending\" ) {\n\t\t\t\t\t\tthis.toHide = this.toHide.not( this.errorsFor( element ) );\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !result ) {\n\t\t\t\t\t\tthis.formatAndAdd( element, rule );\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t} catch ( e ) {\n\t\t\t\t\tif ( this.settings.debug && window.console ) {\n\t\t\t\t\t\tconsole.log( \"Exception occurred when checking element \" + element.id + \", check the '\" + rule.method + \"' method.\", e );\n\t\t\t\t\t}\n\t\t\t\t\tif ( e instanceof TypeError ) {\n\t\t\t\t\t\te.message += \". Exception occurred when checking element \" + element.id + \", check the '\" + rule.method + \"' method.\";\n\t\t\t\t\t}\n\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( dependencyMismatch ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( this.objectLength( rules ) ) {\n\t\t\t\tthis.successList.push( element );\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t// Return the custom message for the given element and validation method\n\t\t// specified in the element's HTML5 data attribute\n\t\t// return the generic message if present and no method specific message is present\n\t\tcustomDataMessage: function( element, method ) {\n\t\t\treturn $( element ).data( \"msg\" + method.charAt( 0 ).toUpperCase() +\n\t\t\t\tmethod.substring( 1 ).toLowerCase() ) || $( element ).data( \"msg\" );\n\t\t},\n\n\t\t// Return the custom message for the given element name and validation method\n\t\tcustomMessage: function( name, method ) {\n\t\t\tvar m = this.settings.messages[ name ];\n\t\t\treturn m && ( m.constructor === String ? m : m[ method ] );\n\t\t},\n\n\t\t// Return the first defined argument, allowing empty strings\n\t\tfindDefined: function() {\n\t\t\tfor ( var i = 0; i < arguments.length; i++ ) {\n\t\t\t\tif ( arguments[ i ] !== undefined ) {\n\t\t\t\t\treturn arguments[ i ];\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn undefined;\n\t\t},\n\n\t\t// The second parameter 'rule' used to be a string, and extended to an object literal\n\t\t// of the following form:\n\t\t// rule = {\n\t\t// method: \"method name\",\n\t\t// parameters: \"the given method parameters\"\n\t\t// }\n\t\t//\n\t\t// The old behavior still supported, kept to maintain backward compatibility with\n\t\t// old code, and will be removed in the next major release.\n\t\tdefaultMessage: function( element, rule ) {\n\t\t\tif ( typeof rule === \"string\" ) {\n\t\t\t\trule = { method: rule };\n\t\t\t}\n\n\t\t\tvar message = this.findDefined(\n\t\t\t\t\tthis.customMessage( element.name, rule.method ),\n\t\t\t\t\tthis.customDataMessage( element, rule.method ),\n\n\t\t\t\t\t// 'title' is never undefined, so handle empty string as undefined\n\t\t\t\t\t!this.settings.ignoreTitle && element.title || undefined,\n\t\t\t\t\t$.validator.messages[ rule.method ],\n\t\t\t\t\t\"Warning: No message defined for \" + element.name + \"\"\n\t\t\t\t),\n\t\t\t\ttheregex = /\\$?\\{(\\d+)\\}/g;\n\t\t\tif ( typeof message === \"function\" ) {\n\t\t\t\tmessage = message.call( this, rule.parameters, element );\n\t\t\t} else if ( theregex.test( message ) ) {\n\t\t\t\tmessage = $.validator.format( message.replace( theregex, \"{$1}\" ), rule.parameters );\n\t\t\t}\n\n\t\t\treturn message;\n\t\t},\n\n\t\tformatAndAdd: function( element, rule ) {\n\t\t\tvar message = this.defaultMessage( element, rule );\n\n\t\t\tthis.errorList.push( {\n\t\t\t\tmessage: message,\n\t\t\t\telement: element,\n\t\t\t\tmethod: rule.method\n\t\t\t} );\n\n\t\t\tthis.errorMap[ element.name ] = message;\n\t\t\tthis.submitted[ element.name ] = message;\n\t\t},\n\n\t\taddWrapper: function( toToggle ) {\n\t\t\tif ( this.settings.wrapper ) {\n\t\t\t\ttoToggle = toToggle.add( toToggle.parent( this.settings.wrapper ) );\n\t\t\t}\n\t\t\treturn toToggle;\n\t\t},\n\n\t\tdefaultShowErrors: function() {\n\t\t\tvar i, elements, error;\n\t\t\tfor ( i = 0; this.errorList[ i ]; i++ ) {\n\t\t\t\terror = this.errorList[ i ];\n\t\t\t\tif ( this.settings.highlight ) {\n\t\t\t\t\tthis.settings.highlight.call( this, error.element, this.settings.errorClass, this.settings.validClass );\n\t\t\t\t}\n\t\t\t\tthis.showLabel( error.element, error.message );\n\t\t\t}\n\t\t\tif ( this.errorList.length ) {\n\t\t\t\tthis.toShow = this.toShow.add( this.containers );\n\t\t\t}\n\t\t\tif ( this.settings.success ) {\n\t\t\t\tfor ( i = 0; this.successList[ i ]; i++ ) {\n\t\t\t\t\tthis.showLabel( this.successList[ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( this.settings.unhighlight ) {\n\t\t\t\tfor ( i = 0, elements = this.validElements(); elements[ i ]; i++ ) {\n\t\t\t\t\tthis.settings.unhighlight.call( this, elements[ i ], this.settings.errorClass, this.settings.validClass );\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.toHide = this.toHide.not( this.toShow );\n\t\t\tthis.hideErrors();\n\t\t\tthis.addWrapper( this.toShow ).show();\n\t\t},\n\n\t\tvalidElements: function() {\n\t\t\treturn this.currentElements.not( this.invalidElements() );\n\t\t},\n\n\t\tinvalidElements: function() {\n\t\t\treturn $( this.errorList ).map( function() {\n\t\t\t\treturn this.element;\n\t\t\t} );\n\t\t},\n\n\t\tshowLabel: function( element, message ) {\n\t\t\tvar place, group, errorID, v,\n\t\t\t\terror = this.errorsFor( element ),\n\t\t\t\telementID = this.idOrName( element ),\n\t\t\t\tdescribedBy = $( element ).attr( \"aria-describedby\" );\n\n\t\t\tif ( error.length ) {\n\n\t\t\t\t// Refresh error/success class\n\t\t\t\terror.removeClass( this.settings.validClass ).addClass( this.settings.errorClass );\n\n\t\t\t\t// Replace message on existing label\n\t\t\t\terror.html( message );\n\t\t\t} else {\n\n\t\t\t\t// Create error element\n\t\t\t\terror = $( \"<\" + this.settings.errorElement + \">\" )\n\t\t\t\t\t.attr( \"id\", elementID + \"-error\" )\n\t\t\t\t\t.addClass( this.settings.errorClass )\n\t\t\t\t\t.html( message || \"\" );\n\n\t\t\t\t// Maintain reference to the element to be placed into the DOM\n\t\t\t\tplace = error;\n\t\t\t\tif ( this.settings.wrapper ) {\n\n\t\t\t\t\t// Make sure the element is visible, even in IE\n\t\t\t\t\t// actually showing the wrapped element is handled elsewhere\n\t\t\t\t\tplace = error.hide().show().wrap( \"<\" + this.settings.wrapper + \"/>\" ).parent();\n\t\t\t\t}\n\t\t\t\tif ( this.labelContainer.length ) {\n\t\t\t\t\tthis.labelContainer.append( place );\n\t\t\t\t} else if ( this.settings.errorPlacement ) {\n\t\t\t\t\tthis.settings.errorPlacement.call( this, place, $( element ) );\n\t\t\t\t} else {\n\t\t\t\t\tplace.insertAfter( element );\n\t\t\t\t}\n\n\t\t\t\t// Link error back to the element\n\t\t\t\tif ( error.is( \"label\" ) ) {\n\n\t\t\t\t\t// If the error is a label, then associate using 'for'\n\t\t\t\t\terror.attr( \"for\", elementID );\n\n\t\t\t\t\t// If the element is not a child of an associated label, then it's necessary\n\t\t\t\t\t// to explicitly apply aria-describedby\n\t\t\t\t} else if ( error.parents( \"label[for='\" + this.escapeCssMeta( elementID ) + \"']\" ).length === 0 ) {\n\t\t\t\t\terrorID = error.attr( \"id\" );\n\n\t\t\t\t\t// Respect existing non-error aria-describedby\n\t\t\t\t\tif ( !describedBy ) {\n\t\t\t\t\t\tdescribedBy = errorID;\n\t\t\t\t\t} else if ( !describedBy.match( new RegExp( \"\\\\b\" + this.escapeCssMeta( errorID ) + \"\\\\b\" ) ) ) {\n\n\t\t\t\t\t\t// Add to end of list if not already present\n\t\t\t\t\t\tdescribedBy += \" \" + errorID;\n\t\t\t\t\t}\n\t\t\t\t\t$( element ).attr( \"aria-describedby\", describedBy );\n\n\t\t\t\t\t// If this element is grouped, then assign to all elements in the same group\n\t\t\t\t\tgroup = this.groups[ element.name ];\n\t\t\t\t\tif ( group ) {\n\t\t\t\t\t\tv = this;\n\t\t\t\t\t\t$.each( v.groups, function( name, testgroup ) {\n\t\t\t\t\t\t\tif ( testgroup === group ) {\n\t\t\t\t\t\t\t\t$( \"[name='\" + v.escapeCssMeta( name ) + \"']\", v.currentForm )\n\t\t\t\t\t\t\t\t\t.attr( \"aria-describedby\", error.attr( \"id\" ) );\n\t\t\t\t\t\t\t}\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\tif ( !message && this.settings.success ) {\n\t\t\t\terror.text( \"\" );\n\t\t\t\tif ( typeof this.settings.success === \"string\" ) {\n\t\t\t\t\terror.addClass( this.settings.success );\n\t\t\t\t} else {\n\t\t\t\t\tthis.settings.success( error, element );\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.toShow = this.toShow.add( error );\n\t\t},\n\n\t\terrorsFor: function( element ) {\n\t\t\tvar name = this.escapeCssMeta( this.idOrName( element ) ),\n\t\t\t\tdescriber = $( element ).attr( \"aria-describedby\" ),\n\t\t\t\tselector = \"label[for='\" + name + \"'], label[for='\" + name + \"'] *\";\n\n\t\t\t// 'aria-describedby' should directly reference the error element\n\t\t\tif ( describer ) {\n\t\t\t\tselector = selector + \", #\" + this.escapeCssMeta( describer )\n\t\t\t\t\t.replace( /\\s+/g, \", #\" );\n\t\t\t}\n\n\t\t\treturn this\n\t\t\t\t.errors()\n\t\t\t\t.filter( selector );\n\t\t},\n\n\t\t// See https://api.jquery.com/category/selectors/, for CSS\n\t\t// meta-characters that should be escaped in order to be used with JQuery\n\t\t// as a literal part of a name/id or any selector.\n\t\tescapeCssMeta: function( string ) {\n\t\t\treturn string.replace( /([\\\\!\"#$%&'()*+,./:;<=>?@\\[\\]^`{|}~])/g, \"\\\\$1\" );\n\t\t},\n\n\t\tidOrName: function( element ) {\n\t\t\treturn this.groups[ element.name ] || ( this.checkable( element ) ? element.name : element.id || element.name );\n\t\t},\n\n\t\tvalidationTargetFor: function( element ) {\n\n\t\t\t// If radio/checkbox, validate first element in group instead\n\t\t\tif ( this.checkable( element ) ) {\n\t\t\t\telement = this.findByName( element.name );\n\t\t\t}\n\n\t\t\t// Always apply ignore filter\n\t\t\treturn $( element ).not( this.settings.ignore )[ 0 ];\n\t\t},\n\n\t\tcheckable: function( element ) {\n\t\t\treturn ( /radio|checkbox/i ).test( element.type );\n\t\t},\n\n\t\tfindByName: function( name ) {\n\t\t\treturn $( this.currentForm ).find( \"[name='\" + this.escapeCssMeta( name ) + \"']\" );\n\t\t},\n\n\t\tgetLength: function( value, element ) {\n\t\t\tswitch ( element.nodeName.toLowerCase() ) {\n\t\t\tcase \"select\":\n\t\t\t\treturn $( \"option:selected\", element ).length;\n\t\t\tcase \"input\":\n\t\t\t\tif ( this.checkable( element ) ) {\n\t\t\t\t\treturn this.findByName( element.name ).filter( \":checked\" ).length;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn value.length;\n\t\t},\n\n\t\tdepend: function( param, element ) {\n\t\t\treturn this.dependTypes[ typeof param ] ? this.dependTypes[ typeof param ]( param, element ) : true;\n\t\t},\n\n\t\tdependTypes: {\n\t\t\t\"boolean\": function( param ) {\n\t\t\t\treturn param;\n\t\t\t},\n\t\t\t\"string\": function( param, element ) {\n\t\t\t\treturn !!$( param, element.form ).length;\n\t\t\t},\n\t\t\t\"function\": function( param, element ) {\n\t\t\t\treturn param( element );\n\t\t\t}\n\t\t},\n\n\t\toptional: function( element ) {\n\t\t\tvar val = this.elementValue( element );\n\t\t\treturn !$.validator.methods.required.call( this, val, element ) && \"dependency-mismatch\";\n\t\t},\n\n\t\tstartRequest: function( element ) {\n\t\t\tif ( !this.pending[ element.name ] ) {\n\t\t\t\tthis.pendingRequest++;\n\t\t\t\t$( element ).addClass( this.settings.pendingClass );\n\t\t\t\tthis.pending[ element.name ] = true;\n\t\t\t}\n\t\t},\n\n\t\tstopRequest: function( element, valid ) {\n\t\t\tthis.pendingRequest--;\n\n\t\t\t// Sometimes synchronization fails, make sure pendingRequest is never < 0\n\t\t\tif ( this.pendingRequest < 0 ) {\n\t\t\t\tthis.pendingRequest = 0;\n\t\t\t}\n\t\t\tdelete this.pending[ element.name ];\n\t\t\t$( element ).removeClass( this.settings.pendingClass );\n\t\t\tif ( valid && this.pendingRequest === 0 && this.formSubmitted && this.form() ) {\n\t\t\t\t$( this.currentForm ).submit();\n\n\t\t\t\t// Remove the hidden input that was used as a replacement for the\n\t\t\t\t// missing submit button. The hidden input is added by `handle()`\n\t\t\t\t// to ensure that the value of the used submit button is passed on\n\t\t\t\t// for scripted submits triggered by this method\n\t\t\t\tif ( this.submitButton ) {\n\t\t\t\t\t$( \"input:hidden[name='\" + this.submitButton.name + \"']\", this.currentForm ).remove();\n\t\t\t\t}\n\n\t\t\t\tthis.formSubmitted = false;\n\t\t\t} else if ( !valid && this.pendingRequest === 0 && this.formSubmitted ) {\n\t\t\t\t$( this.currentForm ).triggerHandler( \"invalid-form\", [ this ] );\n\t\t\t\tthis.formSubmitted = false;\n\t\t\t}\n\t\t},\n\n\t\tpreviousValue: function( element, method ) {\n\t\t\tmethod = typeof method === \"string\" && method || \"remote\";\n\n\t\t\treturn $.data( element, \"previousValue\" ) || $.data( element, \"previousValue\", {\n\t\t\t\told: null,\n\t\t\t\tvalid: true,\n\t\t\t\tmessage: this.defaultMessage( element, { method: method } )\n\t\t\t} );\n\t\t},\n\n\t\t// Cleans up all forms and elements, removes validator-specific events\n\t\tdestroy: function() {\n\t\t\tthis.resetForm();\n\n\t\t\t$( this.currentForm )\n\t\t\t\t.off( \".validate\" )\n\t\t\t\t.removeData( \"validator\" )\n\t\t\t\t.find( \".validate-equalTo-blur\" )\n\t\t\t\t\t.off( \".validate-equalTo\" )\n\t\t\t\t\t.removeClass( \"validate-equalTo-blur\" );\n\t\t}\n\n\t},\n\n\tclassRuleSettings: {\n\t\trequired: { required: true },\n\t\temail: { email: true },\n\t\turl: { url: true },\n\t\tdate: { date: true },\n\t\tdateISO: { dateISO: true },\n\t\tnumber: { number: true },\n\t\tdigits: { digits: true },\n\t\tcreditcard: { creditcard: true }\n\t},\n\n\taddClassRules: function( className, rules ) {\n\t\tif ( className.constructor === String ) {\n\t\t\tthis.classRuleSettings[ className ] = rules;\n\t\t} else {\n\t\t\t$.extend( this.classRuleSettings, className );\n\t\t}\n\t},\n\n\tclassRules: function( element ) {\n\t\tvar rules = {},\n\t\t\tclasses = $( element ).attr( \"class\" );\n\n\t\tif ( classes ) {\n\t\t\t$.each( classes.split( \" \" ), function() {\n\t\t\t\tif ( this in $.validator.classRuleSettings ) {\n\t\t\t\t\t$.extend( rules, $.validator.classRuleSettings[ this ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t\treturn rules;\n\t},\n\n\tnormalizeAttributeRule: function( rules, type, method, value ) {\n\n\t\t// Convert the value to a number for number inputs, and for text for backwards compability\n\t\t// allows type=\"date\" and others to be compared as strings\n\t\tif ( /min|max|step/.test( method ) && ( type === null || /number|range|text/.test( type ) ) ) {\n\t\t\tvalue = Number( value );\n\n\t\t\t// Support Opera Mini, which returns NaN for undefined minlength\n\t\t\tif ( isNaN( value ) ) {\n\t\t\t\tvalue = undefined;\n\t\t\t}\n\t\t}\n\n\t\tif ( value || value === 0 ) {\n\t\t\trules[ method ] = value;\n\t\t} else if ( type === method && type !== \"range\" ) {\n\n\t\t\t// Exception: the jquery validate 'range' method\n\t\t\t// does not test for the html5 'range' type\n\t\t\trules[ method ] = true;\n\t\t}\n\t},\n\n\tattributeRules: function( element ) {\n\t\tvar rules = {},\n\t\t\t$element = $( element ),\n\t\t\ttype = element.getAttribute( \"type\" ),\n\t\t\tmethod, value;\n\n\t\tfor ( method in $.validator.methods ) {\n\n\t\t\t// Support for in both html5 and older browsers\n\t\t\tif ( method === \"required\" ) {\n\t\t\t\tvalue = element.getAttribute( method );\n\n\t\t\t\t// Some browsers return an empty string for the required attribute\n\t\t\t\t// and non-HTML5 browsers might have required=\"\" markup\n\t\t\t\tif ( value === \"\" ) {\n\t\t\t\t\tvalue = true;\n\t\t\t\t}\n\n\t\t\t\t// Force non-HTML5 browsers to return bool\n\t\t\t\tvalue = !!value;\n\t\t\t} else {\n\t\t\t\tvalue = $element.attr( method );\n\t\t\t}\n\n\t\t\tthis.normalizeAttributeRule( rules, type, method, value );\n\t\t}\n\n\t\t// 'maxlength' may be returned as -1, 2147483647 ( IE ) and 524288 ( safari ) for text inputs\n\t\tif ( rules.maxlength && /-1|2147483647|524288/.test( rules.maxlength ) ) {\n\t\t\tdelete rules.maxlength;\n\t\t}\n\n\t\treturn rules;\n\t},\n\n\tdataRules: function( element ) {\n\t\tvar rules = {},\n\t\t\t$element = $( element ),\n\t\t\ttype = element.getAttribute( \"type\" ),\n\t\t\tmethod, value;\n\n\t\tfor ( method in $.validator.methods ) {\n\t\t\tvalue = $element.data( \"rule\" + method.charAt( 0 ).toUpperCase() + method.substring( 1 ).toLowerCase() );\n\t\t\tthis.normalizeAttributeRule( rules, type, method, value );\n\t\t}\n\t\treturn rules;\n\t},\n\n\tstaticRules: function( element ) {\n\t\tvar rules = {},\n\t\t\tvalidator = $.data( element.form, \"validator\" );\n\n\t\tif ( validator.settings.rules ) {\n\t\t\trules = $.validator.normalizeRule( validator.settings.rules[ element.name ] ) || {};\n\t\t}\n\t\treturn rules;\n\t},\n\n\tnormalizeRules: function( rules, element ) {\n\n\t\t// Handle dependency check\n\t\t$.each( rules, function( prop, val ) {\n\n\t\t\t// Ignore rule when param is explicitly false, eg. required:false\n\t\t\tif ( val === false ) {\n\t\t\t\tdelete rules[ prop ];\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( val.param || val.depends ) {\n\t\t\t\tvar keepRule = true;\n\t\t\t\tswitch ( typeof val.depends ) {\n\t\t\t\tcase \"string\":\n\t\t\t\t\tkeepRule = !!$( val.depends, element.form ).length;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"function\":\n\t\t\t\t\tkeepRule = val.depends.call( element, element );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif ( keepRule ) {\n\t\t\t\t\trules[ prop ] = val.param !== undefined ? val.param : true;\n\t\t\t\t} else {\n\t\t\t\t\t$.data( element.form, \"validator\" ).resetElements( $( element ) );\n\t\t\t\t\tdelete rules[ prop ];\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\t// Evaluate parameters\n\t\t$.each( rules, function( rule, parameter ) {\n\t\t\trules[ rule ] = $.isFunction( parameter ) && rule !== \"normalizer\" ? parameter( element ) : parameter;\n\t\t} );\n\n\t\t// Clean number parameters\n\t\t$.each( [ \"minlength\", \"maxlength\" ], function() {\n\t\t\tif ( rules[ this ] ) {\n\t\t\t\trules[ this ] = Number( rules[ this ] );\n\t\t\t}\n\t\t} );\n\t\t$.each( [ \"rangelength\", \"range\" ], function() {\n\t\t\tvar parts;\n\t\t\tif ( rules[ this ] ) {\n\t\t\t\tif ( $.isArray( rules[ this ] ) ) {\n\t\t\t\t\trules[ this ] = [ Number( rules[ this ][ 0 ] ), Number( rules[ this ][ 1 ] ) ];\n\t\t\t\t} else if ( typeof rules[ this ] === \"string\" ) {\n\t\t\t\t\tparts = rules[ this ].replace( /[\\[\\]]/g, \"\" ).split( /[\\s,]+/ );\n\t\t\t\t\trules[ this ] = [ Number( parts[ 0 ] ), Number( parts[ 1 ] ) ];\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\tif ( $.validator.autoCreateRanges ) {\n\n\t\t\t// Auto-create ranges\n\t\t\tif ( rules.min != null && rules.max != null ) {\n\t\t\t\trules.range = [ rules.min, rules.max ];\n\t\t\t\tdelete rules.min;\n\t\t\t\tdelete rules.max;\n\t\t\t}\n\t\t\tif ( rules.minlength != null && rules.maxlength != null ) {\n\t\t\t\trules.rangelength = [ rules.minlength, rules.maxlength ];\n\t\t\t\tdelete rules.minlength;\n\t\t\t\tdelete rules.maxlength;\n\t\t\t}\n\t\t}\n\n\t\treturn rules;\n\t},\n\n\t// Converts a simple string to a {string: true} rule, e.g., \"required\" to {required:true}\n\tnormalizeRule: function( data ) {\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tvar transformed = {};\n\t\t\t$.each( data.split( /\\s/ ), function() {\n\t\t\t\ttransformed[ this ] = true;\n\t\t\t} );\n\t\t\tdata = transformed;\n\t\t}\n\t\treturn data;\n\t},\n\n\t// https://jqueryvalidation.org/jQuery.validator.addMethod/\n\taddMethod: function( name, method, message ) {\n\t\t$.validator.methods[ name ] = method;\n\t\t$.validator.messages[ name ] = message !== undefined ? message : $.validator.messages[ name ];\n\t\tif ( method.length < 3 ) {\n\t\t\t$.validator.addClassRules( name, $.validator.normalizeRule( name ) );\n\t\t}\n\t},\n\n\t// https://jqueryvalidation.org/jQuery.validator.methods/\n\tmethods: {\n\n\t\t// https://jqueryvalidation.org/required-method/\n\t\trequired: function( value, element, param ) {\n\n\t\t\t// Check if dependency is met\n\t\t\tif ( !this.depend( param, element ) ) {\n\t\t\t\treturn \"dependency-mismatch\";\n\t\t\t}\n\t\t\tif ( element.nodeName.toLowerCase() === \"select\" ) {\n\n\t\t\t\t// Could be an array for select-multiple or a string, both are fine this way\n\t\t\t\tvar val = $( element ).val();\n\t\t\t\treturn val && val.length > 0;\n\t\t\t}\n\t\t\tif ( this.checkable( element ) ) {\n\t\t\t\treturn this.getLength( value, element ) > 0;\n\t\t\t}\n\t\t\treturn value.length > 0;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/email-method/\n\t\temail: function( value, element ) {\n\n\t\t\t// From https://html.spec.whatwg.org/multipage/forms.html#valid-e-mail-address\n\t\t\t// Retrieved 2014-01-14\n\t\t\t// If you have a problem with this implementation, report a bug against the above spec\n\t\t\t// Or use custom methods to implement your own email validation\n\t\t\treturn this.optional( element ) || /^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test( value );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/url-method/\n\t\turl: function( value, element ) {\n\n\t\t\t// Copyright (c) 2010-2013 Diego Perini, MIT licensed\n\t\t\t// https://gist.github.com/dperini/729294\n\t\t\t// see also https://mathiasbynens.be/demo/url-regex\n\t\t\t// modified to allow protocol-relative URLs\n\t\t\treturn this.optional( element ) || /^(?:(?:(?:https?|ftp):)?\\/\\/)(?:\\S+(?::\\S*)?@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})).?)(?::\\d{2,5})?(?:[/?#]\\S*)?$/i.test( value );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/date-method/\n\t\tdate: function( value, element ) {\n\t\t\treturn this.optional( element ) || !/Invalid|NaN/.test( new Date( value ).toString() );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/dateISO-method/\n\t\tdateISO: function( value, element ) {\n\t\t\treturn this.optional( element ) || /^\\d{4}[\\/\\-](0?[1-9]|1[012])[\\/\\-](0?[1-9]|[12][0-9]|3[01])$/.test( value );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/number-method/\n\t\tnumber: function( value, element ) {\n\t\t\treturn this.optional( element ) || /^(?:-?\\d+|-?\\d{1,3}(?:,\\d{3})+)?(?:\\.\\d+)?$/.test( value );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/digits-method/\n\t\tdigits: function( value, element ) {\n\t\t\treturn this.optional( element ) || /^\\d+$/.test( value );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/minlength-method/\n\t\tminlength: function( value, element, param ) {\n\t\t\tvar length = $.isArray( value ) ? value.length : this.getLength( value, element );\n\t\t\treturn this.optional( element ) || length >= param;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/maxlength-method/\n\t\tmaxlength: function( value, element, param ) {\n\t\t\tvar length = $.isArray( value ) ? value.length : this.getLength( value, element );\n\t\t\treturn this.optional( element ) || length <= param;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/rangelength-method/\n\t\trangelength: function( value, element, param ) {\n\t\t\tvar length = $.isArray( value ) ? value.length : this.getLength( value, element );\n\t\t\treturn this.optional( element ) || ( length >= param[ 0 ] && length <= param[ 1 ] );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/min-method/\n\t\tmin: function( value, element, param ) {\n\t\t\treturn this.optional( element ) || value >= param;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/max-method/\n\t\tmax: function( value, element, param ) {\n\t\t\treturn this.optional( element ) || value <= param;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/range-method/\n\t\trange: function( value, element, param ) {\n\t\t\treturn this.optional( element ) || ( value >= param[ 0 ] && value <= param[ 1 ] );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/step-method/\n\t\tstep: function( value, element, param ) {\n\t\t\tvar type = $( element ).attr( \"type\" ),\n\t\t\t\terrorMessage = \"Step attribute on input type \" + type + \" is not supported.\",\n\t\t\t\tsupportedTypes = [ \"text\", \"number\", \"range\" ],\n\t\t\t\tre = new RegExp( \"\\\\b\" + type + \"\\\\b\" ),\n\t\t\t\tnotSupported = type && !re.test( supportedTypes.join() ),\n\t\t\t\tdecimalPlaces = function( num ) {\n\t\t\t\t\tvar match = ( \"\" + num ).match( /(?:\\.(\\d+))?$/ );\n\t\t\t\t\tif ( !match ) {\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Number of digits right of decimal point.\n\t\t\t\t\treturn match[ 1 ] ? match[ 1 ].length : 0;\n\t\t\t\t},\n\t\t\t\ttoInt = function( num ) {\n\t\t\t\t\treturn Math.round( num * Math.pow( 10, decimals ) );\n\t\t\t\t},\n\t\t\t\tvalid = true,\n\t\t\t\tdecimals;\n\n\t\t\t// Works only for text, number and range input types\n\t\t\t// TODO find a way to support input types date, datetime, datetime-local, month, time and week\n\t\t\tif ( notSupported ) {\n\t\t\t\tthrow new Error( errorMessage );\n\t\t\t}\n\n\t\t\tdecimals = decimalPlaces( param );\n\n\t\t\t// Value can't have too many decimals\n\t\t\tif ( decimalPlaces( value ) > decimals || toInt( value ) % toInt( param ) !== 0 ) {\n\t\t\t\tvalid = false;\n\t\t\t}\n\n\t\t\treturn this.optional( element ) || valid;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/equalTo-method/\n\t\tequalTo: function( value, element, param ) {\n\n\t\t\t// Bind to the blur event of the target in order to revalidate whenever the target field is updated\n\t\t\tvar target = $( param );\n\t\t\tif ( this.settings.onfocusout && target.not( \".validate-equalTo-blur\" ).length ) {\n\t\t\t\ttarget.addClass( \"validate-equalTo-blur\" ).on( \"blur.validate-equalTo\", function() {\n\t\t\t\t\t$( element ).valid();\n\t\t\t\t} );\n\t\t\t}\n\t\t\treturn value === target.val();\n\t\t},\n\n\t\t// https://jqueryvalidation.org/remote-method/\n\t\tremote: function( value, element, param, method ) {\n\t\t\tif ( this.optional( element ) ) {\n\t\t\t\treturn \"dependency-mismatch\";\n\t\t\t}\n\n\t\t\tmethod = typeof method === \"string\" && method || \"remote\";\n\n\t\t\tvar previous = this.previousValue( element, method ),\n\t\t\t\tvalidator, data, optionDataString;\n\n\t\t\tif ( !this.settings.messages[ element.name ] ) {\n\t\t\t\tthis.settings.messages[ element.name ] = {};\n\t\t\t}\n\t\t\tprevious.originalMessage = previous.originalMessage || this.settings.messages[ element.name ][ method ];\n\t\t\tthis.settings.messages[ element.name ][ method ] = previous.message;\n\n\t\t\tparam = typeof param === \"string\" && { url: param } || param;\n\t\t\toptionDataString = $.param( $.extend( { data: value }, param.data ) );\n\t\t\tif ( previous.old === optionDataString ) {\n\t\t\t\treturn previous.valid;\n\t\t\t}\n\n\t\t\tprevious.old = optionDataString;\n\t\t\tvalidator = this;\n\t\t\tthis.startRequest( element );\n\t\t\tdata = {};\n\t\t\tdata[ element.name ] = value;\n\t\t\t$.ajax( $.extend( true, {\n\t\t\t\tmode: \"abort\",\n\t\t\t\tport: \"validate\" + element.name,\n\t\t\t\tdataType: \"json\",\n\t\t\t\tdata: data,\n\t\t\t\tcontext: validator.currentForm,\n\t\t\t\tsuccess: function( response ) {\n\t\t\t\t\tvar valid = response === true || response === \"true\",\n\t\t\t\t\t\terrors, message, submitted;\n\n\t\t\t\t\tvalidator.settings.messages[ element.name ][ method ] = previous.originalMessage;\n\t\t\t\t\tif ( valid ) {\n\t\t\t\t\t\tsubmitted = validator.formSubmitted;\n\t\t\t\t\t\tvalidator.resetInternals();\n\t\t\t\t\t\tvalidator.toHide = validator.errorsFor( element );\n\t\t\t\t\t\tvalidator.formSubmitted = submitted;\n\t\t\t\t\t\tvalidator.successList.push( element );\n\t\t\t\t\t\tvalidator.invalid[ element.name ] = false;\n\t\t\t\t\t\tvalidator.showErrors();\n\t\t\t\t\t} else {\n\t\t\t\t\t\terrors = {};\n\t\t\t\t\t\tmessage = response || validator.defaultMessage( element, { method: method, parameters: value } );\n\t\t\t\t\t\terrors[ element.name ] = previous.message = message;\n\t\t\t\t\t\tvalidator.invalid[ element.name ] = true;\n\t\t\t\t\t\tvalidator.showErrors( errors );\n\t\t\t\t\t}\n\t\t\t\t\tprevious.valid = valid;\n\t\t\t\t\tvalidator.stopRequest( element, valid );\n\t\t\t\t}\n\t\t\t}, param ) );\n\t\t\treturn \"pending\";\n\t\t}\n\t}\n\n} );\n\r\n// Ajax mode: abort\n// usage: $.ajax({ mode: \"abort\"[, port: \"uniqueport\"]});\n// if mode:\"abort\" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort()\n\nvar pendingRequests = {},\n\tajax;\n\n// Use a prefilter if available (1.5+)\nif ( $.ajaxPrefilter ) {\n\t$.ajaxPrefilter( function( settings, _, xhr ) {\n\t\tvar port = settings.port;\n\t\tif ( settings.mode === \"abort\" ) {\n\t\t\tif ( pendingRequests[ port ] ) {\n\t\t\t\tpendingRequests[ port ].abort();\n\t\t\t}\n\t\t\tpendingRequests[ port ] = xhr;\n\t\t}\n\t} );\n} else {\n\n\t// Proxy ajax\n\tajax = $.ajax;\n\t$.ajax = function( settings ) {\n\t\tvar mode = ( \"mode\" in settings ? settings : $.ajaxSettings ).mode,\n\t\t\tport = ( \"port\" in settings ? settings : $.ajaxSettings ).port;\n\t\tif ( mode === \"abort\" ) {\n\t\t\tif ( pendingRequests[ port ] ) {\n\t\t\t\tpendingRequests[ port ].abort();\n\t\t\t}\n\t\t\tpendingRequests[ port ] = ajax.apply( this, arguments );\n\t\t\treturn pendingRequests[ port ];\n\t\t}\n\t\treturn ajax.apply( this, arguments );\n\t};\n}\nreturn $;\r\n}));\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/jquery-validation/dist/jquery.validate.js\n// module id = ./node_modules/jquery-validation/dist/jquery.validate.js\n// module chunks = 3","import {runWPcoreDownload} from \"./run.wp.core.download.js\";\n/*** runWPcoreDownload(wpName) ***/\n\nimport {runWPlock} from \"./run.wp.lock.js\";\n/*** runWPlock(wpName, lock) ***/\n/*** \n\twpName is the folder name in the root dir\n\tlock=status returns if the wp install locked or not\n\tlocked status = true means there is no ozwpdev.txt in root dir\n\tlocked status = false means there is ozwpdev.txt in root dir and can be modified\n\tto set or unlik ozwpdev.txt assign lock = lock / unlock (unlock means free modify)\n***/\n\nimport {runWPconfigCreate} from \"./run.wp.config.create.js\"\n/*** runWPconfigCreate(wpName) ***/\n/*** DB_HOST, DB_USER, DB_PASS parameters taken from .env file ***/\n\nimport {runWPcoreInstall} from \"./run.wp.core.install.js\";\n/*** runWPcoreInstall(wpName, usr, email, pass) ***/\n\nimport {runDBcreate} from \"./run.db.create.js\";\n/*** runDBcreate(DBname) ***/\n\n\n\nimport \"jquery-validation\";\n\n\t$(\"#frm_validate\").submit(function(e){\n\t return false;\n\t});\n\t$(\"#frm_user\").submit(function(e){\n\t return false;\n\t});\n\n\t$(\"#frm_user\").validate();\n\n\t$(\"#btn_validate\").hide();\n\t$(\"#frm_validate\").validate({\n\t\tsuccess:function(){\n\t\t\t$(\"#btn_validate\").show();\n\t\t\t//$(\"#btn_validate\").click();\n\t\t}\n\t});\n\n\n$(\"#btn_validate\").on(\"click\", function(e){\n\tvar wpName=$(\"#input_validate\").val();\n\tvar usr=$(\"#user\").val();\n\tvar email=$(\"#email\").val();\n\tvar pass=$(\"#pass\").val();\n\n\n\t$.ajax({\n\t\turl:\"../inc/newwp.validate.php\",\n\t\ttype:\"post\",\n\t\tasync:false,\n\t\tdata:{\n\t\t\tdo:\"run\",\n\t\t\trun:\"validate\",\n\t\t\twpName:wpName\n\t\t}\n\t}).done(function(datas){\n\t\tvar data = $.parseJSON(datas);\n\t\tif(data){\n\t\t\t//valid name!\n\t\t\tcreateWP(wpName,usr,email,pass);\n\t\t\t\n\t\t} else {\n\t\t\tswal(\"invalid\", \"WP Name / DB Name already exists, \\n please try another name\",\"warning\");\n\t\t}\n\n\t}). fail(function(){\n\t\tswal(\"oops\",\"failed to validate!\",\"warning\");\n\t});\n});\n\n\nfunction createWP(wpName,usr,email,pass){\n\n\tswal(\n\t\t{\n\t\ttitle: \"Create new WP\",\n\t\ttext: \t\"WP & DB name: \" + wpName + \" \\n \" \n\t\t\t+ \"User: \" + usr + \" \\n\" \n\t\t\t+ \"e-Mail: \" + email + \" \\n\"\n\t\t\t+ \"Pass: \" + pass ,\n\t\ticon: \"warning\",\n\t\tcloseOnClickOutside: false,\n\t\tdangerMode: true,\n\t\t\tbuttons: {\n\t\t\t\t\tcancel: true,\n\t\t\t\t\tconfirm: {\n\t\t\t\t\t text: \"OK, create WP\",\n\t\t\t\t\t value: true,\n\t\t\t\t\t visible: true,\n\t\t\t\t\t className: \"bg-danger\",\n\t\t\t\t\t closeModal: false\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t}\n\t)\n\t. then( (value) => { if(value){ return runWPcoreDownload(wpName); }})\n\n\t.then((value) =>{ if(value){ return runWPlock(wpName,\"unlock\");} else {swal(\"oops\",\"something went wrong!\",\"warning\");}})\n\n\t.then((value) =>{ if(value){ return runWPconfigCreate(wpName);} else {swal(\"oops\",\"something went wrong!\",\"warning\");}})\n\t.then((value) =>{ if(value){ return runDBcreate(wpName);} else {swal(\"oops\",\"something went wrong!\",\"warning\");}})\n\n\t.then((value) =>{ if(value){ return runWPcoreInstall(wpName,usr,email,pass);} else {swal(\"oops\",\"something went wrong!\",\"warning\");}})\n\n\t.then((value) =>{\n\t\t\tif(value){\n\t\t\t\tswal(\"DONE\", wpName + \" is ready!\", \"success\").then((value)=>{\n\t\t\t\t\twindow.location=\"./editwp.php?wp=\"+wpName;\n\t\t\t\t});\n\n\t\t\t} else {swal(\"oops\",\"something went wrong!\",\"warning\");}\n\t\t});\n\n\t\n\n} // end create WP\n\n\n\n\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/newwp.js\n// module id = ./src/newwp.js\n// module chunks = 3","export function runDBcreate(dbNAME){\n\n\tvar status=false;\n\n\t$.ajax({\n\t\turl: \"../inc/run.db.create.php\",\n\t\ttype: \"post\",\n\t\tasync:false,\n\t\tdata: {do:\"run\", run:\"DBcreate\", dbNAME:dbNAME}\n\t}).done(function(data){\n\t\tif(data!==\"false\"){\n\t\t\tstatus=true;\n\t\t} else {\n\t\t\tstatus=false;\n\t\t}\n\t\t\n\t}).fail(function(){\n\t\t\tswal(\"oops\",\"bad data from rub.db.create.php\", \"warning\");\n\t});\n\n\treturn status;\n\n\n\t/*********************** returns true if database created ***********************/\n\n\n\n}//end function\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/run.db.create.js\n// module id = ./src/run.db.create.js\n// module chunks = 3","export function runWPconfigCreate(wpName){\n\n\tvar status=false;\n\n\t$.ajax({\n\t\turl: \"../inc/run.wp.config.create.php\",\n\t\ttype: \"post\",\n\t\tdataType: 'json',\n\t\tasync:false,\n\t\tdata: {do:\"run\", run:\"WPconfigCreate\", wpName:wpName}\n\n\t}).done(function(data){\n\n\t\tstatus=true;\n\n\t\t\n\t}).fail(function(){\n\t\t\tswal(\"oops\",\"bad data from run.wp.config.get.php\", \"warning\");\n\t});\n\n\treturn status;\n\n\n\n\n}//end function\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/run.wp.config.create.js\n// module id = ./src/run.wp.config.create.js\n// module chunks = 3","export function runWPcoreDownload(wpName){\n\n\tvar status=false;\n\n\t$.ajax({\n\t\turl: \"../inc/run.wp.core.download.php\",\n\t\ttype: \"post\",\n\t\tdataType: 'json',\n\t\tasync:false,\n\t\tdata: {do:\"run\", run:\"WPcoreDownload\", wpName:wpName}\n\n\t}).done(function(data){\n\n\t\tstatus=true;\n\t\t\n\t}).fail(function(){\n\t\t\tswal(\"oops\",\"bad data from run.wp.core.download.php\", \"warning\");\n\t});\n\n\treturn status;\n\n\n\n}//end function\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/run.wp.core.download.js\n// module id = ./src/run.wp.core.download.js\n// module chunks = 3","export function runWPcoreInstall(wpName, usr, email, pass){\n\n\tvar status=false;\n\n\t$.ajax({\n\t\turl: \"../inc/run.wp.core.install.php\",\n\t\ttype: \"post\",\n\t\tdataType: 'json',\n\t\tasync:false,\n\t\tdata: {do:\"run\", run:\"WPcoreInstall\", wpName:wpName, usr:usr, email:email, pass:pass}\n\n\t}).done(function(data){\n\n\t\tstatus=true;\n\t\t\n\t}).fail(function(){\n\t\t\tswal(\"oops\",\"bad data from run.wp.core.download.php\", \"warning\");\n\t});\n\n\treturn status;\n\n\n\n}//end function\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/run.wp.core.install.js\n// module id = ./src/run.wp.core.install.js\n// module chunks = 3","export function runWPlock(wpName, lock){\n\n\t/*** \n\twpName is the folder name in the root dir\n\tlock=status returns if the wp install locked or not\n\tlocked status = true means there is no ozwpdev.txt in root dir\n\tlocked status = false means there is ozwpdev.txt in root dir and can be modified\n\tto set or unlik ozwpdev.txt assign lock = lock / unlock (unlock means free modify)\n \t***/\n\n\tvar status=false;\n\n\t$.ajax({\n\t\turl: \"../inc/run.wp.lock.php\",\n\t\ttype: \"post\",\n\t\tasync:false,\n\t\tdata: {\n\t\t\tdo:\"run\", \n\t\t\trun:\"WPlock\", \n\t\t\twpName:wpName,\n\t\t\tlock:lock\n\t\t}\n\n\t}).done(function(data){\n\n\t\tstatus=$.parseJSON(data);\n\t\t\n\t}).fail(function(){\n\t\t\tswal(\"oops\",\"bad data from run.wp.lock.php\", \"warning\");\n\t});\n\n\treturn status;\n\n\n\n}//end function\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/run.wp.lock.js\n// module id = ./src/run.wp.lock.js\n// module chunks = 1 3"],"sourceRoot":""}
\ No newline at end of file
diff --git a/dist/system.bundle.js b/dist/system.bundle.js
new file mode 100644
index 0000000..556c331
--- /dev/null
+++ b/dist/system.bundle.js
@@ -0,0 +1,101 @@
+webpackJsonp([5],{
+
+/***/ "./src/run.bash.js":
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* WEBPACK VAR INJECTION */(function($) {/* harmony export (immutable) */ __webpack_exports__["a"] = runBash;
+function runBash(cmd){
+ var status=false;
+ var dfd = new $.Deferred();
+
+ $.ajax({
+ url: "../inc/run.bash.php",
+ type: "post",
+ dataType: "json",
+ async:false,
+ data: {do:"run", run:"bash", cmd:cmd}
+ }).done(function(data){
+ dfd.resolve(data.exit_status,data.output);
+ }).fail(function(jqXHR,textStatus,errorThrown){
+ dfd.resolve(false,"ajax failed!\n"+errorThrown);
+ });
+
+ return dfd.promise();
+}
+/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__("./node_modules/jquery/dist/jquery.js-exposed")))
+
+/***/ }),
+
+/***/ "./src/system.js":
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__run_bash_js__ = __webpack_require__("./src/run.bash.js");
+
+
+$(window).on("load", function() {
+
+ $("#inc_wp_info_php").parent().find(".card-body-icon").toggleClass("fa-spin");
+ $("#inc_wp_find_php").parent().find(".card-body-icon").toggleClass("fa-spin");
+ $("#inc_mysql_info_php").parent().find(".card-body-icon").toggleClass("fa-spin");
+ $("#inc_mysql_listdb_php").parent().find(".card-body-icon").toggleClass("fa-spin");
+
+});
+
+$(document).ready(function(){
+
+ /*********************** WP CLI INFO ***********************/
+ $("#inc_wp_info_php").load("../inc/system.wp-info.php", function( response, status, xhr){
+
+ $("#inc_wp_info_php").parent().find(".card-body-icon").toggleClass("fa-spin");
+
+ /*********************** strong-txt-before-semicolon ***********************/
+ $("body").find(".strong-txt-before-semicolon").each(function(){
+ var html = $(this).html();
+ $(this).html(html.replace(/^(.+?\:)/gim, '
$1'));
+ });
+
+ });
+
+ /*********************** WP FIND ***********************/
+ $("#inc_wp_find_php").load("../inc/system.wp-find.php", function( response, status, xhr){
+
+ $("#inc_wp_find_php").parent().find(".card-body-icon").toggleClass("fa-spin");
+
+ });
+
+ /*********************** PhpMyAdmin info ***********************/
+ $("#inc_mysql_info_php").load("../inc/system.mysql-info.php", function(response, status, xhr){
+
+ $("#inc_mysql_info_php").parent().find(".card-body-icon").toggleClass("fa-spin");
+
+ });
+
+ /*********************** PhpMyAdmin List DBs ***********************/
+ $("#inc_mysql_listdb_php").load("../inc/system.mysql-listdb.php", function(response, status, xhr){
+
+ $("#inc_mysql_listdb_php").parent().find(".card-body-icon").toggleClass("fa-spin");
+
+ });
+
+
+});//end of Document Ready Function
+
+
+
+/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__("./node_modules/jquery/dist/jquery.js-exposed")))
+
+/***/ }),
+
+/***/ 1:
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = __webpack_require__("./src/system.js");
+
+
+/***/ })
+
+},[1]);
+//# sourceMappingURL=system.bundle.js.map
\ No newline at end of file
diff --git a/dist/system.bundle.js.map b/dist/system.bundle.js.map
new file mode 100644
index 0000000..cd87c7a
--- /dev/null
+++ b/dist/system.bundle.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack:///./src/run.bash.js","webpack:///./src/system.js"],"names":[],"mappings":";;;;;;;AAAA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,EAAE;AACF;AACA,EAAE;AACF;AACA,EAAE;;AAEF;AACA,C;;;;;;;;;;;ACjBgB;;AAEhB;;AAEA;AACA;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH,EAAE;;AAEF;AACA;;AAEA;;AAEA,EAAE,E;;AAEF;AACA;;AAEA;;AAEA,EAAE;;AAEF;AACA;;AAEA;;AAEA,EAAE;;;AAGF,CAAC,EAAE","file":"system.bundle.js","sourcesContent":["export function runBash(cmd){\n\tvar status=false;\n\tvar dfd = new $.Deferred();\n\n\t$.ajax({\n\t\turl: \"../inc/run.bash.php\",\n\t\ttype: \"post\",\n\t\tdataType: \"json\",\n\t\tasync:false,\n\t\tdata: {do:\"run\", run:\"bash\", cmd:cmd}\n\t}).done(function(data){\n\t\tdfd.resolve(data.exit_status,data.output);\n\t}).fail(function(jqXHR,textStatus,errorThrown){\n\t\t\tdfd.resolve(false,\"ajax failed!\\n\"+errorThrown);\n\t});\n\n\treturn dfd.promise();\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/run.bash.js\n// module id = ./src/run.bash.js\n// module chunks = 1 4 5","import {runBash} from \"./run.bash.js\";\n\n$(window).on(\"load\", function() {\n\n\t$(\"#inc_wp_info_php\").parent().find(\".card-body-icon\").toggleClass(\"fa-spin\");\n\t$(\"#inc_wp_find_php\").parent().find(\".card-body-icon\").toggleClass(\"fa-spin\");\n\t$(\"#inc_mysql_info_php\").parent().find(\".card-body-icon\").toggleClass(\"fa-spin\");\n\t$(\"#inc_mysql_listdb_php\").parent().find(\".card-body-icon\").toggleClass(\"fa-spin\");\n \n});\n\n$(document).ready(function(){\n\n\t/*********************** WP CLI INFO ***********************/\n\t$(\"#inc_wp_info_php\").load(\"../inc/system.wp-info.php\", function( response, status, xhr){\n\t\t\n\t\t$(\"#inc_wp_info_php\").parent().find(\".card-body-icon\").toggleClass(\"fa-spin\");\n\n\t\t/*********************** strong-txt-before-semicolon ***********************/\n\t\t$(\"body\").find(\".strong-txt-before-semicolon\").each(function(){\n\t\tvar html = $(this).html();\n\t\t$(this).html(html.replace(/^(.+?\\:)/gim, '
$1'));\n\t\t});\n\t\t\n\t});\n\n\t/*********************** WP FIND ***********************/\n\t$(\"#inc_wp_find_php\").load(\"../inc/system.wp-find.php\", function( response, status, xhr){\n\t\t\n\t\t$(\"#inc_wp_find_php\").parent().find(\".card-body-icon\").toggleClass(\"fa-spin\");\n\t\t\n\t});\t\n\n\t/*********************** PhpMyAdmin info ***********************/\n\t$(\"#inc_mysql_info_php\").load(\"../inc/system.mysql-info.php\", function(response, status, xhr){\n\n\t\t$(\"#inc_mysql_info_php\").parent().find(\".card-body-icon\").toggleClass(\"fa-spin\");\n\n\t});\n\t\n\t/*********************** PhpMyAdmin List DBs ***********************/\n\t$(\"#inc_mysql_listdb_php\").load(\"../inc/system.mysql-listdb.php\", function(response, status, xhr){\n\n\t\t$(\"#inc_mysql_listdb_php\").parent().find(\".card-body-icon\").toggleClass(\"fa-spin\");\n\n\t});\n\n\n});//end of Document Ready Function\n\n\t\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/system.js\n// module id = ./src/system.js\n// module chunks = 5"],"sourceRoot":""}
\ No newline at end of file
diff --git a/dist/theme.bundle.css b/dist/theme.bundle.css
new file mode 100644
index 0000000..facba9d
--- /dev/null
+++ b/dist/theme.bundle.css
@@ -0,0 +1,9709 @@
+/*!
+ * Bootstrap v4.0.0 (https://getbootstrap.com)
+ * Copyright 2011-2018 The Bootstrap Authors
+ * Copyright 2011-2018 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+:root {
+ --blue: #007bff;
+ --indigo: #6610f2;
+ --purple: #6f42c1;
+ --pink: #e83e8c;
+ --red: #dc3545;
+ --orange: #fd7e14;
+ --yellow: #ffc107;
+ --green: #28a745;
+ --teal: #20c997;
+ --cyan: #17a2b8;
+ --white: #fff;
+ --gray: #6c757d;
+ --gray-dark: #343a40;
+ --primary: #007bff;
+ --secondary: #6c757d;
+ --success: #28a745;
+ --info: #17a2b8;
+ --warning: #ffc107;
+ --danger: #dc3545;
+ --light: #f8f9fa;
+ --dark: #343a40;
+ --breakpoint-xs: 0;
+ --breakpoint-sm: 576px;
+ --breakpoint-md: 768px;
+ --breakpoint-lg: 992px;
+ --breakpoint-xl: 1200px;
+ --font-family-sans-serif: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";
+ --font-family-monospace: SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace; }
+
+*, ::after, ::before {
+ box-sizing: border-box; }
+
+html {
+ font-family: sans-serif;
+ line-height: 1.15;
+ -webkit-text-size-adjust: 100%;
+ -ms-text-size-adjust: 100%;
+ -ms-overflow-style: scrollbar;
+ -webkit-tap-highlight-color: transparent; }
+
+@-ms-viewport {
+ width: device-width; }
+
+article, aside, dialog, figcaption, figure, footer, header, hgroup, main, nav, section {
+ display: block; }
+
+body {
+ margin: 0;
+ font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";
+ font-size: 1rem;
+ font-weight: 400;
+ line-height: 1.5;
+ color: #212529;
+ text-align: left;
+ background-color: #fff; }
+
+[tabindex="-1"]:focus {
+ outline: 0 !important; }
+
+hr {
+ box-sizing: content-box;
+ height: 0;
+ overflow: visible; }
+
+h1, h2, h3, h4, h5, h6 {
+ margin-top: 0;
+ margin-bottom: .5rem; }
+
+p {
+ margin-top: 0;
+ margin-bottom: 1rem; }
+
+abbr[data-original-title], abbr[title] {
+ text-decoration: underline;
+ -webkit-text-decoration: underline dotted;
+ text-decoration: underline dotted;
+ cursor: help;
+ border-bottom: 0; }
+
+address {
+ margin-bottom: 1rem;
+ font-style: normal;
+ line-height: inherit; }
+
+dl, ol, ul {
+ margin-top: 0;
+ margin-bottom: 1rem; }
+
+ol ol, ol ul, ul ol, ul ul {
+ margin-bottom: 0; }
+
+dt {
+ font-weight: 700; }
+
+dd {
+ margin-bottom: .5rem;
+ margin-left: 0; }
+
+blockquote {
+ margin: 0 0 1rem; }
+
+dfn {
+ font-style: italic; }
+
+b, strong {
+ font-weight: bolder; }
+
+small {
+ font-size: 80%; }
+
+sub, sup {
+ position: relative;
+ font-size: 75%;
+ line-height: 0;
+ vertical-align: baseline; }
+
+sub {
+ bottom: -.25em; }
+
+sup {
+ top: -.5em; }
+
+a {
+ color: #007bff;
+ text-decoration: none;
+ background-color: transparent;
+ -webkit-text-decoration-skip: objects; }
+
+a:hover {
+ color: #0056b3;
+ text-decoration: underline; }
+
+a:not([href]):not([tabindex]) {
+ color: inherit;
+ text-decoration: none; }
+
+a:not([href]):not([tabindex]):focus, a:not([href]):not([tabindex]):hover {
+ color: inherit;
+ text-decoration: none; }
+
+a:not([href]):not([tabindex]):focus {
+ outline: 0; }
+
+code, kbd, pre, samp {
+ font-family: monospace,monospace;
+ font-size: 1em; }
+
+pre {
+ margin-top: 0;
+ margin-bottom: 1rem;
+ overflow: auto;
+ -ms-overflow-style: scrollbar; }
+
+figure {
+ margin: 0 0 1rem; }
+
+img {
+ vertical-align: middle;
+ border-style: none; }
+
+svg:not(:root) {
+ overflow: hidden; }
+
+table {
+ border-collapse: collapse; }
+
+caption {
+ padding-top: .75rem;
+ padding-bottom: .75rem;
+ color: #6c757d;
+ text-align: left;
+ caption-side: bottom; }
+
+th {
+ text-align: inherit; }
+
+label {
+ display: inline-block;
+ margin-bottom: .5rem; }
+
+button {
+ border-radius: 0; }
+
+button:focus {
+ outline: 1px dotted;
+ outline: 5px auto -webkit-focus-ring-color; }
+
+button, input, optgroup, select, textarea {
+ margin: 0;
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit; }
+
+button, input {
+ overflow: visible; }
+
+button, select {
+ text-transform: none; }
+
+[type=reset], [type=submit], button, html [type=button] {
+ -webkit-appearance: button; }
+
+[type=button]::-moz-focus-inner, [type=reset]::-moz-focus-inner, [type=submit]::-moz-focus-inner, button::-moz-focus-inner {
+ padding: 0;
+ border-style: none; }
+
+input[type=checkbox], input[type=radio] {
+ box-sizing: border-box;
+ padding: 0; }
+
+input[type=date], input[type=datetime-local], input[type=month], input[type=time] {
+ -webkit-appearance: listbox; }
+
+textarea {
+ overflow: auto;
+ resize: vertical; }
+
+fieldset {
+ min-width: 0;
+ padding: 0;
+ margin: 0;
+ border: 0; }
+
+legend {
+ display: block;
+ width: 100%;
+ max-width: 100%;
+ padding: 0;
+ margin-bottom: .5rem;
+ font-size: 1.5rem;
+ line-height: inherit;
+ color: inherit;
+ white-space: normal; }
+
+progress {
+ vertical-align: baseline; }
+
+[type=number]::-webkit-inner-spin-button, [type=number]::-webkit-outer-spin-button {
+ height: auto; }
+
+[type=search] {
+ outline-offset: -2px;
+ -webkit-appearance: none; }
+
+[type=search]::-webkit-search-cancel-button, [type=search]::-webkit-search-decoration {
+ -webkit-appearance: none; }
+
+::-webkit-file-upload-button {
+ font: inherit;
+ -webkit-appearance: button; }
+
+output {
+ display: inline-block; }
+
+summary {
+ display: list-item;
+ cursor: pointer; }
+
+template {
+ display: none; }
+
+[hidden] {
+ display: none !important; }
+
+.h1, .h2, .h3, .h4, .h5, .h6, h1, h2, h3, h4, h5, h6 {
+ margin-bottom: .5rem;
+ font-family: inherit;
+ font-weight: 500;
+ line-height: 1.2;
+ color: inherit; }
+
+.h1, h1 {
+ font-size: 2.5rem; }
+
+.h2, h2 {
+ font-size: 2rem; }
+
+.h3, h3 {
+ font-size: 1.75rem; }
+
+.h4, h4 {
+ font-size: 1.5rem; }
+
+.h5, h5 {
+ font-size: 1.25rem; }
+
+.h6, h6 {
+ font-size: 1rem; }
+
+.lead {
+ font-size: 1.25rem;
+ font-weight: 300; }
+
+.display-1 {
+ font-size: 6rem;
+ font-weight: 300;
+ line-height: 1.2; }
+
+.display-2 {
+ font-size: 5.5rem;
+ font-weight: 300;
+ line-height: 1.2; }
+
+.display-3 {
+ font-size: 4.5rem;
+ font-weight: 300;
+ line-height: 1.2; }
+
+.display-4 {
+ font-size: 3.5rem;
+ font-weight: 300;
+ line-height: 1.2; }
+
+hr {
+ margin-top: 1rem;
+ margin-bottom: 1rem;
+ border: 0;
+ border-top: 1px solid rgba(0, 0, 0, 0.1); }
+
+.small, small {
+ font-size: 80%;
+ font-weight: 400; }
+
+.mark, mark {
+ padding: .2em;
+ background-color: #fcf8e3; }
+
+.list-unstyled {
+ padding-left: 0;
+ list-style: none; }
+
+.list-inline {
+ padding-left: 0;
+ list-style: none; }
+
+.list-inline-item {
+ display: inline-block; }
+
+.list-inline-item:not(:last-child) {
+ margin-right: .5rem; }
+
+.initialism {
+ font-size: 90%;
+ text-transform: uppercase; }
+
+.blockquote {
+ margin-bottom: 1rem;
+ font-size: 1.25rem; }
+
+.blockquote-footer {
+ display: block;
+ font-size: 80%;
+ color: #6c757d; }
+
+.blockquote-footer::before {
+ content: "\2014 \A0"; }
+
+.img-fluid {
+ max-width: 100%;
+ height: auto; }
+
+.img-thumbnail {
+ padding: .25rem;
+ background-color: #fff;
+ border: 1px solid #dee2e6;
+ border-radius: .25rem;
+ max-width: 100%;
+ height: auto; }
+
+.figure {
+ display: inline-block; }
+
+.figure-img {
+ margin-bottom: .5rem;
+ line-height: 1; }
+
+.figure-caption {
+ font-size: 90%;
+ color: #6c757d; }
+
+code, kbd, pre, samp {
+ font-family: SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace; }
+
+code {
+ font-size: 87.5%;
+ color: #e83e8c;
+ word-break: break-word; }
+
+a > code {
+ color: inherit; }
+
+kbd {
+ padding: .2rem .4rem;
+ font-size: 87.5%;
+ color: #fff;
+ background-color: #212529;
+ border-radius: .2rem; }
+
+kbd kbd {
+ padding: 0;
+ font-size: 100%;
+ font-weight: 700; }
+
+pre {
+ display: block;
+ font-size: 87.5%;
+ color: #212529; }
+
+pre code {
+ font-size: inherit;
+ color: inherit;
+ word-break: normal; }
+
+.pre-scrollable {
+ max-height: 340px;
+ overflow-y: scroll; }
+
+.container {
+ width: 100%;
+ padding-right: 15px;
+ padding-left: 15px;
+ margin-right: auto;
+ margin-left: auto; }
+
+@media (min-width: 576px) {
+ .container {
+ max-width: 540px; } }
+
+@media (min-width: 768px) {
+ .container {
+ max-width: 720px; } }
+
+@media (min-width: 992px) {
+ .container {
+ max-width: 960px; } }
+
+@media (min-width: 1200px) {
+ .container {
+ max-width: 1140px; } }
+
+.container-fluid {
+ width: 100%;
+ padding-right: 15px;
+ padding-left: 15px;
+ margin-right: auto;
+ margin-left: auto; }
+
+.row {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ margin-right: -15px;
+ margin-left: -15px; }
+
+.no-gutters {
+ margin-right: 0;
+ margin-left: 0; }
+
+.no-gutters > .col, .no-gutters > [class*=col-] {
+ padding-right: 0;
+ padding-left: 0; }
+
+.col, .col-1, .col-10, .col-11, .col-12, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-auto, .col-lg, .col-lg-1, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-auto, .col-md, .col-md-1, .col-md-10, .col-md-11, .col-md-12, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-auto, .col-sm, .col-sm-1, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-auto, .col-xl, .col-xl-1, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-auto {
+ position: relative;
+ width: 100%;
+ min-height: 1px;
+ padding-right: 15px;
+ padding-left: 15px; }
+
+.col {
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -webkit-box-flex: 1;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ max-width: 100%; }
+
+.col-auto {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ width: auto;
+ max-width: none; }
+
+.col-1 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 8.333333%;
+ flex: 0 0 8.333333%;
+ max-width: 8.333333%; }
+
+.col-2 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 16.666667%;
+ flex: 0 0 16.666667%;
+ max-width: 16.666667%; }
+
+.col-3 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 25%;
+ flex: 0 0 25%;
+ max-width: 25%; }
+
+.col-4 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 33.333333%;
+ flex: 0 0 33.333333%;
+ max-width: 33.333333%; }
+
+.col-5 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 41.666667%;
+ flex: 0 0 41.666667%;
+ max-width: 41.666667%; }
+
+.col-6 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 50%;
+ flex: 0 0 50%;
+ max-width: 50%; }
+
+.col-7 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 58.333333%;
+ flex: 0 0 58.333333%;
+ max-width: 58.333333%; }
+
+.col-8 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 66.666667%;
+ flex: 0 0 66.666667%;
+ max-width: 66.666667%; }
+
+.col-9 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 75%;
+ flex: 0 0 75%;
+ max-width: 75%; }
+
+.col-10 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 83.333333%;
+ flex: 0 0 83.333333%;
+ max-width: 83.333333%; }
+
+.col-11 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 91.666667%;
+ flex: 0 0 91.666667%;
+ max-width: 91.666667%; }
+
+.col-12 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 100%;
+ flex: 0 0 100%;
+ max-width: 100%; }
+
+.order-first {
+ -webkit-box-ordinal-group: 0;
+ -ms-flex-order: -1;
+ order: -1; }
+
+.order-last {
+ -webkit-box-ordinal-group: 14;
+ -ms-flex-order: 13;
+ order: 13; }
+
+.order-0 {
+ -webkit-box-ordinal-group: 1;
+ -ms-flex-order: 0;
+ order: 0; }
+
+.order-1 {
+ -webkit-box-ordinal-group: 2;
+ -ms-flex-order: 1;
+ order: 1; }
+
+.order-2 {
+ -webkit-box-ordinal-group: 3;
+ -ms-flex-order: 2;
+ order: 2; }
+
+.order-3 {
+ -webkit-box-ordinal-group: 4;
+ -ms-flex-order: 3;
+ order: 3; }
+
+.order-4 {
+ -webkit-box-ordinal-group: 5;
+ -ms-flex-order: 4;
+ order: 4; }
+
+.order-5 {
+ -webkit-box-ordinal-group: 6;
+ -ms-flex-order: 5;
+ order: 5; }
+
+.order-6 {
+ -webkit-box-ordinal-group: 7;
+ -ms-flex-order: 6;
+ order: 6; }
+
+.order-7 {
+ -webkit-box-ordinal-group: 8;
+ -ms-flex-order: 7;
+ order: 7; }
+
+.order-8 {
+ -webkit-box-ordinal-group: 9;
+ -ms-flex-order: 8;
+ order: 8; }
+
+.order-9 {
+ -webkit-box-ordinal-group: 10;
+ -ms-flex-order: 9;
+ order: 9; }
+
+.order-10 {
+ -webkit-box-ordinal-group: 11;
+ -ms-flex-order: 10;
+ order: 10; }
+
+.order-11 {
+ -webkit-box-ordinal-group: 12;
+ -ms-flex-order: 11;
+ order: 11; }
+
+.order-12 {
+ -webkit-box-ordinal-group: 13;
+ -ms-flex-order: 12;
+ order: 12; }
+
+.offset-1 {
+ margin-left: 8.333333%; }
+
+.offset-2 {
+ margin-left: 16.666667%; }
+
+.offset-3 {
+ margin-left: 25%; }
+
+.offset-4 {
+ margin-left: 33.333333%; }
+
+.offset-5 {
+ margin-left: 41.666667%; }
+
+.offset-6 {
+ margin-left: 50%; }
+
+.offset-7 {
+ margin-left: 58.333333%; }
+
+.offset-8 {
+ margin-left: 66.666667%; }
+
+.offset-9 {
+ margin-left: 75%; }
+
+.offset-10 {
+ margin-left: 83.333333%; }
+
+.offset-11 {
+ margin-left: 91.666667%; }
+
+@media (min-width: 576px) {
+ .col-sm {
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -webkit-box-flex: 1;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ max-width: 100%; }
+ .col-sm-auto {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ width: auto;
+ max-width: none; }
+ .col-sm-1 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 8.333333%;
+ flex: 0 0 8.333333%;
+ max-width: 8.333333%; }
+ .col-sm-2 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 16.666667%;
+ flex: 0 0 16.666667%;
+ max-width: 16.666667%; }
+ .col-sm-3 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 25%;
+ flex: 0 0 25%;
+ max-width: 25%; }
+ .col-sm-4 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 33.333333%;
+ flex: 0 0 33.333333%;
+ max-width: 33.333333%; }
+ .col-sm-5 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 41.666667%;
+ flex: 0 0 41.666667%;
+ max-width: 41.666667%; }
+ .col-sm-6 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 50%;
+ flex: 0 0 50%;
+ max-width: 50%; }
+ .col-sm-7 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 58.333333%;
+ flex: 0 0 58.333333%;
+ max-width: 58.333333%; }
+ .col-sm-8 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 66.666667%;
+ flex: 0 0 66.666667%;
+ max-width: 66.666667%; }
+ .col-sm-9 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 75%;
+ flex: 0 0 75%;
+ max-width: 75%; }
+ .col-sm-10 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 83.333333%;
+ flex: 0 0 83.333333%;
+ max-width: 83.333333%; }
+ .col-sm-11 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 91.666667%;
+ flex: 0 0 91.666667%;
+ max-width: 91.666667%; }
+ .col-sm-12 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 100%;
+ flex: 0 0 100%;
+ max-width: 100%; }
+ .order-sm-first {
+ -webkit-box-ordinal-group: 0;
+ -ms-flex-order: -1;
+ order: -1; }
+ .order-sm-last {
+ -webkit-box-ordinal-group: 14;
+ -ms-flex-order: 13;
+ order: 13; }
+ .order-sm-0 {
+ -webkit-box-ordinal-group: 1;
+ -ms-flex-order: 0;
+ order: 0; }
+ .order-sm-1 {
+ -webkit-box-ordinal-group: 2;
+ -ms-flex-order: 1;
+ order: 1; }
+ .order-sm-2 {
+ -webkit-box-ordinal-group: 3;
+ -ms-flex-order: 2;
+ order: 2; }
+ .order-sm-3 {
+ -webkit-box-ordinal-group: 4;
+ -ms-flex-order: 3;
+ order: 3; }
+ .order-sm-4 {
+ -webkit-box-ordinal-group: 5;
+ -ms-flex-order: 4;
+ order: 4; }
+ .order-sm-5 {
+ -webkit-box-ordinal-group: 6;
+ -ms-flex-order: 5;
+ order: 5; }
+ .order-sm-6 {
+ -webkit-box-ordinal-group: 7;
+ -ms-flex-order: 6;
+ order: 6; }
+ .order-sm-7 {
+ -webkit-box-ordinal-group: 8;
+ -ms-flex-order: 7;
+ order: 7; }
+ .order-sm-8 {
+ -webkit-box-ordinal-group: 9;
+ -ms-flex-order: 8;
+ order: 8; }
+ .order-sm-9 {
+ -webkit-box-ordinal-group: 10;
+ -ms-flex-order: 9;
+ order: 9; }
+ .order-sm-10 {
+ -webkit-box-ordinal-group: 11;
+ -ms-flex-order: 10;
+ order: 10; }
+ .order-sm-11 {
+ -webkit-box-ordinal-group: 12;
+ -ms-flex-order: 11;
+ order: 11; }
+ .order-sm-12 {
+ -webkit-box-ordinal-group: 13;
+ -ms-flex-order: 12;
+ order: 12; }
+ .offset-sm-0 {
+ margin-left: 0; }
+ .offset-sm-1 {
+ margin-left: 8.333333%; }
+ .offset-sm-2 {
+ margin-left: 16.666667%; }
+ .offset-sm-3 {
+ margin-left: 25%; }
+ .offset-sm-4 {
+ margin-left: 33.333333%; }
+ .offset-sm-5 {
+ margin-left: 41.666667%; }
+ .offset-sm-6 {
+ margin-left: 50%; }
+ .offset-sm-7 {
+ margin-left: 58.333333%; }
+ .offset-sm-8 {
+ margin-left: 66.666667%; }
+ .offset-sm-9 {
+ margin-left: 75%; }
+ .offset-sm-10 {
+ margin-left: 83.333333%; }
+ .offset-sm-11 {
+ margin-left: 91.666667%; } }
+
+@media (min-width: 768px) {
+ .col-md {
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -webkit-box-flex: 1;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ max-width: 100%; }
+ .col-md-auto {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ width: auto;
+ max-width: none; }
+ .col-md-1 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 8.333333%;
+ flex: 0 0 8.333333%;
+ max-width: 8.333333%; }
+ .col-md-2 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 16.666667%;
+ flex: 0 0 16.666667%;
+ max-width: 16.666667%; }
+ .col-md-3 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 25%;
+ flex: 0 0 25%;
+ max-width: 25%; }
+ .col-md-4 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 33.333333%;
+ flex: 0 0 33.333333%;
+ max-width: 33.333333%; }
+ .col-md-5 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 41.666667%;
+ flex: 0 0 41.666667%;
+ max-width: 41.666667%; }
+ .col-md-6 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 50%;
+ flex: 0 0 50%;
+ max-width: 50%; }
+ .col-md-7 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 58.333333%;
+ flex: 0 0 58.333333%;
+ max-width: 58.333333%; }
+ .col-md-8 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 66.666667%;
+ flex: 0 0 66.666667%;
+ max-width: 66.666667%; }
+ .col-md-9 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 75%;
+ flex: 0 0 75%;
+ max-width: 75%; }
+ .col-md-10 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 83.333333%;
+ flex: 0 0 83.333333%;
+ max-width: 83.333333%; }
+ .col-md-11 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 91.666667%;
+ flex: 0 0 91.666667%;
+ max-width: 91.666667%; }
+ .col-md-12 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 100%;
+ flex: 0 0 100%;
+ max-width: 100%; }
+ .order-md-first {
+ -webkit-box-ordinal-group: 0;
+ -ms-flex-order: -1;
+ order: -1; }
+ .order-md-last {
+ -webkit-box-ordinal-group: 14;
+ -ms-flex-order: 13;
+ order: 13; }
+ .order-md-0 {
+ -webkit-box-ordinal-group: 1;
+ -ms-flex-order: 0;
+ order: 0; }
+ .order-md-1 {
+ -webkit-box-ordinal-group: 2;
+ -ms-flex-order: 1;
+ order: 1; }
+ .order-md-2 {
+ -webkit-box-ordinal-group: 3;
+ -ms-flex-order: 2;
+ order: 2; }
+ .order-md-3 {
+ -webkit-box-ordinal-group: 4;
+ -ms-flex-order: 3;
+ order: 3; }
+ .order-md-4 {
+ -webkit-box-ordinal-group: 5;
+ -ms-flex-order: 4;
+ order: 4; }
+ .order-md-5 {
+ -webkit-box-ordinal-group: 6;
+ -ms-flex-order: 5;
+ order: 5; }
+ .order-md-6 {
+ -webkit-box-ordinal-group: 7;
+ -ms-flex-order: 6;
+ order: 6; }
+ .order-md-7 {
+ -webkit-box-ordinal-group: 8;
+ -ms-flex-order: 7;
+ order: 7; }
+ .order-md-8 {
+ -webkit-box-ordinal-group: 9;
+ -ms-flex-order: 8;
+ order: 8; }
+ .order-md-9 {
+ -webkit-box-ordinal-group: 10;
+ -ms-flex-order: 9;
+ order: 9; }
+ .order-md-10 {
+ -webkit-box-ordinal-group: 11;
+ -ms-flex-order: 10;
+ order: 10; }
+ .order-md-11 {
+ -webkit-box-ordinal-group: 12;
+ -ms-flex-order: 11;
+ order: 11; }
+ .order-md-12 {
+ -webkit-box-ordinal-group: 13;
+ -ms-flex-order: 12;
+ order: 12; }
+ .offset-md-0 {
+ margin-left: 0; }
+ .offset-md-1 {
+ margin-left: 8.333333%; }
+ .offset-md-2 {
+ margin-left: 16.666667%; }
+ .offset-md-3 {
+ margin-left: 25%; }
+ .offset-md-4 {
+ margin-left: 33.333333%; }
+ .offset-md-5 {
+ margin-left: 41.666667%; }
+ .offset-md-6 {
+ margin-left: 50%; }
+ .offset-md-7 {
+ margin-left: 58.333333%; }
+ .offset-md-8 {
+ margin-left: 66.666667%; }
+ .offset-md-9 {
+ margin-left: 75%; }
+ .offset-md-10 {
+ margin-left: 83.333333%; }
+ .offset-md-11 {
+ margin-left: 91.666667%; } }
+
+@media (min-width: 992px) {
+ .col-lg {
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -webkit-box-flex: 1;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ max-width: 100%; }
+ .col-lg-auto {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ width: auto;
+ max-width: none; }
+ .col-lg-1 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 8.333333%;
+ flex: 0 0 8.333333%;
+ max-width: 8.333333%; }
+ .col-lg-2 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 16.666667%;
+ flex: 0 0 16.666667%;
+ max-width: 16.666667%; }
+ .col-lg-3 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 25%;
+ flex: 0 0 25%;
+ max-width: 25%; }
+ .col-lg-4 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 33.333333%;
+ flex: 0 0 33.333333%;
+ max-width: 33.333333%; }
+ .col-lg-5 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 41.666667%;
+ flex: 0 0 41.666667%;
+ max-width: 41.666667%; }
+ .col-lg-6 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 50%;
+ flex: 0 0 50%;
+ max-width: 50%; }
+ .col-lg-7 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 58.333333%;
+ flex: 0 0 58.333333%;
+ max-width: 58.333333%; }
+ .col-lg-8 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 66.666667%;
+ flex: 0 0 66.666667%;
+ max-width: 66.666667%; }
+ .col-lg-9 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 75%;
+ flex: 0 0 75%;
+ max-width: 75%; }
+ .col-lg-10 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 83.333333%;
+ flex: 0 0 83.333333%;
+ max-width: 83.333333%; }
+ .col-lg-11 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 91.666667%;
+ flex: 0 0 91.666667%;
+ max-width: 91.666667%; }
+ .col-lg-12 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 100%;
+ flex: 0 0 100%;
+ max-width: 100%; }
+ .order-lg-first {
+ -webkit-box-ordinal-group: 0;
+ -ms-flex-order: -1;
+ order: -1; }
+ .order-lg-last {
+ -webkit-box-ordinal-group: 14;
+ -ms-flex-order: 13;
+ order: 13; }
+ .order-lg-0 {
+ -webkit-box-ordinal-group: 1;
+ -ms-flex-order: 0;
+ order: 0; }
+ .order-lg-1 {
+ -webkit-box-ordinal-group: 2;
+ -ms-flex-order: 1;
+ order: 1; }
+ .order-lg-2 {
+ -webkit-box-ordinal-group: 3;
+ -ms-flex-order: 2;
+ order: 2; }
+ .order-lg-3 {
+ -webkit-box-ordinal-group: 4;
+ -ms-flex-order: 3;
+ order: 3; }
+ .order-lg-4 {
+ -webkit-box-ordinal-group: 5;
+ -ms-flex-order: 4;
+ order: 4; }
+ .order-lg-5 {
+ -webkit-box-ordinal-group: 6;
+ -ms-flex-order: 5;
+ order: 5; }
+ .order-lg-6 {
+ -webkit-box-ordinal-group: 7;
+ -ms-flex-order: 6;
+ order: 6; }
+ .order-lg-7 {
+ -webkit-box-ordinal-group: 8;
+ -ms-flex-order: 7;
+ order: 7; }
+ .order-lg-8 {
+ -webkit-box-ordinal-group: 9;
+ -ms-flex-order: 8;
+ order: 8; }
+ .order-lg-9 {
+ -webkit-box-ordinal-group: 10;
+ -ms-flex-order: 9;
+ order: 9; }
+ .order-lg-10 {
+ -webkit-box-ordinal-group: 11;
+ -ms-flex-order: 10;
+ order: 10; }
+ .order-lg-11 {
+ -webkit-box-ordinal-group: 12;
+ -ms-flex-order: 11;
+ order: 11; }
+ .order-lg-12 {
+ -webkit-box-ordinal-group: 13;
+ -ms-flex-order: 12;
+ order: 12; }
+ .offset-lg-0 {
+ margin-left: 0; }
+ .offset-lg-1 {
+ margin-left: 8.333333%; }
+ .offset-lg-2 {
+ margin-left: 16.666667%; }
+ .offset-lg-3 {
+ margin-left: 25%; }
+ .offset-lg-4 {
+ margin-left: 33.333333%; }
+ .offset-lg-5 {
+ margin-left: 41.666667%; }
+ .offset-lg-6 {
+ margin-left: 50%; }
+ .offset-lg-7 {
+ margin-left: 58.333333%; }
+ .offset-lg-8 {
+ margin-left: 66.666667%; }
+ .offset-lg-9 {
+ margin-left: 75%; }
+ .offset-lg-10 {
+ margin-left: 83.333333%; }
+ .offset-lg-11 {
+ margin-left: 91.666667%; } }
+
+@media (min-width: 1200px) {
+ .col-xl {
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -webkit-box-flex: 1;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ max-width: 100%; }
+ .col-xl-auto {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ width: auto;
+ max-width: none; }
+ .col-xl-1 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 8.333333%;
+ flex: 0 0 8.333333%;
+ max-width: 8.333333%; }
+ .col-xl-2 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 16.666667%;
+ flex: 0 0 16.666667%;
+ max-width: 16.666667%; }
+ .col-xl-3 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 25%;
+ flex: 0 0 25%;
+ max-width: 25%; }
+ .col-xl-4 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 33.333333%;
+ flex: 0 0 33.333333%;
+ max-width: 33.333333%; }
+ .col-xl-5 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 41.666667%;
+ flex: 0 0 41.666667%;
+ max-width: 41.666667%; }
+ .col-xl-6 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 50%;
+ flex: 0 0 50%;
+ max-width: 50%; }
+ .col-xl-7 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 58.333333%;
+ flex: 0 0 58.333333%;
+ max-width: 58.333333%; }
+ .col-xl-8 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 66.666667%;
+ flex: 0 0 66.666667%;
+ max-width: 66.666667%; }
+ .col-xl-9 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 75%;
+ flex: 0 0 75%;
+ max-width: 75%; }
+ .col-xl-10 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 83.333333%;
+ flex: 0 0 83.333333%;
+ max-width: 83.333333%; }
+ .col-xl-11 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 91.666667%;
+ flex: 0 0 91.666667%;
+ max-width: 91.666667%; }
+ .col-xl-12 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 100%;
+ flex: 0 0 100%;
+ max-width: 100%; }
+ .order-xl-first {
+ -webkit-box-ordinal-group: 0;
+ -ms-flex-order: -1;
+ order: -1; }
+ .order-xl-last {
+ -webkit-box-ordinal-group: 14;
+ -ms-flex-order: 13;
+ order: 13; }
+ .order-xl-0 {
+ -webkit-box-ordinal-group: 1;
+ -ms-flex-order: 0;
+ order: 0; }
+ .order-xl-1 {
+ -webkit-box-ordinal-group: 2;
+ -ms-flex-order: 1;
+ order: 1; }
+ .order-xl-2 {
+ -webkit-box-ordinal-group: 3;
+ -ms-flex-order: 2;
+ order: 2; }
+ .order-xl-3 {
+ -webkit-box-ordinal-group: 4;
+ -ms-flex-order: 3;
+ order: 3; }
+ .order-xl-4 {
+ -webkit-box-ordinal-group: 5;
+ -ms-flex-order: 4;
+ order: 4; }
+ .order-xl-5 {
+ -webkit-box-ordinal-group: 6;
+ -ms-flex-order: 5;
+ order: 5; }
+ .order-xl-6 {
+ -webkit-box-ordinal-group: 7;
+ -ms-flex-order: 6;
+ order: 6; }
+ .order-xl-7 {
+ -webkit-box-ordinal-group: 8;
+ -ms-flex-order: 7;
+ order: 7; }
+ .order-xl-8 {
+ -webkit-box-ordinal-group: 9;
+ -ms-flex-order: 8;
+ order: 8; }
+ .order-xl-9 {
+ -webkit-box-ordinal-group: 10;
+ -ms-flex-order: 9;
+ order: 9; }
+ .order-xl-10 {
+ -webkit-box-ordinal-group: 11;
+ -ms-flex-order: 10;
+ order: 10; }
+ .order-xl-11 {
+ -webkit-box-ordinal-group: 12;
+ -ms-flex-order: 11;
+ order: 11; }
+ .order-xl-12 {
+ -webkit-box-ordinal-group: 13;
+ -ms-flex-order: 12;
+ order: 12; }
+ .offset-xl-0 {
+ margin-left: 0; }
+ .offset-xl-1 {
+ margin-left: 8.333333%; }
+ .offset-xl-2 {
+ margin-left: 16.666667%; }
+ .offset-xl-3 {
+ margin-left: 25%; }
+ .offset-xl-4 {
+ margin-left: 33.333333%; }
+ .offset-xl-5 {
+ margin-left: 41.666667%; }
+ .offset-xl-6 {
+ margin-left: 50%; }
+ .offset-xl-7 {
+ margin-left: 58.333333%; }
+ .offset-xl-8 {
+ margin-left: 66.666667%; }
+ .offset-xl-9 {
+ margin-left: 75%; }
+ .offset-xl-10 {
+ margin-left: 83.333333%; }
+ .offset-xl-11 {
+ margin-left: 91.666667%; } }
+
+.table {
+ width: 100%;
+ max-width: 100%;
+ margin-bottom: 1rem;
+ background-color: transparent; }
+
+.table td, .table th {
+ padding: .75rem;
+ vertical-align: top;
+ border-top: 1px solid #dee2e6; }
+
+.table thead th {
+ vertical-align: bottom;
+ border-bottom: 2px solid #dee2e6; }
+
+.table tbody + tbody {
+ border-top: 2px solid #dee2e6; }
+
+.table .table {
+ background-color: #fff; }
+
+.table-sm td, .table-sm th {
+ padding: .3rem; }
+
+.table-bordered {
+ border: 1px solid #dee2e6; }
+
+.table-bordered td, .table-bordered th {
+ border: 1px solid #dee2e6; }
+
+.table-bordered thead td, .table-bordered thead th {
+ border-bottom-width: 2px; }
+
+.table-striped tbody tr:nth-of-type(odd) {
+ background-color: rgba(0, 0, 0, 0.05); }
+
+.table-hover tbody tr:hover {
+ background-color: rgba(0, 0, 0, 0.075); }
+
+.table-primary, .table-primary > td, .table-primary > th {
+ background-color: #b8daff; }
+
+.table-hover .table-primary:hover {
+ background-color: #9fcdff; }
+
+.table-hover .table-primary:hover > td, .table-hover .table-primary:hover > th {
+ background-color: #9fcdff; }
+
+.table-secondary, .table-secondary > td, .table-secondary > th {
+ background-color: #d6d8db; }
+
+.table-hover .table-secondary:hover {
+ background-color: #c8cbcf; }
+
+.table-hover .table-secondary:hover > td, .table-hover .table-secondary:hover > th {
+ background-color: #c8cbcf; }
+
+.table-success, .table-success > td, .table-success > th {
+ background-color: #c3e6cb; }
+
+.table-hover .table-success:hover {
+ background-color: #b1dfbb; }
+
+.table-hover .table-success:hover > td, .table-hover .table-success:hover > th {
+ background-color: #b1dfbb; }
+
+.table-info, .table-info > td, .table-info > th {
+ background-color: #bee5eb; }
+
+.table-hover .table-info:hover {
+ background-color: #abdde5; }
+
+.table-hover .table-info:hover > td, .table-hover .table-info:hover > th {
+ background-color: #abdde5; }
+
+.table-warning, .table-warning > td, .table-warning > th {
+ background-color: #ffeeba; }
+
+.table-hover .table-warning:hover {
+ background-color: #ffe8a1; }
+
+.table-hover .table-warning:hover > td, .table-hover .table-warning:hover > th {
+ background-color: #ffe8a1; }
+
+.table-danger, .table-danger > td, .table-danger > th {
+ background-color: #f5c6cb; }
+
+.table-hover .table-danger:hover {
+ background-color: #f1b0b7; }
+
+.table-hover .table-danger:hover > td, .table-hover .table-danger:hover > th {
+ background-color: #f1b0b7; }
+
+.table-light, .table-light > td, .table-light > th {
+ background-color: #fdfdfe; }
+
+.table-hover .table-light:hover {
+ background-color: #ececf6; }
+
+.table-hover .table-light:hover > td, .table-hover .table-light:hover > th {
+ background-color: #ececf6; }
+
+.table-dark, .table-dark > td, .table-dark > th {
+ background-color: #c6c8ca; }
+
+.table-hover .table-dark:hover {
+ background-color: #b9bbbe; }
+
+.table-hover .table-dark:hover > td, .table-hover .table-dark:hover > th {
+ background-color: #b9bbbe; }
+
+.table-active, .table-active > td, .table-active > th {
+ background-color: rgba(0, 0, 0, 0.075); }
+
+.table-hover .table-active:hover {
+ background-color: rgba(0, 0, 0, 0.075); }
+
+.table-hover .table-active:hover > td, .table-hover .table-active:hover > th {
+ background-color: rgba(0, 0, 0, 0.075); }
+
+.table .thead-dark th {
+ color: #fff;
+ background-color: #212529;
+ border-color: #32383e; }
+
+.table .thead-light th {
+ color: #495057;
+ background-color: #e9ecef;
+ border-color: #dee2e6; }
+
+.table-dark {
+ color: #fff;
+ background-color: #212529; }
+
+.table-dark td, .table-dark th, .table-dark thead th {
+ border-color: #32383e; }
+
+.table-dark.table-bordered {
+ border: 0; }
+
+.table-dark.table-striped tbody tr:nth-of-type(odd) {
+ background-color: rgba(255, 255, 255, 0.05); }
+
+.table-dark.table-hover tbody tr:hover {
+ background-color: rgba(255, 255, 255, 0.075); }
+
+@media (max-width: 575.98px) {
+ .table-responsive-sm {
+ display: block;
+ width: 100%;
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ -ms-overflow-style: -ms-autohiding-scrollbar; }
+ .table-responsive-sm > .table-bordered {
+ border: 0; } }
+
+@media (max-width: 767.98px) {
+ .table-responsive-md {
+ display: block;
+ width: 100%;
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ -ms-overflow-style: -ms-autohiding-scrollbar; }
+ .table-responsive-md > .table-bordered {
+ border: 0; } }
+
+@media (max-width: 991.98px) {
+ .table-responsive-lg {
+ display: block;
+ width: 100%;
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ -ms-overflow-style: -ms-autohiding-scrollbar; }
+ .table-responsive-lg > .table-bordered {
+ border: 0; } }
+
+@media (max-width: 1199.98px) {
+ .table-responsive-xl {
+ display: block;
+ width: 100%;
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ -ms-overflow-style: -ms-autohiding-scrollbar; }
+ .table-responsive-xl > .table-bordered {
+ border: 0; } }
+
+.table-responsive {
+ display: block;
+ width: 100%;
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ -ms-overflow-style: -ms-autohiding-scrollbar; }
+
+.table-responsive > .table-bordered {
+ border: 0; }
+
+.form-control {
+ display: block;
+ width: 100%;
+ padding: .375rem .75rem;
+ font-size: 1rem;
+ line-height: 1.5;
+ color: #495057;
+ background-color: #fff;
+ background-clip: padding-box;
+ border: 1px solid #ced4da;
+ border-radius: .25rem;
+ transition: border-color .15s ease-in-out,box-shadow .15s ease-in-out; }
+
+.form-control::-ms-expand {
+ background-color: transparent;
+ border: 0; }
+
+.form-control:focus {
+ color: #495057;
+ background-color: #fff;
+ border-color: #80bdff;
+ outline: 0;
+ box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); }
+
+.form-control::-webkit-input-placeholder {
+ color: #6c757d;
+ opacity: 1; }
+
+.form-control::-moz-placeholder {
+ color: #6c757d;
+ opacity: 1; }
+
+.form-control:-ms-input-placeholder {
+ color: #6c757d;
+ opacity: 1; }
+
+.form-control::-ms-input-placeholder {
+ color: #6c757d;
+ opacity: 1; }
+
+.form-control::placeholder {
+ color: #6c757d;
+ opacity: 1; }
+
+.form-control:disabled, .form-control[readonly] {
+ background-color: #e9ecef;
+ opacity: 1; }
+
+select.form-control:not([size]):not([multiple]) {
+ height: calc(2.25rem + 2px); }
+
+select.form-control:focus::-ms-value {
+ color: #495057;
+ background-color: #fff; }
+
+.form-control-file, .form-control-range {
+ display: block;
+ width: 100%; }
+
+.col-form-label {
+ padding-top: calc(.375rem + 1px);
+ padding-bottom: calc(.375rem + 1px);
+ margin-bottom: 0;
+ font-size: inherit;
+ line-height: 1.5; }
+
+.col-form-label-lg {
+ padding-top: calc(.5rem + 1px);
+ padding-bottom: calc(.5rem + 1px);
+ font-size: 1.25rem;
+ line-height: 1.5; }
+
+.col-form-label-sm {
+ padding-top: calc(.25rem + 1px);
+ padding-bottom: calc(.25rem + 1px);
+ font-size: .875rem;
+ line-height: 1.5; }
+
+.form-control-plaintext {
+ display: block;
+ width: 100%;
+ padding-top: .375rem;
+ padding-bottom: .375rem;
+ margin-bottom: 0;
+ line-height: 1.5;
+ background-color: transparent;
+ border: solid transparent;
+ border-width: 1px 0; }
+
+.form-control-plaintext.form-control-lg, .form-control-plaintext.form-control-sm, .input-group-lg > .form-control-plaintext.form-control, .input-group-lg > .input-group-append > .form-control-plaintext.btn, .input-group-lg > .input-group-append > .form-control-plaintext.input-group-text, .input-group-lg > .input-group-prepend > .form-control-plaintext.btn, .input-group-lg > .input-group-prepend > .form-control-plaintext.input-group-text, .input-group-sm > .form-control-plaintext.form-control, .input-group-sm > .input-group-append > .form-control-plaintext.btn, .input-group-sm > .input-group-append > .form-control-plaintext.input-group-text, .input-group-sm > .input-group-prepend > .form-control-plaintext.btn, .input-group-sm > .input-group-prepend > .form-control-plaintext.input-group-text {
+ padding-right: 0;
+ padding-left: 0; }
+
+.form-control-sm, .input-group-sm > .form-control, .input-group-sm > .input-group-append > .btn, .input-group-sm > .input-group-append > .input-group-text, .input-group-sm > .input-group-prepend > .btn, .input-group-sm > .input-group-prepend > .input-group-text {
+ padding: .25rem .5rem;
+ font-size: .875rem;
+ line-height: 1.5;
+ border-radius: .2rem; }
+
+.input-group-sm > .input-group-append > select.btn:not([size]):not([multiple]), .input-group-sm > .input-group-append > select.input-group-text:not([size]):not([multiple]), .input-group-sm > .input-group-prepend > select.btn:not([size]):not([multiple]), .input-group-sm > .input-group-prepend > select.input-group-text:not([size]):not([multiple]), .input-group-sm > select.form-control:not([size]):not([multiple]), select.form-control-sm:not([size]):not([multiple]) {
+ height: calc(1.8125rem + 2px); }
+
+.form-control-lg, .input-group-lg > .form-control, .input-group-lg > .input-group-append > .btn, .input-group-lg > .input-group-append > .input-group-text, .input-group-lg > .input-group-prepend > .btn, .input-group-lg > .input-group-prepend > .input-group-text {
+ padding: .5rem 1rem;
+ font-size: 1.25rem;
+ line-height: 1.5;
+ border-radius: .3rem; }
+
+.input-group-lg > .input-group-append > select.btn:not([size]):not([multiple]), .input-group-lg > .input-group-append > select.input-group-text:not([size]):not([multiple]), .input-group-lg > .input-group-prepend > select.btn:not([size]):not([multiple]), .input-group-lg > .input-group-prepend > select.input-group-text:not([size]):not([multiple]), .input-group-lg > select.form-control:not([size]):not([multiple]), select.form-control-lg:not([size]):not([multiple]) {
+ height: calc(2.875rem + 2px); }
+
+.form-group {
+ margin-bottom: 1rem; }
+
+.form-text {
+ display: block;
+ margin-top: .25rem; }
+
+.form-row {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ margin-right: -5px;
+ margin-left: -5px; }
+
+.form-row > .col, .form-row > [class*=col-] {
+ padding-right: 5px;
+ padding-left: 5px; }
+
+.form-check {
+ position: relative;
+ display: block;
+ padding-left: 1.25rem; }
+
+.form-check-input {
+ position: absolute;
+ margin-top: .3rem;
+ margin-left: -1.25rem; }
+
+.form-check-input:disabled ~ .form-check-label {
+ color: #6c757d; }
+
+.form-check-label {
+ margin-bottom: 0; }
+
+.form-check-inline {
+ display: -webkit-inline-box;
+ display: -ms-inline-flexbox;
+ display: inline-flex;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ align-items: center;
+ padding-left: 0;
+ margin-right: .75rem; }
+
+.form-check-inline .form-check-input {
+ position: static;
+ margin-top: 0;
+ margin-right: .3125rem;
+ margin-left: 0; }
+
+.valid-feedback {
+ display: none;
+ width: 100%;
+ margin-top: .25rem;
+ font-size: 80%;
+ color: #28a745; }
+
+.valid-tooltip {
+ position: absolute;
+ top: 100%;
+ z-index: 5;
+ display: none;
+ max-width: 100%;
+ padding: .5rem;
+ margin-top: .1rem;
+ font-size: .875rem;
+ line-height: 1;
+ color: #fff;
+ background-color: rgba(40, 167, 69, 0.8);
+ border-radius: .2rem; }
+
+.custom-select.is-valid, .form-control.is-valid, .was-validated .custom-select:valid, .was-validated .form-control:valid {
+ border-color: #28a745; }
+
+.custom-select.is-valid:focus, .form-control.is-valid:focus, .was-validated .custom-select:valid:focus, .was-validated .form-control:valid:focus {
+ border-color: #28a745;
+ box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); }
+
+.custom-select.is-valid ~ .valid-feedback, .custom-select.is-valid ~ .valid-tooltip, .form-control.is-valid ~ .valid-feedback, .form-control.is-valid ~ .valid-tooltip, .was-validated .custom-select:valid ~ .valid-feedback, .was-validated .custom-select:valid ~ .valid-tooltip, .was-validated .form-control:valid ~ .valid-feedback, .was-validated .form-control:valid ~ .valid-tooltip {
+ display: block; }
+
+.form-check-input.is-valid ~ .form-check-label, .was-validated .form-check-input:valid ~ .form-check-label {
+ color: #28a745; }
+
+.form-check-input.is-valid ~ .valid-feedback, .form-check-input.is-valid ~ .valid-tooltip, .was-validated .form-check-input:valid ~ .valid-feedback, .was-validated .form-check-input:valid ~ .valid-tooltip {
+ display: block; }
+
+.custom-control-input.is-valid ~ .custom-control-label, .was-validated .custom-control-input:valid ~ .custom-control-label {
+ color: #28a745; }
+
+.custom-control-input.is-valid ~ .custom-control-label::before, .was-validated .custom-control-input:valid ~ .custom-control-label::before {
+ background-color: #71dd8a; }
+
+.custom-control-input.is-valid ~ .valid-feedback, .custom-control-input.is-valid ~ .valid-tooltip, .was-validated .custom-control-input:valid ~ .valid-feedback, .was-validated .custom-control-input:valid ~ .valid-tooltip {
+ display: block; }
+
+.custom-control-input.is-valid:checked ~ .custom-control-label::before, .was-validated .custom-control-input:valid:checked ~ .custom-control-label::before {
+ background-color: #34ce57; }
+
+.custom-control-input.is-valid:focus ~ .custom-control-label::before, .was-validated .custom-control-input:valid:focus ~ .custom-control-label::before {
+ box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(40, 167, 69, 0.25); }
+
+.custom-file-input.is-valid ~ .custom-file-label, .was-validated .custom-file-input:valid ~ .custom-file-label {
+ border-color: #28a745; }
+
+.custom-file-input.is-valid ~ .custom-file-label::before, .was-validated .custom-file-input:valid ~ .custom-file-label::before {
+ border-color: inherit; }
+
+.custom-file-input.is-valid ~ .valid-feedback, .custom-file-input.is-valid ~ .valid-tooltip, .was-validated .custom-file-input:valid ~ .valid-feedback, .was-validated .custom-file-input:valid ~ .valid-tooltip {
+ display: block; }
+
+.custom-file-input.is-valid:focus ~ .custom-file-label, .was-validated .custom-file-input:valid:focus ~ .custom-file-label {
+ box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); }
+
+.invalid-feedback {
+ display: none;
+ width: 100%;
+ margin-top: .25rem;
+ font-size: 80%;
+ color: #dc3545; }
+
+.invalid-tooltip {
+ position: absolute;
+ top: 100%;
+ z-index: 5;
+ display: none;
+ max-width: 100%;
+ padding: .5rem;
+ margin-top: .1rem;
+ font-size: .875rem;
+ line-height: 1;
+ color: #fff;
+ background-color: rgba(220, 53, 69, 0.8);
+ border-radius: .2rem; }
+
+.custom-select.is-invalid, .form-control.is-invalid, .was-validated .custom-select:invalid, .was-validated .form-control:invalid {
+ border-color: #dc3545; }
+
+.custom-select.is-invalid:focus, .form-control.is-invalid:focus, .was-validated .custom-select:invalid:focus, .was-validated .form-control:invalid:focus {
+ border-color: #dc3545;
+ box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); }
+
+.custom-select.is-invalid ~ .invalid-feedback, .custom-select.is-invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-feedback, .form-control.is-invalid ~ .invalid-tooltip, .was-validated .custom-select:invalid ~ .invalid-feedback, .was-validated .custom-select:invalid ~ .invalid-tooltip, .was-validated .form-control:invalid ~ .invalid-feedback, .was-validated .form-control:invalid ~ .invalid-tooltip {
+ display: block; }
+
+.form-check-input.is-invalid ~ .form-check-label, .was-validated .form-check-input:invalid ~ .form-check-label {
+ color: #dc3545; }
+
+.form-check-input.is-invalid ~ .invalid-feedback, .form-check-input.is-invalid ~ .invalid-tooltip, .was-validated .form-check-input:invalid ~ .invalid-feedback, .was-validated .form-check-input:invalid ~ .invalid-tooltip {
+ display: block; }
+
+.custom-control-input.is-invalid ~ .custom-control-label, .was-validated .custom-control-input:invalid ~ .custom-control-label {
+ color: #dc3545; }
+
+.custom-control-input.is-invalid ~ .custom-control-label::before, .was-validated .custom-control-input:invalid ~ .custom-control-label::before {
+ background-color: #efa2a9; }
+
+.custom-control-input.is-invalid ~ .invalid-feedback, .custom-control-input.is-invalid ~ .invalid-tooltip, .was-validated .custom-control-input:invalid ~ .invalid-feedback, .was-validated .custom-control-input:invalid ~ .invalid-tooltip {
+ display: block; }
+
+.custom-control-input.is-invalid:checked ~ .custom-control-label::before, .was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before {
+ background-color: #e4606d; }
+
+.custom-control-input.is-invalid:focus ~ .custom-control-label::before, .was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before {
+ box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(220, 53, 69, 0.25); }
+
+.custom-file-input.is-invalid ~ .custom-file-label, .was-validated .custom-file-input:invalid ~ .custom-file-label {
+ border-color: #dc3545; }
+
+.custom-file-input.is-invalid ~ .custom-file-label::before, .was-validated .custom-file-input:invalid ~ .custom-file-label::before {
+ border-color: inherit; }
+
+.custom-file-input.is-invalid ~ .invalid-feedback, .custom-file-input.is-invalid ~ .invalid-tooltip, .was-validated .custom-file-input:invalid ~ .invalid-feedback, .was-validated .custom-file-input:invalid ~ .invalid-tooltip {
+ display: block; }
+
+.custom-file-input.is-invalid:focus ~ .custom-file-label, .was-validated .custom-file-input:invalid:focus ~ .custom-file-label {
+ box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); }
+
+.form-inline {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ -ms-flex-flow: row wrap;
+ flex-flow: row wrap;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ align-items: center; }
+
+.form-inline .form-check {
+ width: 100%; }
+
+@media (min-width: 576px) {
+ .form-inline label {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-box-pack: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+ margin-bottom: 0; }
+ .form-inline .form-group {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ -ms-flex-flow: row wrap;
+ flex-flow: row wrap;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ align-items: center;
+ margin-bottom: 0; }
+ .form-inline .form-control {
+ display: inline-block;
+ width: auto;
+ vertical-align: middle; }
+ .form-inline .form-control-plaintext {
+ display: inline-block; }
+ .form-inline .input-group {
+ width: auto; }
+ .form-inline .form-check {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-box-pack: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+ width: auto;
+ padding-left: 0; }
+ .form-inline .form-check-input {
+ position: relative;
+ margin-top: 0;
+ margin-right: .25rem;
+ margin-left: 0; }
+ .form-inline .custom-control {
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-box-pack: center;
+ -ms-flex-pack: center;
+ justify-content: center; }
+ .form-inline .custom-control-label {
+ margin-bottom: 0; } }
+
+.btn {
+ display: inline-block;
+ font-weight: 400;
+ text-align: center;
+ white-space: nowrap;
+ vertical-align: middle;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ border: 1px solid transparent;
+ padding: .375rem .75rem;
+ font-size: 1rem;
+ line-height: 1.5;
+ border-radius: .25rem;
+ transition: color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out; }
+
+.btn:focus, .btn:hover {
+ text-decoration: none; }
+
+.btn.focus, .btn:focus {
+ outline: 0;
+ box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); }
+
+.btn.disabled, .btn:disabled {
+ opacity: .65; }
+
+.btn:not(:disabled):not(.disabled) {
+ cursor: pointer; }
+
+.btn:not(:disabled):not(.disabled).active, .btn:not(:disabled):not(.disabled):active {
+ background-image: none; }
+
+a.btn.disabled, fieldset:disabled a.btn {
+ pointer-events: none; }
+
+.btn-primary {
+ color: #fff;
+ background-color: #007bff;
+ border-color: #007bff; }
+
+.btn-primary:hover {
+ color: #fff;
+ background-color: #0069d9;
+ border-color: #0062cc; }
+
+.btn-primary.focus, .btn-primary:focus {
+ box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5); }
+
+.btn-primary.disabled, .btn-primary:disabled {
+ color: #fff;
+ background-color: #007bff;
+ border-color: #007bff; }
+
+.btn-primary:not(:disabled):not(.disabled).active, .btn-primary:not(:disabled):not(.disabled):active, .show > .btn-primary.dropdown-toggle {
+ color: #fff;
+ background-color: #0062cc;
+ border-color: #005cbf; }
+
+.btn-primary:not(:disabled):not(.disabled).active:focus, .btn-primary:not(:disabled):not(.disabled):active:focus, .show > .btn-primary.dropdown-toggle:focus {
+ box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5); }
+
+.btn-secondary {
+ color: #fff;
+ background-color: #6c757d;
+ border-color: #6c757d; }
+
+.btn-secondary:hover {
+ color: #fff;
+ background-color: #5a6268;
+ border-color: #545b62; }
+
+.btn-secondary.focus, .btn-secondary:focus {
+ box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); }
+
+.btn-secondary.disabled, .btn-secondary:disabled {
+ color: #fff;
+ background-color: #6c757d;
+ border-color: #6c757d; }
+
+.btn-secondary:not(:disabled):not(.disabled).active, .btn-secondary:not(:disabled):not(.disabled):active, .show > .btn-secondary.dropdown-toggle {
+ color: #fff;
+ background-color: #545b62;
+ border-color: #4e555b; }
+
+.btn-secondary:not(:disabled):not(.disabled).active:focus, .btn-secondary:not(:disabled):not(.disabled):active:focus, .show > .btn-secondary.dropdown-toggle:focus {
+ box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); }
+
+.btn-success {
+ color: #fff;
+ background-color: #28a745;
+ border-color: #28a745; }
+
+.btn-success:hover {
+ color: #fff;
+ background-color: #218838;
+ border-color: #1e7e34; }
+
+.btn-success.focus, .btn-success:focus {
+ box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); }
+
+.btn-success.disabled, .btn-success:disabled {
+ color: #fff;
+ background-color: #28a745;
+ border-color: #28a745; }
+
+.btn-success:not(:disabled):not(.disabled).active, .btn-success:not(:disabled):not(.disabled):active, .show > .btn-success.dropdown-toggle {
+ color: #fff;
+ background-color: #1e7e34;
+ border-color: #1c7430; }
+
+.btn-success:not(:disabled):not(.disabled).active:focus, .btn-success:not(:disabled):not(.disabled):active:focus, .show > .btn-success.dropdown-toggle:focus {
+ box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); }
+
+.btn-info {
+ color: #fff;
+ background-color: #17a2b8;
+ border-color: #17a2b8; }
+
+.btn-info:hover {
+ color: #fff;
+ background-color: #138496;
+ border-color: #117a8b; }
+
+.btn-info.focus, .btn-info:focus {
+ box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); }
+
+.btn-info.disabled, .btn-info:disabled {
+ color: #fff;
+ background-color: #17a2b8;
+ border-color: #17a2b8; }
+
+.btn-info:not(:disabled):not(.disabled).active, .btn-info:not(:disabled):not(.disabled):active, .show > .btn-info.dropdown-toggle {
+ color: #fff;
+ background-color: #117a8b;
+ border-color: #10707f; }
+
+.btn-info:not(:disabled):not(.disabled).active:focus, .btn-info:not(:disabled):not(.disabled):active:focus, .show > .btn-info.dropdown-toggle:focus {
+ box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); }
+
+.btn-warning {
+ color: #212529;
+ background-color: #ffc107;
+ border-color: #ffc107; }
+
+.btn-warning:hover {
+ color: #212529;
+ background-color: #e0a800;
+ border-color: #d39e00; }
+
+.btn-warning.focus, .btn-warning:focus {
+ box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); }
+
+.btn-warning.disabled, .btn-warning:disabled {
+ color: #212529;
+ background-color: #ffc107;
+ border-color: #ffc107; }
+
+.btn-warning:not(:disabled):not(.disabled).active, .btn-warning:not(:disabled):not(.disabled):active, .show > .btn-warning.dropdown-toggle {
+ color: #212529;
+ background-color: #d39e00;
+ border-color: #c69500; }
+
+.btn-warning:not(:disabled):not(.disabled).active:focus, .btn-warning:not(:disabled):not(.disabled):active:focus, .show > .btn-warning.dropdown-toggle:focus {
+ box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); }
+
+.btn-danger {
+ color: #fff;
+ background-color: #dc3545;
+ border-color: #dc3545; }
+
+.btn-danger:hover {
+ color: #fff;
+ background-color: #c82333;
+ border-color: #bd2130; }
+
+.btn-danger.focus, .btn-danger:focus {
+ box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); }
+
+.btn-danger.disabled, .btn-danger:disabled {
+ color: #fff;
+ background-color: #dc3545;
+ border-color: #dc3545; }
+
+.btn-danger:not(:disabled):not(.disabled).active, .btn-danger:not(:disabled):not(.disabled):active, .show > .btn-danger.dropdown-toggle {
+ color: #fff;
+ background-color: #bd2130;
+ border-color: #b21f2d; }
+
+.btn-danger:not(:disabled):not(.disabled).active:focus, .btn-danger:not(:disabled):not(.disabled):active:focus, .show > .btn-danger.dropdown-toggle:focus {
+ box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); }
+
+.btn-light {
+ color: #212529;
+ background-color: #f8f9fa;
+ border-color: #f8f9fa; }
+
+.btn-light:hover {
+ color: #212529;
+ background-color: #e2e6ea;
+ border-color: #dae0e5; }
+
+.btn-light.focus, .btn-light:focus {
+ box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); }
+
+.btn-light.disabled, .btn-light:disabled {
+ color: #212529;
+ background-color: #f8f9fa;
+ border-color: #f8f9fa; }
+
+.btn-light:not(:disabled):not(.disabled).active, .btn-light:not(:disabled):not(.disabled):active, .show > .btn-light.dropdown-toggle {
+ color: #212529;
+ background-color: #dae0e5;
+ border-color: #d3d9df; }
+
+.btn-light:not(:disabled):not(.disabled).active:focus, .btn-light:not(:disabled):not(.disabled):active:focus, .show > .btn-light.dropdown-toggle:focus {
+ box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); }
+
+.btn-dark {
+ color: #fff;
+ background-color: #343a40;
+ border-color: #343a40; }
+
+.btn-dark:hover {
+ color: #fff;
+ background-color: #23272b;
+ border-color: #1d2124; }
+
+.btn-dark.focus, .btn-dark:focus {
+ box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); }
+
+.btn-dark.disabled, .btn-dark:disabled {
+ color: #fff;
+ background-color: #343a40;
+ border-color: #343a40; }
+
+.btn-dark:not(:disabled):not(.disabled).active, .btn-dark:not(:disabled):not(.disabled):active, .show > .btn-dark.dropdown-toggle {
+ color: #fff;
+ background-color: #1d2124;
+ border-color: #171a1d; }
+
+.btn-dark:not(:disabled):not(.disabled).active:focus, .btn-dark:not(:disabled):not(.disabled):active:focus, .show > .btn-dark.dropdown-toggle:focus {
+ box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); }
+
+.btn-outline-primary {
+ color: #007bff;
+ background-color: transparent;
+ background-image: none;
+ border-color: #007bff; }
+
+.btn-outline-primary:hover {
+ color: #fff;
+ background-color: #007bff;
+ border-color: #007bff; }
+
+.btn-outline-primary.focus, .btn-outline-primary:focus {
+ box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5); }
+
+.btn-outline-primary.disabled, .btn-outline-primary:disabled {
+ color: #007bff;
+ background-color: transparent; }
+
+.btn-outline-primary:not(:disabled):not(.disabled).active, .btn-outline-primary:not(:disabled):not(.disabled):active, .show > .btn-outline-primary.dropdown-toggle {
+ color: #fff;
+ background-color: #007bff;
+ border-color: #007bff; }
+
+.btn-outline-primary:not(:disabled):not(.disabled).active:focus, .btn-outline-primary:not(:disabled):not(.disabled):active:focus, .show > .btn-outline-primary.dropdown-toggle:focus {
+ box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5); }
+
+.btn-outline-secondary {
+ color: #6c757d;
+ background-color: transparent;
+ background-image: none;
+ border-color: #6c757d; }
+
+.btn-outline-secondary:hover {
+ color: #fff;
+ background-color: #6c757d;
+ border-color: #6c757d; }
+
+.btn-outline-secondary.focus, .btn-outline-secondary:focus {
+ box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); }
+
+.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {
+ color: #6c757d;
+ background-color: transparent; }
+
+.btn-outline-secondary:not(:disabled):not(.disabled).active, .btn-outline-secondary:not(:disabled):not(.disabled):active, .show > .btn-outline-secondary.dropdown-toggle {
+ color: #fff;
+ background-color: #6c757d;
+ border-color: #6c757d; }
+
+.btn-outline-secondary:not(:disabled):not(.disabled).active:focus, .btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .show > .btn-outline-secondary.dropdown-toggle:focus {
+ box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); }
+
+.btn-outline-success {
+ color: #28a745;
+ background-color: transparent;
+ background-image: none;
+ border-color: #28a745; }
+
+.btn-outline-success:hover {
+ color: #fff;
+ background-color: #28a745;
+ border-color: #28a745; }
+
+.btn-outline-success.focus, .btn-outline-success:focus {
+ box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); }
+
+.btn-outline-success.disabled, .btn-outline-success:disabled {
+ color: #28a745;
+ background-color: transparent; }
+
+.btn-outline-success:not(:disabled):not(.disabled).active, .btn-outline-success:not(:disabled):not(.disabled):active, .show > .btn-outline-success.dropdown-toggle {
+ color: #fff;
+ background-color: #28a745;
+ border-color: #28a745; }
+
+.btn-outline-success:not(:disabled):not(.disabled).active:focus, .btn-outline-success:not(:disabled):not(.disabled):active:focus, .show > .btn-outline-success.dropdown-toggle:focus {
+ box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); }
+
+.btn-outline-info {
+ color: #17a2b8;
+ background-color: transparent;
+ background-image: none;
+ border-color: #17a2b8; }
+
+.btn-outline-info:hover {
+ color: #fff;
+ background-color: #17a2b8;
+ border-color: #17a2b8; }
+
+.btn-outline-info.focus, .btn-outline-info:focus {
+ box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); }
+
+.btn-outline-info.disabled, .btn-outline-info:disabled {
+ color: #17a2b8;
+ background-color: transparent; }
+
+.btn-outline-info:not(:disabled):not(.disabled).active, .btn-outline-info:not(:disabled):not(.disabled):active, .show > .btn-outline-info.dropdown-toggle {
+ color: #fff;
+ background-color: #17a2b8;
+ border-color: #17a2b8; }
+
+.btn-outline-info:not(:disabled):not(.disabled).active:focus, .btn-outline-info:not(:disabled):not(.disabled):active:focus, .show > .btn-outline-info.dropdown-toggle:focus {
+ box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); }
+
+.btn-outline-warning {
+ color: #ffc107;
+ background-color: transparent;
+ background-image: none;
+ border-color: #ffc107; }
+
+.btn-outline-warning:hover {
+ color: #212529;
+ background-color: #ffc107;
+ border-color: #ffc107; }
+
+.btn-outline-warning.focus, .btn-outline-warning:focus {
+ box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); }
+
+.btn-outline-warning.disabled, .btn-outline-warning:disabled {
+ color: #ffc107;
+ background-color: transparent; }
+
+.btn-outline-warning:not(:disabled):not(.disabled).active, .btn-outline-warning:not(:disabled):not(.disabled):active, .show > .btn-outline-warning.dropdown-toggle {
+ color: #212529;
+ background-color: #ffc107;
+ border-color: #ffc107; }
+
+.btn-outline-warning:not(:disabled):not(.disabled).active:focus, .btn-outline-warning:not(:disabled):not(.disabled):active:focus, .show > .btn-outline-warning.dropdown-toggle:focus {
+ box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); }
+
+.btn-outline-danger {
+ color: #dc3545;
+ background-color: transparent;
+ background-image: none;
+ border-color: #dc3545; }
+
+.btn-outline-danger:hover {
+ color: #fff;
+ background-color: #dc3545;
+ border-color: #dc3545; }
+
+.btn-outline-danger.focus, .btn-outline-danger:focus {
+ box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); }
+
+.btn-outline-danger.disabled, .btn-outline-danger:disabled {
+ color: #dc3545;
+ background-color: transparent; }
+
+.btn-outline-danger:not(:disabled):not(.disabled).active, .btn-outline-danger:not(:disabled):not(.disabled):active, .show > .btn-outline-danger.dropdown-toggle {
+ color: #fff;
+ background-color: #dc3545;
+ border-color: #dc3545; }
+
+.btn-outline-danger:not(:disabled):not(.disabled).active:focus, .btn-outline-danger:not(:disabled):not(.disabled):active:focus, .show > .btn-outline-danger.dropdown-toggle:focus {
+ box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); }
+
+.btn-outline-light {
+ color: #f8f9fa;
+ background-color: transparent;
+ background-image: none;
+ border-color: #f8f9fa; }
+
+.btn-outline-light:hover {
+ color: #212529;
+ background-color: #f8f9fa;
+ border-color: #f8f9fa; }
+
+.btn-outline-light.focus, .btn-outline-light:focus {
+ box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); }
+
+.btn-outline-light.disabled, .btn-outline-light:disabled {
+ color: #f8f9fa;
+ background-color: transparent; }
+
+.btn-outline-light:not(:disabled):not(.disabled).active, .btn-outline-light:not(:disabled):not(.disabled):active, .show > .btn-outline-light.dropdown-toggle {
+ color: #212529;
+ background-color: #f8f9fa;
+ border-color: #f8f9fa; }
+
+.btn-outline-light:not(:disabled):not(.disabled).active:focus, .btn-outline-light:not(:disabled):not(.disabled):active:focus, .show > .btn-outline-light.dropdown-toggle:focus {
+ box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); }
+
+.btn-outline-dark {
+ color: #343a40;
+ background-color: transparent;
+ background-image: none;
+ border-color: #343a40; }
+
+.btn-outline-dark:hover {
+ color: #fff;
+ background-color: #343a40;
+ border-color: #343a40; }
+
+.btn-outline-dark.focus, .btn-outline-dark:focus {
+ box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); }
+
+.btn-outline-dark.disabled, .btn-outline-dark:disabled {
+ color: #343a40;
+ background-color: transparent; }
+
+.btn-outline-dark:not(:disabled):not(.disabled).active, .btn-outline-dark:not(:disabled):not(.disabled):active, .show > .btn-outline-dark.dropdown-toggle {
+ color: #fff;
+ background-color: #343a40;
+ border-color: #343a40; }
+
+.btn-outline-dark:not(:disabled):not(.disabled).active:focus, .btn-outline-dark:not(:disabled):not(.disabled):active:focus, .show > .btn-outline-dark.dropdown-toggle:focus {
+ box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); }
+
+.btn-link {
+ font-weight: 400;
+ color: #007bff;
+ background-color: transparent; }
+
+.btn-link:hover {
+ color: #0056b3;
+ text-decoration: underline;
+ background-color: transparent;
+ border-color: transparent; }
+
+.btn-link.focus, .btn-link:focus {
+ text-decoration: underline;
+ border-color: transparent;
+ box-shadow: none; }
+
+.btn-link.disabled, .btn-link:disabled {
+ color: #6c757d; }
+
+.btn-group-lg > .btn, .btn-lg {
+ padding: .5rem 1rem;
+ font-size: 1.25rem;
+ line-height: 1.5;
+ border-radius: .3rem; }
+
+.btn-group-sm > .btn, .btn-sm {
+ padding: .25rem .5rem;
+ font-size: .875rem;
+ line-height: 1.5;
+ border-radius: .2rem; }
+
+.btn-block {
+ display: block;
+ width: 100%; }
+
+.btn-block + .btn-block {
+ margin-top: .5rem; }
+
+input[type=button].btn-block, input[type=reset].btn-block, input[type=submit].btn-block {
+ width: 100%; }
+
+.fade {
+ opacity: 0;
+ transition: opacity .15s linear; }
+
+.fade.show {
+ opacity: 1; }
+
+.collapse {
+ display: none; }
+
+.collapse.show {
+ display: block; }
+
+tr.collapse.show {
+ display: table-row; }
+
+tbody.collapse.show {
+ display: table-row-group; }
+
+.collapsing {
+ position: relative;
+ height: 0;
+ overflow: hidden;
+ transition: height .35s ease; }
+
+.dropdown, .dropup {
+ position: relative; }
+
+.dropdown-toggle::after {
+ display: inline-block;
+ width: 0;
+ height: 0;
+ margin-left: .255em;
+ vertical-align: .255em;
+ content: "";
+ border-top: .3em solid;
+ border-right: .3em solid transparent;
+ border-bottom: 0;
+ border-left: .3em solid transparent; }
+
+.dropdown-toggle:empty::after {
+ margin-left: 0; }
+
+.dropdown-menu {
+ position: absolute;
+ top: 100%;
+ left: 0;
+ z-index: 1000;
+ display: none;
+ float: left;
+ min-width: 10rem;
+ padding: .5rem 0;
+ margin: .125rem 0 0;
+ font-size: 1rem;
+ color: #212529;
+ text-align: left;
+ list-style: none;
+ background-color: #fff;
+ background-clip: padding-box;
+ border: 1px solid rgba(0, 0, 0, 0.15);
+ border-radius: .25rem; }
+
+.dropup .dropdown-menu {
+ margin-top: 0;
+ margin-bottom: .125rem; }
+
+.dropup .dropdown-toggle::after {
+ display: inline-block;
+ width: 0;
+ height: 0;
+ margin-left: .255em;
+ vertical-align: .255em;
+ content: "";
+ border-top: 0;
+ border-right: .3em solid transparent;
+ border-bottom: .3em solid;
+ border-left: .3em solid transparent; }
+
+.dropup .dropdown-toggle:empty::after {
+ margin-left: 0; }
+
+.dropright .dropdown-menu {
+ margin-top: 0;
+ margin-left: .125rem; }
+
+.dropright .dropdown-toggle::after {
+ display: inline-block;
+ width: 0;
+ height: 0;
+ margin-left: .255em;
+ vertical-align: .255em;
+ content: "";
+ border-top: .3em solid transparent;
+ border-bottom: .3em solid transparent;
+ border-left: .3em solid; }
+
+.dropright .dropdown-toggle:empty::after {
+ margin-left: 0; }
+
+.dropright .dropdown-toggle::after {
+ vertical-align: 0; }
+
+.dropleft .dropdown-menu {
+ margin-top: 0;
+ margin-right: .125rem; }
+
+.dropleft .dropdown-toggle::after {
+ display: inline-block;
+ width: 0;
+ height: 0;
+ margin-left: .255em;
+ vertical-align: .255em;
+ content: ""; }
+
+.dropleft .dropdown-toggle::after {
+ display: none; }
+
+.dropleft .dropdown-toggle::before {
+ display: inline-block;
+ width: 0;
+ height: 0;
+ margin-right: .255em;
+ vertical-align: .255em;
+ content: "";
+ border-top: .3em solid transparent;
+ border-right: .3em solid;
+ border-bottom: .3em solid transparent; }
+
+.dropleft .dropdown-toggle:empty::after {
+ margin-left: 0; }
+
+.dropleft .dropdown-toggle::before {
+ vertical-align: 0; }
+
+.dropdown-divider {
+ height: 0;
+ margin: .5rem 0;
+ overflow: hidden;
+ border-top: 1px solid #e9ecef; }
+
+.dropdown-item {
+ display: block;
+ width: 100%;
+ padding: .25rem 1.5rem;
+ clear: both;
+ font-weight: 400;
+ color: #212529;
+ text-align: inherit;
+ white-space: nowrap;
+ background-color: transparent;
+ border: 0; }
+
+.dropdown-item:focus, .dropdown-item:hover {
+ color: #16181b;
+ text-decoration: none;
+ background-color: #f8f9fa; }
+
+.dropdown-item.active, .dropdown-item:active {
+ color: #fff;
+ text-decoration: none;
+ background-color: #007bff; }
+
+.dropdown-item.disabled, .dropdown-item:disabled {
+ color: #6c757d;
+ background-color: transparent; }
+
+.dropdown-menu.show {
+ display: block; }
+
+.dropdown-header {
+ display: block;
+ padding: .5rem 1.5rem;
+ margin-bottom: 0;
+ font-size: .875rem;
+ color: #6c757d;
+ white-space: nowrap; }
+
+.btn-group, .btn-group-vertical {
+ position: relative;
+ display: -webkit-inline-box;
+ display: -ms-inline-flexbox;
+ display: inline-flex;
+ vertical-align: middle; }
+
+.btn-group-vertical > .btn, .btn-group > .btn {
+ position: relative;
+ -webkit-box-flex: 0;
+ -ms-flex: 0 1 auto;
+ flex: 0 1 auto; }
+
+.btn-group-vertical > .btn:hover, .btn-group > .btn:hover {
+ z-index: 1; }
+
+.btn-group-vertical > .btn.active, .btn-group-vertical > .btn:active, .btn-group-vertical > .btn:focus, .btn-group > .btn.active, .btn-group > .btn:active, .btn-group > .btn:focus {
+ z-index: 1; }
+
+.btn-group .btn + .btn, .btn-group .btn + .btn-group, .btn-group .btn-group + .btn, .btn-group .btn-group + .btn-group, .btn-group-vertical .btn + .btn, .btn-group-vertical .btn + .btn-group, .btn-group-vertical .btn-group + .btn, .btn-group-vertical .btn-group + .btn-group {
+ margin-left: -1px; }
+
+.btn-toolbar {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ -webkit-box-pack: start;
+ -ms-flex-pack: start;
+ justify-content: flex-start; }
+
+.btn-toolbar .input-group {
+ width: auto; }
+
+.btn-group > .btn:first-child {
+ margin-left: 0; }
+
+.btn-group > .btn-group:not(:last-child) > .btn, .btn-group > .btn:not(:last-child):not(.dropdown-toggle) {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0; }
+
+.btn-group > .btn-group:not(:first-child) > .btn, .btn-group > .btn:not(:first-child) {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0; }
+
+.dropdown-toggle-split {
+ padding-right: .5625rem;
+ padding-left: .5625rem; }
+
+.dropdown-toggle-split::after {
+ margin-left: 0; }
+
+.btn-group-sm > .btn + .dropdown-toggle-split, .btn-sm + .dropdown-toggle-split {
+ padding-right: .375rem;
+ padding-left: .375rem; }
+
+.btn-group-lg > .btn + .dropdown-toggle-split, .btn-lg + .dropdown-toggle-split {
+ padding-right: .75rem;
+ padding-left: .75rem; }
+
+.btn-group-vertical {
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ -webkit-box-align: start;
+ -ms-flex-align: start;
+ align-items: flex-start;
+ -webkit-box-pack: center;
+ -ms-flex-pack: center;
+ justify-content: center; }
+
+.btn-group-vertical .btn, .btn-group-vertical .btn-group {
+ width: 100%; }
+
+.btn-group-vertical > .btn + .btn, .btn-group-vertical > .btn + .btn-group, .btn-group-vertical > .btn-group + .btn, .btn-group-vertical > .btn-group + .btn-group {
+ margin-top: -1px;
+ margin-left: 0; }
+
+.btn-group-vertical > .btn-group:not(:last-child) > .btn, .btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle) {
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 0; }
+
+.btn-group-vertical > .btn-group:not(:first-child) > .btn, .btn-group-vertical > .btn:not(:first-child) {
+ border-top-left-radius: 0;
+ border-top-right-radius: 0; }
+
+.btn-group-toggle > .btn, .btn-group-toggle > .btn-group > .btn {
+ margin-bottom: 0; }
+
+.btn-group-toggle > .btn input[type=checkbox], .btn-group-toggle > .btn input[type=radio], .btn-group-toggle > .btn-group > .btn input[type=checkbox], .btn-group-toggle > .btn-group > .btn input[type=radio] {
+ position: absolute;
+ clip: rect(0, 0, 0, 0);
+ pointer-events: none; }
+
+.input-group {
+ position: relative;
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ -webkit-box-align: stretch;
+ -ms-flex-align: stretch;
+ align-items: stretch;
+ width: 100%; }
+
+.input-group > .custom-file, .input-group > .custom-select, .input-group > .form-control {
+ position: relative;
+ -webkit-box-flex: 1;
+ -ms-flex: 1 1 auto;
+ flex: 1 1 auto;
+ width: 1%;
+ margin-bottom: 0; }
+
+.input-group > .custom-file:focus, .input-group > .custom-select:focus, .input-group > .form-control:focus {
+ z-index: 3; }
+
+.input-group > .custom-file + .custom-file, .input-group > .custom-file + .custom-select, .input-group > .custom-file + .form-control, .input-group > .custom-select + .custom-file, .input-group > .custom-select + .custom-select, .input-group > .custom-select + .form-control, .input-group > .form-control + .custom-file, .input-group > .form-control + .custom-select, .input-group > .form-control + .form-control {
+ margin-left: -1px; }
+
+.input-group > .custom-select:not(:last-child), .input-group > .form-control:not(:last-child) {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0; }
+
+.input-group > .custom-select:not(:first-child), .input-group > .form-control:not(:first-child) {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0; }
+
+.input-group > .custom-file {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ align-items: center; }
+
+.input-group > .custom-file:not(:last-child) .custom-file-label, .input-group > .custom-file:not(:last-child) .custom-file-label::before {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0; }
+
+.input-group > .custom-file:not(:first-child) .custom-file-label, .input-group > .custom-file:not(:first-child) .custom-file-label::before {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0; }
+
+.input-group-append, .input-group-prepend {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex; }
+
+.input-group-append .btn, .input-group-prepend .btn {
+ position: relative;
+ z-index: 2; }
+
+.input-group-append .btn + .btn, .input-group-append .btn + .input-group-text, .input-group-append .input-group-text + .btn, .input-group-append .input-group-text + .input-group-text, .input-group-prepend .btn + .btn, .input-group-prepend .btn + .input-group-text, .input-group-prepend .input-group-text + .btn, .input-group-prepend .input-group-text + .input-group-text {
+ margin-left: -1px; }
+
+.input-group-prepend {
+ margin-right: -1px; }
+
+.input-group-append {
+ margin-left: -1px; }
+
+.input-group-text {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ align-items: center;
+ padding: .375rem .75rem;
+ margin-bottom: 0;
+ font-size: 1rem;
+ font-weight: 400;
+ line-height: 1.5;
+ color: #495057;
+ text-align: center;
+ white-space: nowrap;
+ background-color: #e9ecef;
+ border: 1px solid #ced4da;
+ border-radius: .25rem; }
+
+.input-group-text input[type=checkbox], .input-group-text input[type=radio] {
+ margin-top: 0; }
+
+.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle), .input-group > .input-group-append:last-child > .input-group-text:not(:last-child), .input-group > .input-group-append:not(:last-child) > .btn, .input-group > .input-group-append:not(:last-child) > .input-group-text, .input-group > .input-group-prepend > .btn, .input-group > .input-group-prepend > .input-group-text {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0; }
+
+.input-group > .input-group-append > .btn, .input-group > .input-group-append > .input-group-text, .input-group > .input-group-prepend:first-child > .btn:not(:first-child), .input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child), .input-group > .input-group-prepend:not(:first-child) > .btn, .input-group > .input-group-prepend:not(:first-child) > .input-group-text {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0; }
+
+.custom-control {
+ position: relative;
+ display: block;
+ min-height: 1.5rem;
+ padding-left: 1.5rem; }
+
+.custom-control-inline {
+ display: -webkit-inline-box;
+ display: -ms-inline-flexbox;
+ display: inline-flex;
+ margin-right: 1rem; }
+
+.custom-control-input {
+ position: absolute;
+ z-index: -1;
+ opacity: 0; }
+
+.custom-control-input:checked ~ .custom-control-label::before {
+ color: #fff;
+ background-color: #007bff; }
+
+.custom-control-input:focus ~ .custom-control-label::before {
+ box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25); }
+
+.custom-control-input:active ~ .custom-control-label::before {
+ color: #fff;
+ background-color: #b3d7ff; }
+
+.custom-control-input:disabled ~ .custom-control-label {
+ color: #6c757d; }
+
+.custom-control-input:disabled ~ .custom-control-label::before {
+ background-color: #e9ecef; }
+
+.custom-control-label {
+ margin-bottom: 0; }
+
+.custom-control-label::before {
+ position: absolute;
+ top: .25rem;
+ left: 0;
+ display: block;
+ width: 1rem;
+ height: 1rem;
+ pointer-events: none;
+ content: "";
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ background-color: #dee2e6; }
+
+.custom-control-label::after {
+ position: absolute;
+ top: .25rem;
+ left: 0;
+ display: block;
+ width: 1rem;
+ height: 1rem;
+ content: "";
+ background-repeat: no-repeat;
+ background-position: center center;
+ background-size: 50% 50%; }
+
+.custom-checkbox .custom-control-label::before {
+ border-radius: .25rem; }
+
+.custom-checkbox .custom-control-input:checked ~ .custom-control-label::before {
+ background-color: #007bff; }
+
+.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E"); }
+
+.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before {
+ background-color: #007bff; }
+
+.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E"); }
+
+.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before {
+ background-color: rgba(0, 123, 255, 0.5); }
+
+.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before {
+ background-color: rgba(0, 123, 255, 0.5); }
+
+.custom-radio .custom-control-label::before {
+ border-radius: 50%; }
+
+.custom-radio .custom-control-input:checked ~ .custom-control-label::before {
+ background-color: #007bff; }
+
+.custom-radio .custom-control-input:checked ~ .custom-control-label::after {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E"); }
+
+.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before {
+ background-color: rgba(0, 123, 255, 0.5); }
+
+.custom-select {
+ display: inline-block;
+ width: 100%;
+ height: calc(2.25rem + 2px);
+ padding: .375rem 1.75rem .375rem .75rem;
+ line-height: 1.5;
+ color: #495057;
+ vertical-align: middle;
+ background: #fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right 0.75rem center;
+ background-size: 8px 10px;
+ border: 1px solid #ced4da;
+ border-radius: .25rem;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none; }
+
+.custom-select:focus {
+ border-color: #80bdff;
+ outline: 0;
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075), 0 0 5px rgba(128, 189, 255, 0.5); }
+
+.custom-select:focus::-ms-value {
+ color: #495057;
+ background-color: #fff; }
+
+.custom-select[multiple], .custom-select[size]:not([size="1"]) {
+ height: auto;
+ padding-right: .75rem;
+ background-image: none; }
+
+.custom-select:disabled {
+ color: #6c757d;
+ background-color: #e9ecef; }
+
+.custom-select::-ms-expand {
+ opacity: 0; }
+
+.custom-select-sm {
+ height: calc(1.8125rem + 2px);
+ padding-top: .375rem;
+ padding-bottom: .375rem;
+ font-size: 75%; }
+
+.custom-select-lg {
+ height: calc(2.875rem + 2px);
+ padding-top: .375rem;
+ padding-bottom: .375rem;
+ font-size: 125%; }
+
+.custom-file {
+ position: relative;
+ display: inline-block;
+ width: 100%;
+ height: calc(2.25rem + 2px);
+ margin-bottom: 0; }
+
+.custom-file-input {
+ position: relative;
+ z-index: 2;
+ width: 100%;
+ height: calc(2.25rem + 2px);
+ margin: 0;
+ opacity: 0; }
+
+.custom-file-input:focus ~ .custom-file-control {
+ border-color: #80bdff;
+ box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); }
+
+.custom-file-input:focus ~ .custom-file-control::before {
+ border-color: #80bdff; }
+
+.custom-file-input:lang(en) ~ .custom-file-label::after {
+ content: "Browse"; }
+
+.custom-file-label {
+ position: absolute;
+ top: 0;
+ right: 0;
+ left: 0;
+ z-index: 1;
+ height: calc(2.25rem + 2px);
+ padding: .375rem .75rem;
+ line-height: 1.5;
+ color: #495057;
+ background-color: #fff;
+ border: 1px solid #ced4da;
+ border-radius: .25rem; }
+
+.custom-file-label::after {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ z-index: 3;
+ display: block;
+ height: calc(calc(2.25rem + 2px) - 1px * 2);
+ padding: .375rem .75rem;
+ line-height: 1.5;
+ color: #495057;
+ content: "Browse";
+ background-color: #e9ecef;
+ border-left: 1px solid #ced4da;
+ border-radius: 0 .25rem .25rem 0; }
+
+.nav {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ padding-left: 0;
+ margin-bottom: 0;
+ list-style: none; }
+
+.nav-link {
+ display: block;
+ padding: .5rem 1rem; }
+
+.nav-link:focus, .nav-link:hover {
+ text-decoration: none; }
+
+.nav-link.disabled {
+ color: #6c757d; }
+
+.nav-tabs {
+ border-bottom: 1px solid #dee2e6; }
+
+.nav-tabs .nav-item {
+ margin-bottom: -1px; }
+
+.nav-tabs .nav-link {
+ border: 1px solid transparent;
+ border-top-left-radius: .25rem;
+ border-top-right-radius: .25rem; }
+
+.nav-tabs .nav-link:focus, .nav-tabs .nav-link:hover {
+ border-color: #e9ecef #e9ecef #dee2e6; }
+
+.nav-tabs .nav-link.disabled {
+ color: #6c757d;
+ background-color: transparent;
+ border-color: transparent; }
+
+.nav-tabs .nav-item.show .nav-link, .nav-tabs .nav-link.active {
+ color: #495057;
+ background-color: #fff;
+ border-color: #dee2e6 #dee2e6 #fff; }
+
+.nav-tabs .dropdown-menu {
+ margin-top: -1px;
+ border-top-left-radius: 0;
+ border-top-right-radius: 0; }
+
+.nav-pills .nav-link {
+ border-radius: .25rem; }
+
+.nav-pills .nav-link.active, .nav-pills .show > .nav-link {
+ color: #fff;
+ background-color: #007bff; }
+
+.nav-fill .nav-item {
+ -webkit-box-flex: 1;
+ -ms-flex: 1 1 auto;
+ flex: 1 1 auto;
+ text-align: center; }
+
+.nav-justified .nav-item {
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -webkit-box-flex: 1;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ text-align: center; }
+
+.tab-content > .tab-pane {
+ display: none; }
+
+.tab-content > .active {
+ display: block; }
+
+.navbar {
+ position: relative;
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-box-pack: justify;
+ -ms-flex-pack: justify;
+ justify-content: space-between;
+ padding: .5rem 1rem; }
+
+.navbar > .container, .navbar > .container-fluid {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-box-pack: justify;
+ -ms-flex-pack: justify;
+ justify-content: space-between; }
+
+.navbar-brand {
+ display: inline-block;
+ padding-top: .3125rem;
+ padding-bottom: .3125rem;
+ margin-right: 1rem;
+ font-size: 1.25rem;
+ line-height: inherit;
+ white-space: nowrap; }
+
+.navbar-brand:focus, .navbar-brand:hover {
+ text-decoration: none; }
+
+.navbar-nav {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ padding-left: 0;
+ margin-bottom: 0;
+ list-style: none; }
+
+.navbar-nav .nav-link {
+ padding-right: 0;
+ padding-left: 0; }
+
+.navbar-nav .dropdown-menu {
+ position: static;
+ float: none; }
+
+.navbar-text {
+ display: inline-block;
+ padding-top: .5rem;
+ padding-bottom: .5rem; }
+
+.navbar-collapse {
+ -ms-flex-preferred-size: 100%;
+ flex-basis: 100%;
+ -webkit-box-flex: 1;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ align-items: center; }
+
+.navbar-toggler {
+ padding: .25rem .75rem;
+ font-size: 1.25rem;
+ line-height: 1;
+ background-color: transparent;
+ border: 1px solid transparent;
+ border-radius: .25rem; }
+
+.navbar-toggler:focus, .navbar-toggler:hover {
+ text-decoration: none; }
+
+.navbar-toggler:not(:disabled):not(.disabled) {
+ cursor: pointer; }
+
+.navbar-toggler-icon {
+ display: inline-block;
+ width: 1.5em;
+ height: 1.5em;
+ vertical-align: middle;
+ content: "";
+ background: no-repeat center center;
+ background-size: 100% 100%; }
+
+@media (max-width: 575.98px) {
+ .navbar-expand-sm > .container, .navbar-expand-sm > .container-fluid {
+ padding-right: 0;
+ padding-left: 0; } }
+
+@media (min-width: 576px) {
+ .navbar-expand-sm {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ -ms-flex-flow: row nowrap;
+ flex-flow: row nowrap;
+ -webkit-box-pack: start;
+ -ms-flex-pack: start;
+ justify-content: flex-start; }
+ .navbar-expand-sm .navbar-nav {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ -ms-flex-direction: row;
+ flex-direction: row; }
+ .navbar-expand-sm .navbar-nav .dropdown-menu {
+ position: absolute; }
+ .navbar-expand-sm .navbar-nav .dropdown-menu-right {
+ right: 0;
+ left: auto; }
+ .navbar-expand-sm .navbar-nav .nav-link {
+ padding-right: .5rem;
+ padding-left: .5rem; }
+ .navbar-expand-sm > .container, .navbar-expand-sm > .container-fluid {
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap; }
+ .navbar-expand-sm .navbar-collapse {
+ display: -webkit-box !important;
+ display: -ms-flexbox !important;
+ display: flex !important;
+ -ms-flex-preferred-size: auto;
+ flex-basis: auto; }
+ .navbar-expand-sm .navbar-toggler {
+ display: none; }
+ .navbar-expand-sm .dropup .dropdown-menu {
+ top: auto;
+ bottom: 100%; } }
+
+@media (max-width: 767.98px) {
+ .navbar-expand-md > .container, .navbar-expand-md > .container-fluid {
+ padding-right: 0;
+ padding-left: 0; } }
+
+@media (min-width: 768px) {
+ .navbar-expand-md {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ -ms-flex-flow: row nowrap;
+ flex-flow: row nowrap;
+ -webkit-box-pack: start;
+ -ms-flex-pack: start;
+ justify-content: flex-start; }
+ .navbar-expand-md .navbar-nav {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ -ms-flex-direction: row;
+ flex-direction: row; }
+ .navbar-expand-md .navbar-nav .dropdown-menu {
+ position: absolute; }
+ .navbar-expand-md .navbar-nav .dropdown-menu-right {
+ right: 0;
+ left: auto; }
+ .navbar-expand-md .navbar-nav .nav-link {
+ padding-right: .5rem;
+ padding-left: .5rem; }
+ .navbar-expand-md > .container, .navbar-expand-md > .container-fluid {
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap; }
+ .navbar-expand-md .navbar-collapse {
+ display: -webkit-box !important;
+ display: -ms-flexbox !important;
+ display: flex !important;
+ -ms-flex-preferred-size: auto;
+ flex-basis: auto; }
+ .navbar-expand-md .navbar-toggler {
+ display: none; }
+ .navbar-expand-md .dropup .dropdown-menu {
+ top: auto;
+ bottom: 100%; } }
+
+@media (max-width: 991.98px) {
+ .navbar-expand-lg > .container, .navbar-expand-lg > .container-fluid {
+ padding-right: 0;
+ padding-left: 0; } }
+
+@media (min-width: 992px) {
+ .navbar-expand-lg {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ -ms-flex-flow: row nowrap;
+ flex-flow: row nowrap;
+ -webkit-box-pack: start;
+ -ms-flex-pack: start;
+ justify-content: flex-start; }
+ .navbar-expand-lg .navbar-nav {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ -ms-flex-direction: row;
+ flex-direction: row; }
+ .navbar-expand-lg .navbar-nav .dropdown-menu {
+ position: absolute; }
+ .navbar-expand-lg .navbar-nav .dropdown-menu-right {
+ right: 0;
+ left: auto; }
+ .navbar-expand-lg .navbar-nav .nav-link {
+ padding-right: .5rem;
+ padding-left: .5rem; }
+ .navbar-expand-lg > .container, .navbar-expand-lg > .container-fluid {
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap; }
+ .navbar-expand-lg .navbar-collapse {
+ display: -webkit-box !important;
+ display: -ms-flexbox !important;
+ display: flex !important;
+ -ms-flex-preferred-size: auto;
+ flex-basis: auto; }
+ .navbar-expand-lg .navbar-toggler {
+ display: none; }
+ .navbar-expand-lg .dropup .dropdown-menu {
+ top: auto;
+ bottom: 100%; } }
+
+@media (max-width: 1199.98px) {
+ .navbar-expand-xl > .container, .navbar-expand-xl > .container-fluid {
+ padding-right: 0;
+ padding-left: 0; } }
+
+@media (min-width: 1200px) {
+ .navbar-expand-xl {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ -ms-flex-flow: row nowrap;
+ flex-flow: row nowrap;
+ -webkit-box-pack: start;
+ -ms-flex-pack: start;
+ justify-content: flex-start; }
+ .navbar-expand-xl .navbar-nav {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ -ms-flex-direction: row;
+ flex-direction: row; }
+ .navbar-expand-xl .navbar-nav .dropdown-menu {
+ position: absolute; }
+ .navbar-expand-xl .navbar-nav .dropdown-menu-right {
+ right: 0;
+ left: auto; }
+ .navbar-expand-xl .navbar-nav .nav-link {
+ padding-right: .5rem;
+ padding-left: .5rem; }
+ .navbar-expand-xl > .container, .navbar-expand-xl > .container-fluid {
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap; }
+ .navbar-expand-xl .navbar-collapse {
+ display: -webkit-box !important;
+ display: -ms-flexbox !important;
+ display: flex !important;
+ -ms-flex-preferred-size: auto;
+ flex-basis: auto; }
+ .navbar-expand-xl .navbar-toggler {
+ display: none; }
+ .navbar-expand-xl .dropup .dropdown-menu {
+ top: auto;
+ bottom: 100%; } }
+
+.navbar-expand {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ -ms-flex-flow: row nowrap;
+ flex-flow: row nowrap;
+ -webkit-box-pack: start;
+ -ms-flex-pack: start;
+ justify-content: flex-start; }
+
+.navbar-expand > .container, .navbar-expand > .container-fluid {
+ padding-right: 0;
+ padding-left: 0; }
+
+.navbar-expand .navbar-nav {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ -ms-flex-direction: row;
+ flex-direction: row; }
+
+.navbar-expand .navbar-nav .dropdown-menu {
+ position: absolute; }
+
+.navbar-expand .navbar-nav .dropdown-menu-right {
+ right: 0;
+ left: auto; }
+
+.navbar-expand .navbar-nav .nav-link {
+ padding-right: .5rem;
+ padding-left: .5rem; }
+
+.navbar-expand > .container, .navbar-expand > .container-fluid {
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap; }
+
+.navbar-expand .navbar-collapse {
+ display: -webkit-box !important;
+ display: -ms-flexbox !important;
+ display: flex !important;
+ -ms-flex-preferred-size: auto;
+ flex-basis: auto; }
+
+.navbar-expand .navbar-toggler {
+ display: none; }
+
+.navbar-expand .dropup .dropdown-menu {
+ top: auto;
+ bottom: 100%; }
+
+.navbar-light .navbar-brand {
+ color: rgba(0, 0, 0, 0.9); }
+
+.navbar-light .navbar-brand:focus, .navbar-light .navbar-brand:hover {
+ color: rgba(0, 0, 0, 0.9); }
+
+.navbar-light .navbar-nav .nav-link {
+ color: rgba(0, 0, 0, 0.5); }
+
+.navbar-light .navbar-nav .nav-link:focus, .navbar-light .navbar-nav .nav-link:hover {
+ color: rgba(0, 0, 0, 0.7); }
+
+.navbar-light .navbar-nav .nav-link.disabled {
+ color: rgba(0, 0, 0, 0.3); }
+
+.navbar-light .navbar-nav .active > .nav-link, .navbar-light .navbar-nav .nav-link.active, .navbar-light .navbar-nav .nav-link.show, .navbar-light .navbar-nav .show > .nav-link {
+ color: rgba(0, 0, 0, 0.9); }
+
+.navbar-light .navbar-toggler {
+ color: rgba(0, 0, 0, 0.5);
+ border-color: rgba(0, 0, 0, 0.1); }
+
+.navbar-light .navbar-toggler-icon {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E"); }
+
+.navbar-light .navbar-text {
+ color: rgba(0, 0, 0, 0.5); }
+
+.navbar-light .navbar-text a {
+ color: rgba(0, 0, 0, 0.9); }
+
+.navbar-light .navbar-text a:focus, .navbar-light .navbar-text a:hover {
+ color: rgba(0, 0, 0, 0.9); }
+
+.navbar-dark .navbar-brand {
+ color: #fff; }
+
+.navbar-dark .navbar-brand:focus, .navbar-dark .navbar-brand:hover {
+ color: #fff; }
+
+.navbar-dark .navbar-nav .nav-link {
+ color: rgba(255, 255, 255, 0.5); }
+
+.navbar-dark .navbar-nav .nav-link:focus, .navbar-dark .navbar-nav .nav-link:hover {
+ color: rgba(255, 255, 255, 0.75); }
+
+.navbar-dark .navbar-nav .nav-link.disabled {
+ color: rgba(255, 255, 255, 0.25); }
+
+.navbar-dark .navbar-nav .active > .nav-link, .navbar-dark .navbar-nav .nav-link.active, .navbar-dark .navbar-nav .nav-link.show, .navbar-dark .navbar-nav .show > .nav-link {
+ color: #fff; }
+
+.navbar-dark .navbar-toggler {
+ color: rgba(255, 255, 255, 0.5);
+ border-color: rgba(255, 255, 255, 0.1); }
+
+.navbar-dark .navbar-toggler-icon {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E"); }
+
+.navbar-dark .navbar-text {
+ color: rgba(255, 255, 255, 0.5); }
+
+.navbar-dark .navbar-text a {
+ color: #fff; }
+
+.navbar-dark .navbar-text a:focus, .navbar-dark .navbar-text a:hover {
+ color: #fff; }
+
+.card {
+ position: relative;
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ min-width: 0;
+ word-wrap: break-word;
+ background-color: #fff;
+ background-clip: border-box;
+ border: 1px solid rgba(0, 0, 0, 0.125);
+ border-radius: .25rem; }
+
+.card > hr {
+ margin-right: 0;
+ margin-left: 0; }
+
+.card > .list-group:first-child .list-group-item:first-child {
+ border-top-left-radius: .25rem;
+ border-top-right-radius: .25rem; }
+
+.card > .list-group:last-child .list-group-item:last-child {
+ border-bottom-right-radius: .25rem;
+ border-bottom-left-radius: .25rem; }
+
+.card-body {
+ -webkit-box-flex: 1;
+ -ms-flex: 1 1 auto;
+ flex: 1 1 auto;
+ padding: 1.25rem; }
+
+.card-title {
+ margin-bottom: .75rem; }
+
+.card-subtitle {
+ margin-top: -.375rem;
+ margin-bottom: 0; }
+
+.card-text:last-child {
+ margin-bottom: 0; }
+
+.card-link:hover {
+ text-decoration: none; }
+
+.card-link + .card-link {
+ margin-left: 1.25rem; }
+
+.card-header {
+ padding: .75rem 1.25rem;
+ margin-bottom: 0;
+ background-color: rgba(0, 0, 0, 0.03);
+ border-bottom: 1px solid rgba(0, 0, 0, 0.125); }
+
+.card-header:first-child {
+ border-radius: calc(.25rem - 1px) calc(.25rem - 1px) 0 0; }
+
+.card-header + .list-group .list-group-item:first-child {
+ border-top: 0; }
+
+.card-footer {
+ padding: .75rem 1.25rem;
+ background-color: rgba(0, 0, 0, 0.03);
+ border-top: 1px solid rgba(0, 0, 0, 0.125); }
+
+.card-footer:last-child {
+ border-radius: 0 0 calc(.25rem - 1px) calc(.25rem - 1px); }
+
+.card-header-tabs {
+ margin-right: -.625rem;
+ margin-bottom: -.75rem;
+ margin-left: -.625rem;
+ border-bottom: 0; }
+
+.card-header-pills {
+ margin-right: -.625rem;
+ margin-left: -.625rem; }
+
+.card-img-overlay {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ padding: 1.25rem; }
+
+.card-img {
+ width: 100%;
+ border-radius: calc(.25rem - 1px); }
+
+.card-img-top {
+ width: 100%;
+ border-top-left-radius: calc(.25rem - 1px);
+ border-top-right-radius: calc(.25rem - 1px); }
+
+.card-img-bottom {
+ width: 100%;
+ border-bottom-right-radius: calc(.25rem - 1px);
+ border-bottom-left-radius: calc(.25rem - 1px); }
+
+.card-deck {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ -ms-flex-direction: column;
+ flex-direction: column; }
+
+.card-deck .card {
+ margin-bottom: 15px; }
+
+@media (min-width: 576px) {
+ .card-deck {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ -ms-flex-flow: row wrap;
+ flex-flow: row wrap;
+ margin-right: -15px;
+ margin-left: -15px; }
+ .card-deck .card {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-flex: 1;
+ -ms-flex: 1 0 0%;
+ flex: 1 0 0%;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ margin-right: 15px;
+ margin-bottom: 0;
+ margin-left: 15px; } }
+
+.card-group {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ -ms-flex-direction: column;
+ flex-direction: column; }
+
+.card-group > .card {
+ margin-bottom: 15px; }
+
+@media (min-width: 576px) {
+ .card-group {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ -ms-flex-flow: row wrap;
+ flex-flow: row wrap; }
+ .card-group > .card {
+ -webkit-box-flex: 1;
+ -ms-flex: 1 0 0%;
+ flex: 1 0 0%;
+ margin-bottom: 0; }
+ .card-group > .card + .card {
+ margin-left: 0;
+ border-left: 0; }
+ .card-group > .card:first-child {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0; }
+ .card-group > .card:first-child .card-header, .card-group > .card:first-child .card-img-top {
+ border-top-right-radius: 0; }
+ .card-group > .card:first-child .card-footer, .card-group > .card:first-child .card-img-bottom {
+ border-bottom-right-radius: 0; }
+ .card-group > .card:last-child {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0; }
+ .card-group > .card:last-child .card-header, .card-group > .card:last-child .card-img-top {
+ border-top-left-radius: 0; }
+ .card-group > .card:last-child .card-footer, .card-group > .card:last-child .card-img-bottom {
+ border-bottom-left-radius: 0; }
+ .card-group > .card:only-child {
+ border-radius: .25rem; }
+ .card-group > .card:only-child .card-header, .card-group > .card:only-child .card-img-top {
+ border-top-left-radius: .25rem;
+ border-top-right-radius: .25rem; }
+ .card-group > .card:only-child .card-footer, .card-group > .card:only-child .card-img-bottom {
+ border-bottom-right-radius: .25rem;
+ border-bottom-left-radius: .25rem; }
+ .card-group > .card:not(:first-child):not(:last-child):not(:only-child) {
+ border-radius: 0; }
+ .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-footer, .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-header, .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom, .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-img-top {
+ border-radius: 0; } }
+
+.card-columns .card {
+ margin-bottom: .75rem; }
+
+@media (min-width: 576px) {
+ .card-columns {
+ -webkit-column-count: 3;
+ -moz-column-count: 3;
+ column-count: 3;
+ -webkit-column-gap: 1.25rem;
+ -moz-column-gap: 1.25rem;
+ column-gap: 1.25rem; }
+ .card-columns .card {
+ display: inline-block;
+ width: 100%; } }
+
+.breadcrumb {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ padding: .75rem 1rem;
+ margin-bottom: 1rem;
+ list-style: none;
+ background-color: #e9ecef;
+ border-radius: .25rem; }
+
+.breadcrumb-item + .breadcrumb-item::before {
+ display: inline-block;
+ padding-right: .5rem;
+ padding-left: .5rem;
+ color: #6c757d;
+ content: "/"; }
+
+.breadcrumb-item + .breadcrumb-item:hover::before {
+ text-decoration: underline; }
+
+.breadcrumb-item + .breadcrumb-item:hover::before {
+ text-decoration: none; }
+
+.breadcrumb-item.active {
+ color: #6c757d; }
+
+.pagination {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ padding-left: 0;
+ list-style: none;
+ border-radius: .25rem; }
+
+.page-link {
+ position: relative;
+ display: block;
+ padding: .5rem .75rem;
+ margin-left: -1px;
+ line-height: 1.25;
+ color: #007bff;
+ background-color: #fff;
+ border: 1px solid #dee2e6; }
+
+.page-link:hover {
+ color: #0056b3;
+ text-decoration: none;
+ background-color: #e9ecef;
+ border-color: #dee2e6; }
+
+.page-link:focus {
+ z-index: 2;
+ outline: 0;
+ box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); }
+
+.page-link:not(:disabled):not(.disabled) {
+ cursor: pointer; }
+
+.page-item:first-child .page-link {
+ margin-left: 0;
+ border-top-left-radius: .25rem;
+ border-bottom-left-radius: .25rem; }
+
+.page-item:last-child .page-link {
+ border-top-right-radius: .25rem;
+ border-bottom-right-radius: .25rem; }
+
+.page-item.active .page-link {
+ z-index: 1;
+ color: #fff;
+ background-color: #007bff;
+ border-color: #007bff; }
+
+.page-item.disabled .page-link {
+ color: #6c757d;
+ pointer-events: none;
+ cursor: auto;
+ background-color: #fff;
+ border-color: #dee2e6; }
+
+.pagination-lg .page-link {
+ padding: .75rem 1.5rem;
+ font-size: 1.25rem;
+ line-height: 1.5; }
+
+.pagination-lg .page-item:first-child .page-link {
+ border-top-left-radius: .3rem;
+ border-bottom-left-radius: .3rem; }
+
+.pagination-lg .page-item:last-child .page-link {
+ border-top-right-radius: .3rem;
+ border-bottom-right-radius: .3rem; }
+
+.pagination-sm .page-link {
+ padding: .25rem .5rem;
+ font-size: .875rem;
+ line-height: 1.5; }
+
+.pagination-sm .page-item:first-child .page-link {
+ border-top-left-radius: .2rem;
+ border-bottom-left-radius: .2rem; }
+
+.pagination-sm .page-item:last-child .page-link {
+ border-top-right-radius: .2rem;
+ border-bottom-right-radius: .2rem; }
+
+.badge {
+ display: inline-block;
+ padding: .25em .4em;
+ font-size: 75%;
+ font-weight: 700;
+ line-height: 1;
+ text-align: center;
+ white-space: nowrap;
+ vertical-align: baseline;
+ border-radius: .25rem; }
+
+.badge:empty {
+ display: none; }
+
+.btn .badge {
+ position: relative;
+ top: -1px; }
+
+.badge-pill {
+ padding-right: .6em;
+ padding-left: .6em;
+ border-radius: 10rem; }
+
+.badge-primary {
+ color: #fff;
+ background-color: #007bff; }
+
+.badge-primary[href]:focus, .badge-primary[href]:hover {
+ color: #fff;
+ text-decoration: none;
+ background-color: #0062cc; }
+
+.badge-secondary {
+ color: #fff;
+ background-color: #6c757d; }
+
+.badge-secondary[href]:focus, .badge-secondary[href]:hover {
+ color: #fff;
+ text-decoration: none;
+ background-color: #545b62; }
+
+.badge-success {
+ color: #fff;
+ background-color: #28a745; }
+
+.badge-success[href]:focus, .badge-success[href]:hover {
+ color: #fff;
+ text-decoration: none;
+ background-color: #1e7e34; }
+
+.badge-info {
+ color: #fff;
+ background-color: #17a2b8; }
+
+.badge-info[href]:focus, .badge-info[href]:hover {
+ color: #fff;
+ text-decoration: none;
+ background-color: #117a8b; }
+
+.badge-warning {
+ color: #212529;
+ background-color: #ffc107; }
+
+.badge-warning[href]:focus, .badge-warning[href]:hover {
+ color: #212529;
+ text-decoration: none;
+ background-color: #d39e00; }
+
+.badge-danger {
+ color: #fff;
+ background-color: #dc3545; }
+
+.badge-danger[href]:focus, .badge-danger[href]:hover {
+ color: #fff;
+ text-decoration: none;
+ background-color: #bd2130; }
+
+.badge-light {
+ color: #212529;
+ background-color: #f8f9fa; }
+
+.badge-light[href]:focus, .badge-light[href]:hover {
+ color: #212529;
+ text-decoration: none;
+ background-color: #dae0e5; }
+
+.badge-dark {
+ color: #fff;
+ background-color: #343a40; }
+
+.badge-dark[href]:focus, .badge-dark[href]:hover {
+ color: #fff;
+ text-decoration: none;
+ background-color: #1d2124; }
+
+.jumbotron {
+ padding: 2rem 1rem;
+ margin-bottom: 2rem;
+ background-color: #e9ecef;
+ border-radius: .3rem; }
+
+@media (min-width: 576px) {
+ .jumbotron {
+ padding: 4rem 2rem; } }
+
+.jumbotron-fluid {
+ padding-right: 0;
+ padding-left: 0;
+ border-radius: 0; }
+
+.alert {
+ position: relative;
+ padding: .75rem 1.25rem;
+ margin-bottom: 1rem;
+ border: 1px solid transparent;
+ border-radius: .25rem; }
+
+.alert-heading {
+ color: inherit; }
+
+.alert-link {
+ font-weight: 700; }
+
+.alert-dismissible {
+ padding-right: 4rem; }
+
+.alert-dismissible .close {
+ position: absolute;
+ top: 0;
+ right: 0;
+ padding: .75rem 1.25rem;
+ color: inherit; }
+
+.alert-primary {
+ color: #004085;
+ background-color: #cce5ff;
+ border-color: #b8daff; }
+
+.alert-primary hr {
+ border-top-color: #9fcdff; }
+
+.alert-primary .alert-link {
+ color: #002752; }
+
+.alert-secondary {
+ color: #383d41;
+ background-color: #e2e3e5;
+ border-color: #d6d8db; }
+
+.alert-secondary hr {
+ border-top-color: #c8cbcf; }
+
+.alert-secondary .alert-link {
+ color: #202326; }
+
+.alert-success {
+ color: #155724;
+ background-color: #d4edda;
+ border-color: #c3e6cb; }
+
+.alert-success hr {
+ border-top-color: #b1dfbb; }
+
+.alert-success .alert-link {
+ color: #0b2e13; }
+
+.alert-info {
+ color: #0c5460;
+ background-color: #d1ecf1;
+ border-color: #bee5eb; }
+
+.alert-info hr {
+ border-top-color: #abdde5; }
+
+.alert-info .alert-link {
+ color: #062c33; }
+
+.alert-warning {
+ color: #856404;
+ background-color: #fff3cd;
+ border-color: #ffeeba; }
+
+.alert-warning hr {
+ border-top-color: #ffe8a1; }
+
+.alert-warning .alert-link {
+ color: #533f03; }
+
+.alert-danger {
+ color: #721c24;
+ background-color: #f8d7da;
+ border-color: #f5c6cb; }
+
+.alert-danger hr {
+ border-top-color: #f1b0b7; }
+
+.alert-danger .alert-link {
+ color: #491217; }
+
+.alert-light {
+ color: #818182;
+ background-color: #fefefe;
+ border-color: #fdfdfe; }
+
+.alert-light hr {
+ border-top-color: #ececf6; }
+
+.alert-light .alert-link {
+ color: #686868; }
+
+.alert-dark {
+ color: #1b1e21;
+ background-color: #d6d8d9;
+ border-color: #c6c8ca; }
+
+.alert-dark hr {
+ border-top-color: #b9bbbe; }
+
+.alert-dark .alert-link {
+ color: #040505; }
+
+@-webkit-keyframes progress-bar-stripes {
+ from {
+ background-position: 1rem 0; }
+ to {
+ background-position: 0 0; } }
+
+@keyframes progress-bar-stripes {
+ from {
+ background-position: 1rem 0; }
+ to {
+ background-position: 0 0; } }
+
+.progress {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ height: 1rem;
+ overflow: hidden;
+ font-size: .75rem;
+ background-color: #e9ecef;
+ border-radius: .25rem; }
+
+.progress-bar {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ -webkit-box-pack: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+ color: #fff;
+ text-align: center;
+ background-color: #007bff;
+ transition: width .6s ease; }
+
+.progress-bar-striped {
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-size: 1rem 1rem; }
+
+.progress-bar-animated {
+ -webkit-animation: progress-bar-stripes 1s linear infinite;
+ animation: progress-bar-stripes 1s linear infinite; }
+
+.media {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-align: start;
+ -ms-flex-align: start;
+ align-items: flex-start; }
+
+.media-body {
+ -webkit-box-flex: 1;
+ -ms-flex: 1;
+ flex: 1; }
+
+.list-group {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ padding-left: 0;
+ margin-bottom: 0; }
+
+.list-group-item-action {
+ width: 100%;
+ color: #495057;
+ text-align: inherit; }
+
+.list-group-item-action:focus, .list-group-item-action:hover {
+ color: #495057;
+ text-decoration: none;
+ background-color: #f8f9fa; }
+
+.list-group-item-action:active {
+ color: #212529;
+ background-color: #e9ecef; }
+
+.list-group-item {
+ position: relative;
+ display: block;
+ padding: .75rem 1.25rem;
+ margin-bottom: -1px;
+ background-color: #fff;
+ border: 1px solid rgba(0, 0, 0, 0.125); }
+
+.list-group-item:first-child {
+ border-top-left-radius: .25rem;
+ border-top-right-radius: .25rem; }
+
+.list-group-item:last-child {
+ margin-bottom: 0;
+ border-bottom-right-radius: .25rem;
+ border-bottom-left-radius: .25rem; }
+
+.list-group-item:focus, .list-group-item:hover {
+ z-index: 1;
+ text-decoration: none; }
+
+.list-group-item.disabled, .list-group-item:disabled {
+ color: #6c757d;
+ background-color: #fff; }
+
+.list-group-item.active {
+ z-index: 2;
+ color: #fff;
+ background-color: #007bff;
+ border-color: #007bff; }
+
+.list-group-flush .list-group-item {
+ border-right: 0;
+ border-left: 0;
+ border-radius: 0; }
+
+.list-group-flush:first-child .list-group-item:first-child {
+ border-top: 0; }
+
+.list-group-flush:last-child .list-group-item:last-child {
+ border-bottom: 0; }
+
+.list-group-item-primary {
+ color: #004085;
+ background-color: #b8daff; }
+
+.list-group-item-primary.list-group-item-action:focus, .list-group-item-primary.list-group-item-action:hover {
+ color: #004085;
+ background-color: #9fcdff; }
+
+.list-group-item-primary.list-group-item-action.active {
+ color: #fff;
+ background-color: #004085;
+ border-color: #004085; }
+
+.list-group-item-secondary {
+ color: #383d41;
+ background-color: #d6d8db; }
+
+.list-group-item-secondary.list-group-item-action:focus, .list-group-item-secondary.list-group-item-action:hover {
+ color: #383d41;
+ background-color: #c8cbcf; }
+
+.list-group-item-secondary.list-group-item-action.active {
+ color: #fff;
+ background-color: #383d41;
+ border-color: #383d41; }
+
+.list-group-item-success {
+ color: #155724;
+ background-color: #c3e6cb; }
+
+.list-group-item-success.list-group-item-action:focus, .list-group-item-success.list-group-item-action:hover {
+ color: #155724;
+ background-color: #b1dfbb; }
+
+.list-group-item-success.list-group-item-action.active {
+ color: #fff;
+ background-color: #155724;
+ border-color: #155724; }
+
+.list-group-item-info {
+ color: #0c5460;
+ background-color: #bee5eb; }
+
+.list-group-item-info.list-group-item-action:focus, .list-group-item-info.list-group-item-action:hover {
+ color: #0c5460;
+ background-color: #abdde5; }
+
+.list-group-item-info.list-group-item-action.active {
+ color: #fff;
+ background-color: #0c5460;
+ border-color: #0c5460; }
+
+.list-group-item-warning {
+ color: #856404;
+ background-color: #ffeeba; }
+
+.list-group-item-warning.list-group-item-action:focus, .list-group-item-warning.list-group-item-action:hover {
+ color: #856404;
+ background-color: #ffe8a1; }
+
+.list-group-item-warning.list-group-item-action.active {
+ color: #fff;
+ background-color: #856404;
+ border-color: #856404; }
+
+.list-group-item-danger {
+ color: #721c24;
+ background-color: #f5c6cb; }
+
+.list-group-item-danger.list-group-item-action:focus, .list-group-item-danger.list-group-item-action:hover {
+ color: #721c24;
+ background-color: #f1b0b7; }
+
+.list-group-item-danger.list-group-item-action.active {
+ color: #fff;
+ background-color: #721c24;
+ border-color: #721c24; }
+
+.list-group-item-light {
+ color: #818182;
+ background-color: #fdfdfe; }
+
+.list-group-item-light.list-group-item-action:focus, .list-group-item-light.list-group-item-action:hover {
+ color: #818182;
+ background-color: #ececf6; }
+
+.list-group-item-light.list-group-item-action.active {
+ color: #fff;
+ background-color: #818182;
+ border-color: #818182; }
+
+.list-group-item-dark {
+ color: #1b1e21;
+ background-color: #c6c8ca; }
+
+.list-group-item-dark.list-group-item-action:focus, .list-group-item-dark.list-group-item-action:hover {
+ color: #1b1e21;
+ background-color: #b9bbbe; }
+
+.list-group-item-dark.list-group-item-action.active {
+ color: #fff;
+ background-color: #1b1e21;
+ border-color: #1b1e21; }
+
+.close {
+ float: right;
+ font-size: 1.5rem;
+ font-weight: 700;
+ line-height: 1;
+ color: #000;
+ text-shadow: 0 1px 0 #fff;
+ opacity: .5; }
+
+.close:focus, .close:hover {
+ color: #000;
+ text-decoration: none;
+ opacity: .75; }
+
+.close:not(:disabled):not(.disabled) {
+ cursor: pointer; }
+
+button.close {
+ padding: 0;
+ background-color: transparent;
+ border: 0;
+ -webkit-appearance: none; }
+
+.modal-open {
+ overflow: hidden; }
+
+.modal {
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1050;
+ display: none;
+ overflow: hidden;
+ outline: 0; }
+
+.modal-open .modal {
+ overflow-x: hidden;
+ overflow-y: auto; }
+
+.modal-dialog {
+ position: relative;
+ width: auto;
+ margin: .5rem;
+ pointer-events: none; }
+
+.modal.fade .modal-dialog {
+ transition: -webkit-transform .3s ease-out;
+ transition: transform .3s ease-out;
+ transition: transform .3s ease-out,-webkit-transform .3s ease-out;
+ -webkit-transform: translate(0, -25%);
+ transform: translate(0, -25%); }
+
+.modal.show .modal-dialog {
+ -webkit-transform: translate(0, 0);
+ transform: translate(0, 0); }
+
+.modal-dialog-centered {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ align-items: center;
+ min-height: calc(100% - (.5rem * 2)); }
+
+.modal-content {
+ position: relative;
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ width: 100%;
+ pointer-events: auto;
+ background-color: #fff;
+ background-clip: padding-box;
+ border: 1px solid rgba(0, 0, 0, 0.2);
+ border-radius: .3rem;
+ outline: 0; }
+
+.modal-backdrop {
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1040;
+ background-color: #000; }
+
+.modal-backdrop.fade {
+ opacity: 0; }
+
+.modal-backdrop.show {
+ opacity: .5; }
+
+.modal-header {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-align: start;
+ -ms-flex-align: start;
+ align-items: flex-start;
+ -webkit-box-pack: justify;
+ -ms-flex-pack: justify;
+ justify-content: space-between;
+ padding: 1rem;
+ border-bottom: 1px solid #e9ecef;
+ border-top-left-radius: .3rem;
+ border-top-right-radius: .3rem; }
+
+.modal-header .close {
+ padding: 1rem;
+ margin: -1rem -1rem -1rem auto; }
+
+.modal-title {
+ margin-bottom: 0;
+ line-height: 1.5; }
+
+.modal-body {
+ position: relative;
+ -webkit-box-flex: 1;
+ -ms-flex: 1 1 auto;
+ flex: 1 1 auto;
+ padding: 1rem; }
+
+.modal-footer {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-box-pack: end;
+ -ms-flex-pack: end;
+ justify-content: flex-end;
+ padding: 1rem;
+ border-top: 1px solid #e9ecef; }
+
+.modal-footer > :not(:first-child) {
+ margin-left: .25rem; }
+
+.modal-footer > :not(:last-child) {
+ margin-right: .25rem; }
+
+.modal-scrollbar-measure {
+ position: absolute;
+ top: -9999px;
+ width: 50px;
+ height: 50px;
+ overflow: scroll; }
+
+@media (min-width: 576px) {
+ .modal-dialog {
+ max-width: 500px;
+ margin: 1.75rem auto; }
+ .modal-dialog-centered {
+ min-height: calc(100% - (1.75rem * 2)); }
+ .modal-sm {
+ max-width: 300px; } }
+
+@media (min-width: 992px) {
+ .modal-lg {
+ max-width: 800px; } }
+
+.tooltip {
+ position: absolute;
+ z-index: 1070;
+ display: block;
+ margin: 0;
+ font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";
+ font-style: normal;
+ font-weight: 400;
+ line-height: 1.5;
+ text-align: left;
+ text-align: start;
+ text-decoration: none;
+ text-shadow: none;
+ text-transform: none;
+ letter-spacing: normal;
+ word-break: normal;
+ word-spacing: normal;
+ white-space: normal;
+ line-break: auto;
+ font-size: .875rem;
+ word-wrap: break-word;
+ opacity: 0; }
+
+.tooltip.show {
+ opacity: .9; }
+
+.tooltip .arrow {
+ position: absolute;
+ display: block;
+ width: .8rem;
+ height: .4rem; }
+
+.tooltip .arrow::before {
+ position: absolute;
+ content: "";
+ border-color: transparent;
+ border-style: solid; }
+
+.bs-tooltip-auto[x-placement^=top], .bs-tooltip-top {
+ padding: .4rem 0; }
+
+.bs-tooltip-auto[x-placement^=top] .arrow, .bs-tooltip-top .arrow {
+ bottom: 0; }
+
+.bs-tooltip-auto[x-placement^=top] .arrow::before, .bs-tooltip-top .arrow::before {
+ top: 0;
+ border-width: .4rem .4rem 0;
+ border-top-color: #000; }
+
+.bs-tooltip-auto[x-placement^=right], .bs-tooltip-right {
+ padding: 0 .4rem; }
+
+.bs-tooltip-auto[x-placement^=right] .arrow, .bs-tooltip-right .arrow {
+ left: 0;
+ width: .4rem;
+ height: .8rem; }
+
+.bs-tooltip-auto[x-placement^=right] .arrow::before, .bs-tooltip-right .arrow::before {
+ right: 0;
+ border-width: .4rem .4rem .4rem 0;
+ border-right-color: #000; }
+
+.bs-tooltip-auto[x-placement^=bottom], .bs-tooltip-bottom {
+ padding: .4rem 0; }
+
+.bs-tooltip-auto[x-placement^=bottom] .arrow, .bs-tooltip-bottom .arrow {
+ top: 0; }
+
+.bs-tooltip-auto[x-placement^=bottom] .arrow::before, .bs-tooltip-bottom .arrow::before {
+ bottom: 0;
+ border-width: 0 .4rem .4rem;
+ border-bottom-color: #000; }
+
+.bs-tooltip-auto[x-placement^=left], .bs-tooltip-left {
+ padding: 0 .4rem; }
+
+.bs-tooltip-auto[x-placement^=left] .arrow, .bs-tooltip-left .arrow {
+ right: 0;
+ width: .4rem;
+ height: .8rem; }
+
+.bs-tooltip-auto[x-placement^=left] .arrow::before, .bs-tooltip-left .arrow::before {
+ left: 0;
+ border-width: .4rem 0 .4rem .4rem;
+ border-left-color: #000; }
+
+.tooltip-inner {
+ max-width: 200px;
+ padding: .25rem .5rem;
+ color: #fff;
+ text-align: center;
+ background-color: #000;
+ border-radius: .25rem; }
+
+.popover {
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1060;
+ display: block;
+ max-width: 276px;
+ font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";
+ font-style: normal;
+ font-weight: 400;
+ line-height: 1.5;
+ text-align: left;
+ text-align: start;
+ text-decoration: none;
+ text-shadow: none;
+ text-transform: none;
+ letter-spacing: normal;
+ word-break: normal;
+ word-spacing: normal;
+ white-space: normal;
+ line-break: auto;
+ font-size: .875rem;
+ word-wrap: break-word;
+ background-color: #fff;
+ background-clip: padding-box;
+ border: 1px solid rgba(0, 0, 0, 0.2);
+ border-radius: .3rem; }
+
+.popover .arrow {
+ position: absolute;
+ display: block;
+ width: 1rem;
+ height: .5rem;
+ margin: 0 .3rem; }
+
+.popover .arrow::after, .popover .arrow::before {
+ position: absolute;
+ display: block;
+ content: "";
+ border-color: transparent;
+ border-style: solid; }
+
+.bs-popover-auto[x-placement^=top], .bs-popover-top {
+ margin-bottom: .5rem; }
+
+.bs-popover-auto[x-placement^=top] .arrow, .bs-popover-top .arrow {
+ bottom: calc((.5rem + 1px) * -1); }
+
+.bs-popover-auto[x-placement^=top] .arrow::after, .bs-popover-auto[x-placement^=top] .arrow::before, .bs-popover-top .arrow::after, .bs-popover-top .arrow::before {
+ border-width: .5rem .5rem 0; }
+
+.bs-popover-auto[x-placement^=top] .arrow::before, .bs-popover-top .arrow::before {
+ bottom: 0;
+ border-top-color: rgba(0, 0, 0, 0.25); }
+
+.bs-popover-auto[x-placement^=top] .arrow::after, .bs-popover-top .arrow::after {
+ bottom: 1px;
+ border-top-color: #fff; }
+
+.bs-popover-auto[x-placement^=right], .bs-popover-right {
+ margin-left: .5rem; }
+
+.bs-popover-auto[x-placement^=right] .arrow, .bs-popover-right .arrow {
+ left: calc((.5rem + 1px) * -1);
+ width: .5rem;
+ height: 1rem;
+ margin: .3rem 0; }
+
+.bs-popover-auto[x-placement^=right] .arrow::after, .bs-popover-auto[x-placement^=right] .arrow::before, .bs-popover-right .arrow::after, .bs-popover-right .arrow::before {
+ border-width: .5rem .5rem .5rem 0; }
+
+.bs-popover-auto[x-placement^=right] .arrow::before, .bs-popover-right .arrow::before {
+ left: 0;
+ border-right-color: rgba(0, 0, 0, 0.25); }
+
+.bs-popover-auto[x-placement^=right] .arrow::after, .bs-popover-right .arrow::after {
+ left: 1px;
+ border-right-color: #fff; }
+
+.bs-popover-auto[x-placement^=bottom], .bs-popover-bottom {
+ margin-top: .5rem; }
+
+.bs-popover-auto[x-placement^=bottom] .arrow, .bs-popover-bottom .arrow {
+ top: calc((.5rem + 1px) * -1); }
+
+.bs-popover-auto[x-placement^=bottom] .arrow::after, .bs-popover-auto[x-placement^=bottom] .arrow::before, .bs-popover-bottom .arrow::after, .bs-popover-bottom .arrow::before {
+ border-width: 0 .5rem .5rem .5rem; }
+
+.bs-popover-auto[x-placement^=bottom] .arrow::before, .bs-popover-bottom .arrow::before {
+ top: 0;
+ border-bottom-color: rgba(0, 0, 0, 0.25); }
+
+.bs-popover-auto[x-placement^=bottom] .arrow::after, .bs-popover-bottom .arrow::after {
+ top: 1px;
+ border-bottom-color: #fff; }
+
+.bs-popover-auto[x-placement^=bottom] .popover-header::before, .bs-popover-bottom .popover-header::before {
+ position: absolute;
+ top: 0;
+ left: 50%;
+ display: block;
+ width: 1rem;
+ margin-left: -.5rem;
+ content: "";
+ border-bottom: 1px solid #f7f7f7; }
+
+.bs-popover-auto[x-placement^=left], .bs-popover-left {
+ margin-right: .5rem; }
+
+.bs-popover-auto[x-placement^=left] .arrow, .bs-popover-left .arrow {
+ right: calc((.5rem + 1px) * -1);
+ width: .5rem;
+ height: 1rem;
+ margin: .3rem 0; }
+
+.bs-popover-auto[x-placement^=left] .arrow::after, .bs-popover-auto[x-placement^=left] .arrow::before, .bs-popover-left .arrow::after, .bs-popover-left .arrow::before {
+ border-width: .5rem 0 .5rem .5rem; }
+
+.bs-popover-auto[x-placement^=left] .arrow::before, .bs-popover-left .arrow::before {
+ right: 0;
+ border-left-color: rgba(0, 0, 0, 0.25); }
+
+.bs-popover-auto[x-placement^=left] .arrow::after, .bs-popover-left .arrow::after {
+ right: 1px;
+ border-left-color: #fff; }
+
+.popover-header {
+ padding: .5rem .75rem;
+ margin-bottom: 0;
+ font-size: 1rem;
+ color: inherit;
+ background-color: #f7f7f7;
+ border-bottom: 1px solid #ebebeb;
+ border-top-left-radius: calc(.3rem - 1px);
+ border-top-right-radius: calc(.3rem - 1px); }
+
+.popover-header:empty {
+ display: none; }
+
+.popover-body {
+ padding: .5rem .75rem;
+ color: #212529; }
+
+.carousel {
+ position: relative; }
+
+.carousel-inner {
+ position: relative;
+ width: 100%;
+ overflow: hidden; }
+
+.carousel-item {
+ position: relative;
+ display: none;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ align-items: center;
+ width: 100%;
+ transition: -webkit-transform .6s ease;
+ transition: transform .6s ease;
+ transition: transform .6s ease,-webkit-transform .6s ease;
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden;
+ -webkit-perspective: 1000px;
+ perspective: 1000px; }
+
+.carousel-item-next, .carousel-item-prev, .carousel-item.active {
+ display: block; }
+
+.carousel-item-next, .carousel-item-prev {
+ position: absolute;
+ top: 0; }
+
+.carousel-item-next.carousel-item-left, .carousel-item-prev.carousel-item-right {
+ -webkit-transform: translateX(0);
+ transform: translateX(0); }
+
+@supports (-webkit-transform-style: preserve-3d) or (transform-style: preserve-3d) {
+ .carousel-item-next.carousel-item-left, .carousel-item-prev.carousel-item-right {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0); } }
+
+.active.carousel-item-right, .carousel-item-next {
+ -webkit-transform: translateX(100%);
+ transform: translateX(100%); }
+
+@supports (-webkit-transform-style: preserve-3d) or (transform-style: preserve-3d) {
+ .active.carousel-item-right, .carousel-item-next {
+ -webkit-transform: translate3d(100%, 0, 0);
+ transform: translate3d(100%, 0, 0); } }
+
+.active.carousel-item-left, .carousel-item-prev {
+ -webkit-transform: translateX(-100%);
+ transform: translateX(-100%); }
+
+@supports (-webkit-transform-style: preserve-3d) or (transform-style: preserve-3d) {
+ .active.carousel-item-left, .carousel-item-prev {
+ -webkit-transform: translate3d(-100%, 0, 0);
+ transform: translate3d(-100%, 0, 0); } }
+
+.carousel-control-next, .carousel-control-prev {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-box-pack: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+ width: 15%;
+ color: #fff;
+ text-align: center;
+ opacity: .5; }
+
+.carousel-control-next:focus, .carousel-control-next:hover, .carousel-control-prev:focus, .carousel-control-prev:hover {
+ color: #fff;
+ text-decoration: none;
+ outline: 0;
+ opacity: .9; }
+
+.carousel-control-prev {
+ left: 0; }
+
+.carousel-control-next {
+ right: 0; }
+
+.carousel-control-next-icon, .carousel-control-prev-icon {
+ display: inline-block;
+ width: 20px;
+ height: 20px;
+ background: transparent no-repeat center center;
+ background-size: 100% 100%; }
+
+.carousel-control-prev-icon {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E"); }
+
+.carousel-control-next-icon {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E"); }
+
+.carousel-indicators {
+ position: absolute;
+ right: 0;
+ bottom: 10px;
+ left: 0;
+ z-index: 15;
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-pack: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+ padding-left: 0;
+ margin-right: 15%;
+ margin-left: 15%;
+ list-style: none; }
+
+.carousel-indicators li {
+ position: relative;
+ -webkit-box-flex: 0;
+ -ms-flex: 0 1 auto;
+ flex: 0 1 auto;
+ width: 30px;
+ height: 3px;
+ margin-right: 3px;
+ margin-left: 3px;
+ text-indent: -999px;
+ background-color: rgba(255, 255, 255, 0.5); }
+
+.carousel-indicators li::before {
+ position: absolute;
+ top: -10px;
+ left: 0;
+ display: inline-block;
+ width: 100%;
+ height: 10px;
+ content: ""; }
+
+.carousel-indicators li::after {
+ position: absolute;
+ bottom: -10px;
+ left: 0;
+ display: inline-block;
+ width: 100%;
+ height: 10px;
+ content: ""; }
+
+.carousel-indicators .active {
+ background-color: #fff; }
+
+.carousel-caption {
+ position: absolute;
+ right: 15%;
+ bottom: 20px;
+ left: 15%;
+ z-index: 10;
+ padding-top: 20px;
+ padding-bottom: 20px;
+ color: #fff;
+ text-align: center; }
+
+.align-baseline {
+ vertical-align: baseline !important; }
+
+.align-top {
+ vertical-align: top !important; }
+
+.align-middle {
+ vertical-align: middle !important; }
+
+.align-bottom {
+ vertical-align: bottom !important; }
+
+.align-text-bottom {
+ vertical-align: text-bottom !important; }
+
+.align-text-top {
+ vertical-align: text-top !important; }
+
+.bg-primary {
+ background-color: #007bff !important; }
+
+a.bg-primary:focus, a.bg-primary:hover, button.bg-primary:focus, button.bg-primary:hover {
+ background-color: #0062cc !important; }
+
+.bg-secondary {
+ background-color: #6c757d !important; }
+
+a.bg-secondary:focus, a.bg-secondary:hover, button.bg-secondary:focus, button.bg-secondary:hover {
+ background-color: #545b62 !important; }
+
+.bg-success {
+ background-color: #28a745 !important; }
+
+a.bg-success:focus, a.bg-success:hover, button.bg-success:focus, button.bg-success:hover {
+ background-color: #1e7e34 !important; }
+
+.bg-info {
+ background-color: #17a2b8 !important; }
+
+a.bg-info:focus, a.bg-info:hover, button.bg-info:focus, button.bg-info:hover {
+ background-color: #117a8b !important; }
+
+.bg-warning {
+ background-color: #ffc107 !important; }
+
+a.bg-warning:focus, a.bg-warning:hover, button.bg-warning:focus, button.bg-warning:hover {
+ background-color: #d39e00 !important; }
+
+.bg-danger {
+ background-color: #dc3545 !important; }
+
+a.bg-danger:focus, a.bg-danger:hover, button.bg-danger:focus, button.bg-danger:hover {
+ background-color: #bd2130 !important; }
+
+.bg-light {
+ background-color: #f8f9fa !important; }
+
+a.bg-light:focus, a.bg-light:hover, button.bg-light:focus, button.bg-light:hover {
+ background-color: #dae0e5 !important; }
+
+.bg-dark {
+ background-color: #343a40 !important; }
+
+a.bg-dark:focus, a.bg-dark:hover, button.bg-dark:focus, button.bg-dark:hover {
+ background-color: #1d2124 !important; }
+
+.bg-white {
+ background-color: #fff !important; }
+
+.bg-transparent {
+ background-color: transparent !important; }
+
+.border {
+ border: 1px solid #dee2e6 !important; }
+
+.border-top {
+ border-top: 1px solid #dee2e6 !important; }
+
+.border-right {
+ border-right: 1px solid #dee2e6 !important; }
+
+.border-bottom {
+ border-bottom: 1px solid #dee2e6 !important; }
+
+.border-left {
+ border-left: 1px solid #dee2e6 !important; }
+
+.border-0 {
+ border: 0 !important; }
+
+.border-top-0 {
+ border-top: 0 !important; }
+
+.border-right-0 {
+ border-right: 0 !important; }
+
+.border-bottom-0 {
+ border-bottom: 0 !important; }
+
+.border-left-0 {
+ border-left: 0 !important; }
+
+.border-primary {
+ border-color: #007bff !important; }
+
+.border-secondary {
+ border-color: #6c757d !important; }
+
+.border-success {
+ border-color: #28a745 !important; }
+
+.border-info {
+ border-color: #17a2b8 !important; }
+
+.border-warning {
+ border-color: #ffc107 !important; }
+
+.border-danger {
+ border-color: #dc3545 !important; }
+
+.border-light {
+ border-color: #f8f9fa !important; }
+
+.border-dark {
+ border-color: #343a40 !important; }
+
+.border-white {
+ border-color: #fff !important; }
+
+.rounded {
+ border-radius: 0.25rem !important; }
+
+.rounded-top {
+ border-top-left-radius: 0.25rem !important;
+ border-top-right-radius: 0.25rem !important; }
+
+.rounded-right {
+ border-top-right-radius: 0.25rem !important;
+ border-bottom-right-radius: 0.25rem !important; }
+
+.rounded-bottom {
+ border-bottom-right-radius: 0.25rem !important;
+ border-bottom-left-radius: 0.25rem !important; }
+
+.rounded-left {
+ border-top-left-radius: 0.25rem !important;
+ border-bottom-left-radius: 0.25rem !important; }
+
+.rounded-circle {
+ border-radius: 50% !important; }
+
+.rounded-0 {
+ border-radius: 0 !important; }
+
+.clearfix::after {
+ display: block;
+ clear: both;
+ content: ""; }
+
+.d-none {
+ display: none !important; }
+
+.d-inline {
+ display: inline !important; }
+
+.d-inline-block {
+ display: inline-block !important; }
+
+.d-block {
+ display: block !important; }
+
+.d-table {
+ display: table !important; }
+
+.d-table-row {
+ display: table-row !important; }
+
+.d-table-cell {
+ display: table-cell !important; }
+
+.d-flex {
+ display: -webkit-box !important;
+ display: -ms-flexbox !important;
+ display: flex !important; }
+
+.d-inline-flex {
+ display: -webkit-inline-box !important;
+ display: -ms-inline-flexbox !important;
+ display: inline-flex !important; }
+
+@media (min-width: 576px) {
+ .d-sm-none {
+ display: none !important; }
+ .d-sm-inline {
+ display: inline !important; }
+ .d-sm-inline-block {
+ display: inline-block !important; }
+ .d-sm-block {
+ display: block !important; }
+ .d-sm-table {
+ display: table !important; }
+ .d-sm-table-row {
+ display: table-row !important; }
+ .d-sm-table-cell {
+ display: table-cell !important; }
+ .d-sm-flex {
+ display: -webkit-box !important;
+ display: -ms-flexbox !important;
+ display: flex !important; }
+ .d-sm-inline-flex {
+ display: -webkit-inline-box !important;
+ display: -ms-inline-flexbox !important;
+ display: inline-flex !important; } }
+
+@media (min-width: 768px) {
+ .d-md-none {
+ display: none !important; }
+ .d-md-inline {
+ display: inline !important; }
+ .d-md-inline-block {
+ display: inline-block !important; }
+ .d-md-block {
+ display: block !important; }
+ .d-md-table {
+ display: table !important; }
+ .d-md-table-row {
+ display: table-row !important; }
+ .d-md-table-cell {
+ display: table-cell !important; }
+ .d-md-flex {
+ display: -webkit-box !important;
+ display: -ms-flexbox !important;
+ display: flex !important; }
+ .d-md-inline-flex {
+ display: -webkit-inline-box !important;
+ display: -ms-inline-flexbox !important;
+ display: inline-flex !important; } }
+
+@media (min-width: 992px) {
+ .d-lg-none {
+ display: none !important; }
+ .d-lg-inline {
+ display: inline !important; }
+ .d-lg-inline-block {
+ display: inline-block !important; }
+ .d-lg-block {
+ display: block !important; }
+ .d-lg-table {
+ display: table !important; }
+ .d-lg-table-row {
+ display: table-row !important; }
+ .d-lg-table-cell {
+ display: table-cell !important; }
+ .d-lg-flex {
+ display: -webkit-box !important;
+ display: -ms-flexbox !important;
+ display: flex !important; }
+ .d-lg-inline-flex {
+ display: -webkit-inline-box !important;
+ display: -ms-inline-flexbox !important;
+ display: inline-flex !important; } }
+
+@media (min-width: 1200px) {
+ .d-xl-none {
+ display: none !important; }
+ .d-xl-inline {
+ display: inline !important; }
+ .d-xl-inline-block {
+ display: inline-block !important; }
+ .d-xl-block {
+ display: block !important; }
+ .d-xl-table {
+ display: table !important; }
+ .d-xl-table-row {
+ display: table-row !important; }
+ .d-xl-table-cell {
+ display: table-cell !important; }
+ .d-xl-flex {
+ display: -webkit-box !important;
+ display: -ms-flexbox !important;
+ display: flex !important; }
+ .d-xl-inline-flex {
+ display: -webkit-inline-box !important;
+ display: -ms-inline-flexbox !important;
+ display: inline-flex !important; } }
+
+@media print {
+ .d-print-none {
+ display: none !important; }
+ .d-print-inline {
+ display: inline !important; }
+ .d-print-inline-block {
+ display: inline-block !important; }
+ .d-print-block {
+ display: block !important; }
+ .d-print-table {
+ display: table !important; }
+ .d-print-table-row {
+ display: table-row !important; }
+ .d-print-table-cell {
+ display: table-cell !important; }
+ .d-print-flex {
+ display: -webkit-box !important;
+ display: -ms-flexbox !important;
+ display: flex !important; }
+ .d-print-inline-flex {
+ display: -webkit-inline-box !important;
+ display: -ms-inline-flexbox !important;
+ display: inline-flex !important; } }
+
+.embed-responsive {
+ position: relative;
+ display: block;
+ width: 100%;
+ padding: 0;
+ overflow: hidden; }
+
+.embed-responsive::before {
+ display: block;
+ content: ""; }
+
+.embed-responsive .embed-responsive-item, .embed-responsive embed, .embed-responsive iframe, .embed-responsive object, .embed-responsive video {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ border: 0; }
+
+.embed-responsive-21by9::before {
+ padding-top: 42.857143%; }
+
+.embed-responsive-16by9::before {
+ padding-top: 56.25%; }
+
+.embed-responsive-4by3::before {
+ padding-top: 75%; }
+
+.embed-responsive-1by1::before {
+ padding-top: 100%; }
+
+.flex-row {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: normal !important;
+ -ms-flex-direction: row !important;
+ flex-direction: row !important; }
+
+.flex-column {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: normal !important;
+ -ms-flex-direction: column !important;
+ flex-direction: column !important; }
+
+.flex-row-reverse {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: reverse !important;
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important; }
+
+.flex-column-reverse {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: reverse !important;
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important; }
+
+.flex-wrap {
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important; }
+
+.flex-nowrap {
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important; }
+
+.flex-wrap-reverse {
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important; }
+
+.justify-content-start {
+ -webkit-box-pack: start !important;
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important; }
+
+.justify-content-end {
+ -webkit-box-pack: end !important;
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important; }
+
+.justify-content-center {
+ -webkit-box-pack: center !important;
+ -ms-flex-pack: center !important;
+ justify-content: center !important; }
+
+.justify-content-between {
+ -webkit-box-pack: justify !important;
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important; }
+
+.justify-content-around {
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important; }
+
+.align-items-start {
+ -webkit-box-align: start !important;
+ -ms-flex-align: start !important;
+ align-items: flex-start !important; }
+
+.align-items-end {
+ -webkit-box-align: end !important;
+ -ms-flex-align: end !important;
+ align-items: flex-end !important; }
+
+.align-items-center {
+ -webkit-box-align: center !important;
+ -ms-flex-align: center !important;
+ align-items: center !important; }
+
+.align-items-baseline {
+ -webkit-box-align: baseline !important;
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important; }
+
+.align-items-stretch {
+ -webkit-box-align: stretch !important;
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important; }
+
+.align-content-start {
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important; }
+
+.align-content-end {
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important; }
+
+.align-content-center {
+ -ms-flex-line-pack: center !important;
+ align-content: center !important; }
+
+.align-content-between {
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important; }
+
+.align-content-around {
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important; }
+
+.align-content-stretch {
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important; }
+
+.align-self-auto {
+ -ms-flex-item-align: auto !important;
+ align-self: auto !important; }
+
+.align-self-start {
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important; }
+
+.align-self-end {
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important; }
+
+.align-self-center {
+ -ms-flex-item-align: center !important;
+ align-self: center !important; }
+
+.align-self-baseline {
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important; }
+
+.align-self-stretch {
+ -ms-flex-item-align: stretch !important;
+ align-self: stretch !important; }
+
+@media (min-width: 576px) {
+ .flex-sm-row {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: normal !important;
+ -ms-flex-direction: row !important;
+ flex-direction: row !important; }
+ .flex-sm-column {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: normal !important;
+ -ms-flex-direction: column !important;
+ flex-direction: column !important; }
+ .flex-sm-row-reverse {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: reverse !important;
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important; }
+ .flex-sm-column-reverse {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: reverse !important;
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important; }
+ .flex-sm-wrap {
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important; }
+ .flex-sm-nowrap {
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important; }
+ .flex-sm-wrap-reverse {
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important; }
+ .justify-content-sm-start {
+ -webkit-box-pack: start !important;
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important; }
+ .justify-content-sm-end {
+ -webkit-box-pack: end !important;
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important; }
+ .justify-content-sm-center {
+ -webkit-box-pack: center !important;
+ -ms-flex-pack: center !important;
+ justify-content: center !important; }
+ .justify-content-sm-between {
+ -webkit-box-pack: justify !important;
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important; }
+ .justify-content-sm-around {
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important; }
+ .align-items-sm-start {
+ -webkit-box-align: start !important;
+ -ms-flex-align: start !important;
+ align-items: flex-start !important; }
+ .align-items-sm-end {
+ -webkit-box-align: end !important;
+ -ms-flex-align: end !important;
+ align-items: flex-end !important; }
+ .align-items-sm-center {
+ -webkit-box-align: center !important;
+ -ms-flex-align: center !important;
+ align-items: center !important; }
+ .align-items-sm-baseline {
+ -webkit-box-align: baseline !important;
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important; }
+ .align-items-sm-stretch {
+ -webkit-box-align: stretch !important;
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important; }
+ .align-content-sm-start {
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important; }
+ .align-content-sm-end {
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important; }
+ .align-content-sm-center {
+ -ms-flex-line-pack: center !important;
+ align-content: center !important; }
+ .align-content-sm-between {
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important; }
+ .align-content-sm-around {
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important; }
+ .align-content-sm-stretch {
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important; }
+ .align-self-sm-auto {
+ -ms-flex-item-align: auto !important;
+ align-self: auto !important; }
+ .align-self-sm-start {
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important; }
+ .align-self-sm-end {
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important; }
+ .align-self-sm-center {
+ -ms-flex-item-align: center !important;
+ align-self: center !important; }
+ .align-self-sm-baseline {
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important; }
+ .align-self-sm-stretch {
+ -ms-flex-item-align: stretch !important;
+ align-self: stretch !important; } }
+
+@media (min-width: 768px) {
+ .flex-md-row {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: normal !important;
+ -ms-flex-direction: row !important;
+ flex-direction: row !important; }
+ .flex-md-column {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: normal !important;
+ -ms-flex-direction: column !important;
+ flex-direction: column !important; }
+ .flex-md-row-reverse {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: reverse !important;
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important; }
+ .flex-md-column-reverse {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: reverse !important;
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important; }
+ .flex-md-wrap {
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important; }
+ .flex-md-nowrap {
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important; }
+ .flex-md-wrap-reverse {
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important; }
+ .justify-content-md-start {
+ -webkit-box-pack: start !important;
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important; }
+ .justify-content-md-end {
+ -webkit-box-pack: end !important;
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important; }
+ .justify-content-md-center {
+ -webkit-box-pack: center !important;
+ -ms-flex-pack: center !important;
+ justify-content: center !important; }
+ .justify-content-md-between {
+ -webkit-box-pack: justify !important;
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important; }
+ .justify-content-md-around {
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important; }
+ .align-items-md-start {
+ -webkit-box-align: start !important;
+ -ms-flex-align: start !important;
+ align-items: flex-start !important; }
+ .align-items-md-end {
+ -webkit-box-align: end !important;
+ -ms-flex-align: end !important;
+ align-items: flex-end !important; }
+ .align-items-md-center {
+ -webkit-box-align: center !important;
+ -ms-flex-align: center !important;
+ align-items: center !important; }
+ .align-items-md-baseline {
+ -webkit-box-align: baseline !important;
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important; }
+ .align-items-md-stretch {
+ -webkit-box-align: stretch !important;
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important; }
+ .align-content-md-start {
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important; }
+ .align-content-md-end {
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important; }
+ .align-content-md-center {
+ -ms-flex-line-pack: center !important;
+ align-content: center !important; }
+ .align-content-md-between {
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important; }
+ .align-content-md-around {
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important; }
+ .align-content-md-stretch {
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important; }
+ .align-self-md-auto {
+ -ms-flex-item-align: auto !important;
+ align-self: auto !important; }
+ .align-self-md-start {
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important; }
+ .align-self-md-end {
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important; }
+ .align-self-md-center {
+ -ms-flex-item-align: center !important;
+ align-self: center !important; }
+ .align-self-md-baseline {
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important; }
+ .align-self-md-stretch {
+ -ms-flex-item-align: stretch !important;
+ align-self: stretch !important; } }
+
+@media (min-width: 992px) {
+ .flex-lg-row {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: normal !important;
+ -ms-flex-direction: row !important;
+ flex-direction: row !important; }
+ .flex-lg-column {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: normal !important;
+ -ms-flex-direction: column !important;
+ flex-direction: column !important; }
+ .flex-lg-row-reverse {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: reverse !important;
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important; }
+ .flex-lg-column-reverse {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: reverse !important;
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important; }
+ .flex-lg-wrap {
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important; }
+ .flex-lg-nowrap {
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important; }
+ .flex-lg-wrap-reverse {
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important; }
+ .justify-content-lg-start {
+ -webkit-box-pack: start !important;
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important; }
+ .justify-content-lg-end {
+ -webkit-box-pack: end !important;
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important; }
+ .justify-content-lg-center {
+ -webkit-box-pack: center !important;
+ -ms-flex-pack: center !important;
+ justify-content: center !important; }
+ .justify-content-lg-between {
+ -webkit-box-pack: justify !important;
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important; }
+ .justify-content-lg-around {
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important; }
+ .align-items-lg-start {
+ -webkit-box-align: start !important;
+ -ms-flex-align: start !important;
+ align-items: flex-start !important; }
+ .align-items-lg-end {
+ -webkit-box-align: end !important;
+ -ms-flex-align: end !important;
+ align-items: flex-end !important; }
+ .align-items-lg-center {
+ -webkit-box-align: center !important;
+ -ms-flex-align: center !important;
+ align-items: center !important; }
+ .align-items-lg-baseline {
+ -webkit-box-align: baseline !important;
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important; }
+ .align-items-lg-stretch {
+ -webkit-box-align: stretch !important;
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important; }
+ .align-content-lg-start {
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important; }
+ .align-content-lg-end {
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important; }
+ .align-content-lg-center {
+ -ms-flex-line-pack: center !important;
+ align-content: center !important; }
+ .align-content-lg-between {
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important; }
+ .align-content-lg-around {
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important; }
+ .align-content-lg-stretch {
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important; }
+ .align-self-lg-auto {
+ -ms-flex-item-align: auto !important;
+ align-self: auto !important; }
+ .align-self-lg-start {
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important; }
+ .align-self-lg-end {
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important; }
+ .align-self-lg-center {
+ -ms-flex-item-align: center !important;
+ align-self: center !important; }
+ .align-self-lg-baseline {
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important; }
+ .align-self-lg-stretch {
+ -ms-flex-item-align: stretch !important;
+ align-self: stretch !important; } }
+
+@media (min-width: 1200px) {
+ .flex-xl-row {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: normal !important;
+ -ms-flex-direction: row !important;
+ flex-direction: row !important; }
+ .flex-xl-column {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: normal !important;
+ -ms-flex-direction: column !important;
+ flex-direction: column !important; }
+ .flex-xl-row-reverse {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: reverse !important;
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important; }
+ .flex-xl-column-reverse {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: reverse !important;
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important; }
+ .flex-xl-wrap {
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important; }
+ .flex-xl-nowrap {
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important; }
+ .flex-xl-wrap-reverse {
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important; }
+ .justify-content-xl-start {
+ -webkit-box-pack: start !important;
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important; }
+ .justify-content-xl-end {
+ -webkit-box-pack: end !important;
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important; }
+ .justify-content-xl-center {
+ -webkit-box-pack: center !important;
+ -ms-flex-pack: center !important;
+ justify-content: center !important; }
+ .justify-content-xl-between {
+ -webkit-box-pack: justify !important;
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important; }
+ .justify-content-xl-around {
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important; }
+ .align-items-xl-start {
+ -webkit-box-align: start !important;
+ -ms-flex-align: start !important;
+ align-items: flex-start !important; }
+ .align-items-xl-end {
+ -webkit-box-align: end !important;
+ -ms-flex-align: end !important;
+ align-items: flex-end !important; }
+ .align-items-xl-center {
+ -webkit-box-align: center !important;
+ -ms-flex-align: center !important;
+ align-items: center !important; }
+ .align-items-xl-baseline {
+ -webkit-box-align: baseline !important;
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important; }
+ .align-items-xl-stretch {
+ -webkit-box-align: stretch !important;
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important; }
+ .align-content-xl-start {
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important; }
+ .align-content-xl-end {
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important; }
+ .align-content-xl-center {
+ -ms-flex-line-pack: center !important;
+ align-content: center !important; }
+ .align-content-xl-between {
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important; }
+ .align-content-xl-around {
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important; }
+ .align-content-xl-stretch {
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important; }
+ .align-self-xl-auto {
+ -ms-flex-item-align: auto !important;
+ align-self: auto !important; }
+ .align-self-xl-start {
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important; }
+ .align-self-xl-end {
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important; }
+ .align-self-xl-center {
+ -ms-flex-item-align: center !important;
+ align-self: center !important; }
+ .align-self-xl-baseline {
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important; }
+ .align-self-xl-stretch {
+ -ms-flex-item-align: stretch !important;
+ align-self: stretch !important; } }
+
+.float-left {
+ float: left !important; }
+
+.float-right {
+ float: right !important; }
+
+.float-none {
+ float: none !important; }
+
+@media (min-width: 576px) {
+ .float-sm-left {
+ float: left !important; }
+ .float-sm-right {
+ float: right !important; }
+ .float-sm-none {
+ float: none !important; } }
+
+@media (min-width: 768px) {
+ .float-md-left {
+ float: left !important; }
+ .float-md-right {
+ float: right !important; }
+ .float-md-none {
+ float: none !important; } }
+
+@media (min-width: 992px) {
+ .float-lg-left {
+ float: left !important; }
+ .float-lg-right {
+ float: right !important; }
+ .float-lg-none {
+ float: none !important; } }
+
+@media (min-width: 1200px) {
+ .float-xl-left {
+ float: left !important; }
+ .float-xl-right {
+ float: right !important; }
+ .float-xl-none {
+ float: none !important; } }
+
+.position-static {
+ position: static !important; }
+
+.position-relative {
+ position: relative !important; }
+
+.position-absolute {
+ position: absolute !important; }
+
+.position-fixed {
+ position: fixed !important; }
+
+.position-sticky {
+ position: -webkit-sticky !important;
+ position: sticky !important; }
+
+.fixed-top {
+ position: fixed;
+ top: 0;
+ right: 0;
+ left: 0;
+ z-index: 1030; }
+
+.fixed-bottom {
+ position: fixed;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1030; }
+
+@supports (position: -webkit-sticky) or (position: sticky) {
+ .sticky-top {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0;
+ z-index: 1020; } }
+
+.sr-only {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ white-space: nowrap;
+ -webkit-clip-path: inset(50%);
+ clip-path: inset(50%);
+ border: 0; }
+
+.sr-only-focusable:active, .sr-only-focusable:focus {
+ position: static;
+ width: auto;
+ height: auto;
+ overflow: visible;
+ clip: auto;
+ white-space: normal;
+ -webkit-clip-path: none;
+ clip-path: none; }
+
+.w-25 {
+ width: 25% !important; }
+
+.w-50 {
+ width: 50% !important; }
+
+.w-75 {
+ width: 75% !important; }
+
+.w-100 {
+ width: 100% !important; }
+
+.h-25 {
+ height: 25% !important; }
+
+.h-50 {
+ height: 50% !important; }
+
+.h-75 {
+ height: 75% !important; }
+
+.h-100 {
+ height: 100% !important; }
+
+.mw-100 {
+ max-width: 100% !important; }
+
+.mh-100 {
+ max-height: 100% !important; }
+
+.m-0 {
+ margin: 0 !important; }
+
+.mt-0, .my-0 {
+ margin-top: 0 !important; }
+
+.mr-0, .mx-0 {
+ margin-right: 0 !important; }
+
+.mb-0, .my-0 {
+ margin-bottom: 0 !important; }
+
+.ml-0, .mx-0 {
+ margin-left: 0 !important; }
+
+.m-1 {
+ margin: 0.25rem !important; }
+
+.mt-1, .my-1 {
+ margin-top: 0.25rem !important; }
+
+.mr-1, .mx-1 {
+ margin-right: 0.25rem !important; }
+
+.mb-1, .my-1 {
+ margin-bottom: 0.25rem !important; }
+
+.ml-1, .mx-1 {
+ margin-left: 0.25rem !important; }
+
+.m-2 {
+ margin: 0.5rem !important; }
+
+.mt-2, .my-2 {
+ margin-top: 0.5rem !important; }
+
+.mr-2, .mx-2 {
+ margin-right: 0.5rem !important; }
+
+.mb-2, .my-2 {
+ margin-bottom: 0.5rem !important; }
+
+.ml-2, .mx-2 {
+ margin-left: 0.5rem !important; }
+
+.m-3 {
+ margin: 1rem !important; }
+
+.mt-3, .my-3 {
+ margin-top: 1rem !important; }
+
+.mr-3, .mx-3 {
+ margin-right: 1rem !important; }
+
+.mb-3, .my-3 {
+ margin-bottom: 1rem !important; }
+
+.ml-3, .mx-3 {
+ margin-left: 1rem !important; }
+
+.m-4 {
+ margin: 1.5rem !important; }
+
+.mt-4, .my-4 {
+ margin-top: 1.5rem !important; }
+
+.mr-4, .mx-4 {
+ margin-right: 1.5rem !important; }
+
+.mb-4, .my-4 {
+ margin-bottom: 1.5rem !important; }
+
+.ml-4, .mx-4 {
+ margin-left: 1.5rem !important; }
+
+.m-5 {
+ margin: 3rem !important; }
+
+.mt-5, .my-5 {
+ margin-top: 3rem !important; }
+
+.mr-5, .mx-5 {
+ margin-right: 3rem !important; }
+
+.mb-5, .my-5 {
+ margin-bottom: 3rem !important; }
+
+.ml-5, .mx-5 {
+ margin-left: 3rem !important; }
+
+.p-0 {
+ padding: 0 !important; }
+
+.pt-0, .py-0 {
+ padding-top: 0 !important; }
+
+.pr-0, .px-0 {
+ padding-right: 0 !important; }
+
+.pb-0, .py-0 {
+ padding-bottom: 0 !important; }
+
+.pl-0, .px-0 {
+ padding-left: 0 !important; }
+
+.p-1 {
+ padding: 0.25rem !important; }
+
+.pt-1, .py-1 {
+ padding-top: 0.25rem !important; }
+
+.pr-1, .px-1 {
+ padding-right: 0.25rem !important; }
+
+.pb-1, .py-1 {
+ padding-bottom: 0.25rem !important; }
+
+.pl-1, .px-1 {
+ padding-left: 0.25rem !important; }
+
+.p-2 {
+ padding: 0.5rem !important; }
+
+.pt-2, .py-2 {
+ padding-top: 0.5rem !important; }
+
+.pr-2, .px-2 {
+ padding-right: 0.5rem !important; }
+
+.pb-2, .py-2 {
+ padding-bottom: 0.5rem !important; }
+
+.pl-2, .px-2 {
+ padding-left: 0.5rem !important; }
+
+.p-3 {
+ padding: 1rem !important; }
+
+.pt-3, .py-3 {
+ padding-top: 1rem !important; }
+
+.pr-3, .px-3 {
+ padding-right: 1rem !important; }
+
+.pb-3, .py-3 {
+ padding-bottom: 1rem !important; }
+
+.pl-3, .px-3 {
+ padding-left: 1rem !important; }
+
+.p-4 {
+ padding: 1.5rem !important; }
+
+.pt-4, .py-4 {
+ padding-top: 1.5rem !important; }
+
+.pr-4, .px-4 {
+ padding-right: 1.5rem !important; }
+
+.pb-4, .py-4 {
+ padding-bottom: 1.5rem !important; }
+
+.pl-4, .px-4 {
+ padding-left: 1.5rem !important; }
+
+.p-5 {
+ padding: 3rem !important; }
+
+.pt-5, .py-5 {
+ padding-top: 3rem !important; }
+
+.pr-5, .px-5 {
+ padding-right: 3rem !important; }
+
+.pb-5, .py-5 {
+ padding-bottom: 3rem !important; }
+
+.pl-5, .px-5 {
+ padding-left: 3rem !important; }
+
+.m-auto {
+ margin: auto !important; }
+
+.mt-auto, .my-auto {
+ margin-top: auto !important; }
+
+.mr-auto, .mx-auto {
+ margin-right: auto !important; }
+
+.mb-auto, .my-auto {
+ margin-bottom: auto !important; }
+
+.ml-auto, .mx-auto {
+ margin-left: auto !important; }
+
+@media (min-width: 576px) {
+ .m-sm-0 {
+ margin: 0 !important; }
+ .mt-sm-0, .my-sm-0 {
+ margin-top: 0 !important; }
+ .mr-sm-0, .mx-sm-0 {
+ margin-right: 0 !important; }
+ .mb-sm-0, .my-sm-0 {
+ margin-bottom: 0 !important; }
+ .ml-sm-0, .mx-sm-0 {
+ margin-left: 0 !important; }
+ .m-sm-1 {
+ margin: 0.25rem !important; }
+ .mt-sm-1, .my-sm-1 {
+ margin-top: 0.25rem !important; }
+ .mr-sm-1, .mx-sm-1 {
+ margin-right: 0.25rem !important; }
+ .mb-sm-1, .my-sm-1 {
+ margin-bottom: 0.25rem !important; }
+ .ml-sm-1, .mx-sm-1 {
+ margin-left: 0.25rem !important; }
+ .m-sm-2 {
+ margin: 0.5rem !important; }
+ .mt-sm-2, .my-sm-2 {
+ margin-top: 0.5rem !important; }
+ .mr-sm-2, .mx-sm-2 {
+ margin-right: 0.5rem !important; }
+ .mb-sm-2, .my-sm-2 {
+ margin-bottom: 0.5rem !important; }
+ .ml-sm-2, .mx-sm-2 {
+ margin-left: 0.5rem !important; }
+ .m-sm-3 {
+ margin: 1rem !important; }
+ .mt-sm-3, .my-sm-3 {
+ margin-top: 1rem !important; }
+ .mr-sm-3, .mx-sm-3 {
+ margin-right: 1rem !important; }
+ .mb-sm-3, .my-sm-3 {
+ margin-bottom: 1rem !important; }
+ .ml-sm-3, .mx-sm-3 {
+ margin-left: 1rem !important; }
+ .m-sm-4 {
+ margin: 1.5rem !important; }
+ .mt-sm-4, .my-sm-4 {
+ margin-top: 1.5rem !important; }
+ .mr-sm-4, .mx-sm-4 {
+ margin-right: 1.5rem !important; }
+ .mb-sm-4, .my-sm-4 {
+ margin-bottom: 1.5rem !important; }
+ .ml-sm-4, .mx-sm-4 {
+ margin-left: 1.5rem !important; }
+ .m-sm-5 {
+ margin: 3rem !important; }
+ .mt-sm-5, .my-sm-5 {
+ margin-top: 3rem !important; }
+ .mr-sm-5, .mx-sm-5 {
+ margin-right: 3rem !important; }
+ .mb-sm-5, .my-sm-5 {
+ margin-bottom: 3rem !important; }
+ .ml-sm-5, .mx-sm-5 {
+ margin-left: 3rem !important; }
+ .p-sm-0 {
+ padding: 0 !important; }
+ .pt-sm-0, .py-sm-0 {
+ padding-top: 0 !important; }
+ .pr-sm-0, .px-sm-0 {
+ padding-right: 0 !important; }
+ .pb-sm-0, .py-sm-0 {
+ padding-bottom: 0 !important; }
+ .pl-sm-0, .px-sm-0 {
+ padding-left: 0 !important; }
+ .p-sm-1 {
+ padding: 0.25rem !important; }
+ .pt-sm-1, .py-sm-1 {
+ padding-top: 0.25rem !important; }
+ .pr-sm-1, .px-sm-1 {
+ padding-right: 0.25rem !important; }
+ .pb-sm-1, .py-sm-1 {
+ padding-bottom: 0.25rem !important; }
+ .pl-sm-1, .px-sm-1 {
+ padding-left: 0.25rem !important; }
+ .p-sm-2 {
+ padding: 0.5rem !important; }
+ .pt-sm-2, .py-sm-2 {
+ padding-top: 0.5rem !important; }
+ .pr-sm-2, .px-sm-2 {
+ padding-right: 0.5rem !important; }
+ .pb-sm-2, .py-sm-2 {
+ padding-bottom: 0.5rem !important; }
+ .pl-sm-2, .px-sm-2 {
+ padding-left: 0.5rem !important; }
+ .p-sm-3 {
+ padding: 1rem !important; }
+ .pt-sm-3, .py-sm-3 {
+ padding-top: 1rem !important; }
+ .pr-sm-3, .px-sm-3 {
+ padding-right: 1rem !important; }
+ .pb-sm-3, .py-sm-3 {
+ padding-bottom: 1rem !important; }
+ .pl-sm-3, .px-sm-3 {
+ padding-left: 1rem !important; }
+ .p-sm-4 {
+ padding: 1.5rem !important; }
+ .pt-sm-4, .py-sm-4 {
+ padding-top: 1.5rem !important; }
+ .pr-sm-4, .px-sm-4 {
+ padding-right: 1.5rem !important; }
+ .pb-sm-4, .py-sm-4 {
+ padding-bottom: 1.5rem !important; }
+ .pl-sm-4, .px-sm-4 {
+ padding-left: 1.5rem !important; }
+ .p-sm-5 {
+ padding: 3rem !important; }
+ .pt-sm-5, .py-sm-5 {
+ padding-top: 3rem !important; }
+ .pr-sm-5, .px-sm-5 {
+ padding-right: 3rem !important; }
+ .pb-sm-5, .py-sm-5 {
+ padding-bottom: 3rem !important; }
+ .pl-sm-5, .px-sm-5 {
+ padding-left: 3rem !important; }
+ .m-sm-auto {
+ margin: auto !important; }
+ .mt-sm-auto, .my-sm-auto {
+ margin-top: auto !important; }
+ .mr-sm-auto, .mx-sm-auto {
+ margin-right: auto !important; }
+ .mb-sm-auto, .my-sm-auto {
+ margin-bottom: auto !important; }
+ .ml-sm-auto, .mx-sm-auto {
+ margin-left: auto !important; } }
+
+@media (min-width: 768px) {
+ .m-md-0 {
+ margin: 0 !important; }
+ .mt-md-0, .my-md-0 {
+ margin-top: 0 !important; }
+ .mr-md-0, .mx-md-0 {
+ margin-right: 0 !important; }
+ .mb-md-0, .my-md-0 {
+ margin-bottom: 0 !important; }
+ .ml-md-0, .mx-md-0 {
+ margin-left: 0 !important; }
+ .m-md-1 {
+ margin: 0.25rem !important; }
+ .mt-md-1, .my-md-1 {
+ margin-top: 0.25rem !important; }
+ .mr-md-1, .mx-md-1 {
+ margin-right: 0.25rem !important; }
+ .mb-md-1, .my-md-1 {
+ margin-bottom: 0.25rem !important; }
+ .ml-md-1, .mx-md-1 {
+ margin-left: 0.25rem !important; }
+ .m-md-2 {
+ margin: 0.5rem !important; }
+ .mt-md-2, .my-md-2 {
+ margin-top: 0.5rem !important; }
+ .mr-md-2, .mx-md-2 {
+ margin-right: 0.5rem !important; }
+ .mb-md-2, .my-md-2 {
+ margin-bottom: 0.5rem !important; }
+ .ml-md-2, .mx-md-2 {
+ margin-left: 0.5rem !important; }
+ .m-md-3 {
+ margin: 1rem !important; }
+ .mt-md-3, .my-md-3 {
+ margin-top: 1rem !important; }
+ .mr-md-3, .mx-md-3 {
+ margin-right: 1rem !important; }
+ .mb-md-3, .my-md-3 {
+ margin-bottom: 1rem !important; }
+ .ml-md-3, .mx-md-3 {
+ margin-left: 1rem !important; }
+ .m-md-4 {
+ margin: 1.5rem !important; }
+ .mt-md-4, .my-md-4 {
+ margin-top: 1.5rem !important; }
+ .mr-md-4, .mx-md-4 {
+ margin-right: 1.5rem !important; }
+ .mb-md-4, .my-md-4 {
+ margin-bottom: 1.5rem !important; }
+ .ml-md-4, .mx-md-4 {
+ margin-left: 1.5rem !important; }
+ .m-md-5 {
+ margin: 3rem !important; }
+ .mt-md-5, .my-md-5 {
+ margin-top: 3rem !important; }
+ .mr-md-5, .mx-md-5 {
+ margin-right: 3rem !important; }
+ .mb-md-5, .my-md-5 {
+ margin-bottom: 3rem !important; }
+ .ml-md-5, .mx-md-5 {
+ margin-left: 3rem !important; }
+ .p-md-0 {
+ padding: 0 !important; }
+ .pt-md-0, .py-md-0 {
+ padding-top: 0 !important; }
+ .pr-md-0, .px-md-0 {
+ padding-right: 0 !important; }
+ .pb-md-0, .py-md-0 {
+ padding-bottom: 0 !important; }
+ .pl-md-0, .px-md-0 {
+ padding-left: 0 !important; }
+ .p-md-1 {
+ padding: 0.25rem !important; }
+ .pt-md-1, .py-md-1 {
+ padding-top: 0.25rem !important; }
+ .pr-md-1, .px-md-1 {
+ padding-right: 0.25rem !important; }
+ .pb-md-1, .py-md-1 {
+ padding-bottom: 0.25rem !important; }
+ .pl-md-1, .px-md-1 {
+ padding-left: 0.25rem !important; }
+ .p-md-2 {
+ padding: 0.5rem !important; }
+ .pt-md-2, .py-md-2 {
+ padding-top: 0.5rem !important; }
+ .pr-md-2, .px-md-2 {
+ padding-right: 0.5rem !important; }
+ .pb-md-2, .py-md-2 {
+ padding-bottom: 0.5rem !important; }
+ .pl-md-2, .px-md-2 {
+ padding-left: 0.5rem !important; }
+ .p-md-3 {
+ padding: 1rem !important; }
+ .pt-md-3, .py-md-3 {
+ padding-top: 1rem !important; }
+ .pr-md-3, .px-md-3 {
+ padding-right: 1rem !important; }
+ .pb-md-3, .py-md-3 {
+ padding-bottom: 1rem !important; }
+ .pl-md-3, .px-md-3 {
+ padding-left: 1rem !important; }
+ .p-md-4 {
+ padding: 1.5rem !important; }
+ .pt-md-4, .py-md-4 {
+ padding-top: 1.5rem !important; }
+ .pr-md-4, .px-md-4 {
+ padding-right: 1.5rem !important; }
+ .pb-md-4, .py-md-4 {
+ padding-bottom: 1.5rem !important; }
+ .pl-md-4, .px-md-4 {
+ padding-left: 1.5rem !important; }
+ .p-md-5 {
+ padding: 3rem !important; }
+ .pt-md-5, .py-md-5 {
+ padding-top: 3rem !important; }
+ .pr-md-5, .px-md-5 {
+ padding-right: 3rem !important; }
+ .pb-md-5, .py-md-5 {
+ padding-bottom: 3rem !important; }
+ .pl-md-5, .px-md-5 {
+ padding-left: 3rem !important; }
+ .m-md-auto {
+ margin: auto !important; }
+ .mt-md-auto, .my-md-auto {
+ margin-top: auto !important; }
+ .mr-md-auto, .mx-md-auto {
+ margin-right: auto !important; }
+ .mb-md-auto, .my-md-auto {
+ margin-bottom: auto !important; }
+ .ml-md-auto, .mx-md-auto {
+ margin-left: auto !important; } }
+
+@media (min-width: 992px) {
+ .m-lg-0 {
+ margin: 0 !important; }
+ .mt-lg-0, .my-lg-0 {
+ margin-top: 0 !important; }
+ .mr-lg-0, .mx-lg-0 {
+ margin-right: 0 !important; }
+ .mb-lg-0, .my-lg-0 {
+ margin-bottom: 0 !important; }
+ .ml-lg-0, .mx-lg-0 {
+ margin-left: 0 !important; }
+ .m-lg-1 {
+ margin: 0.25rem !important; }
+ .mt-lg-1, .my-lg-1 {
+ margin-top: 0.25rem !important; }
+ .mr-lg-1, .mx-lg-1 {
+ margin-right: 0.25rem !important; }
+ .mb-lg-1, .my-lg-1 {
+ margin-bottom: 0.25rem !important; }
+ .ml-lg-1, .mx-lg-1 {
+ margin-left: 0.25rem !important; }
+ .m-lg-2 {
+ margin: 0.5rem !important; }
+ .mt-lg-2, .my-lg-2 {
+ margin-top: 0.5rem !important; }
+ .mr-lg-2, .mx-lg-2 {
+ margin-right: 0.5rem !important; }
+ .mb-lg-2, .my-lg-2 {
+ margin-bottom: 0.5rem !important; }
+ .ml-lg-2, .mx-lg-2 {
+ margin-left: 0.5rem !important; }
+ .m-lg-3 {
+ margin: 1rem !important; }
+ .mt-lg-3, .my-lg-3 {
+ margin-top: 1rem !important; }
+ .mr-lg-3, .mx-lg-3 {
+ margin-right: 1rem !important; }
+ .mb-lg-3, .my-lg-3 {
+ margin-bottom: 1rem !important; }
+ .ml-lg-3, .mx-lg-3 {
+ margin-left: 1rem !important; }
+ .m-lg-4 {
+ margin: 1.5rem !important; }
+ .mt-lg-4, .my-lg-4 {
+ margin-top: 1.5rem !important; }
+ .mr-lg-4, .mx-lg-4 {
+ margin-right: 1.5rem !important; }
+ .mb-lg-4, .my-lg-4 {
+ margin-bottom: 1.5rem !important; }
+ .ml-lg-4, .mx-lg-4 {
+ margin-left: 1.5rem !important; }
+ .m-lg-5 {
+ margin: 3rem !important; }
+ .mt-lg-5, .my-lg-5 {
+ margin-top: 3rem !important; }
+ .mr-lg-5, .mx-lg-5 {
+ margin-right: 3rem !important; }
+ .mb-lg-5, .my-lg-5 {
+ margin-bottom: 3rem !important; }
+ .ml-lg-5, .mx-lg-5 {
+ margin-left: 3rem !important; }
+ .p-lg-0 {
+ padding: 0 !important; }
+ .pt-lg-0, .py-lg-0 {
+ padding-top: 0 !important; }
+ .pr-lg-0, .px-lg-0 {
+ padding-right: 0 !important; }
+ .pb-lg-0, .py-lg-0 {
+ padding-bottom: 0 !important; }
+ .pl-lg-0, .px-lg-0 {
+ padding-left: 0 !important; }
+ .p-lg-1 {
+ padding: 0.25rem !important; }
+ .pt-lg-1, .py-lg-1 {
+ padding-top: 0.25rem !important; }
+ .pr-lg-1, .px-lg-1 {
+ padding-right: 0.25rem !important; }
+ .pb-lg-1, .py-lg-1 {
+ padding-bottom: 0.25rem !important; }
+ .pl-lg-1, .px-lg-1 {
+ padding-left: 0.25rem !important; }
+ .p-lg-2 {
+ padding: 0.5rem !important; }
+ .pt-lg-2, .py-lg-2 {
+ padding-top: 0.5rem !important; }
+ .pr-lg-2, .px-lg-2 {
+ padding-right: 0.5rem !important; }
+ .pb-lg-2, .py-lg-2 {
+ padding-bottom: 0.5rem !important; }
+ .pl-lg-2, .px-lg-2 {
+ padding-left: 0.5rem !important; }
+ .p-lg-3 {
+ padding: 1rem !important; }
+ .pt-lg-3, .py-lg-3 {
+ padding-top: 1rem !important; }
+ .pr-lg-3, .px-lg-3 {
+ padding-right: 1rem !important; }
+ .pb-lg-3, .py-lg-3 {
+ padding-bottom: 1rem !important; }
+ .pl-lg-3, .px-lg-3 {
+ padding-left: 1rem !important; }
+ .p-lg-4 {
+ padding: 1.5rem !important; }
+ .pt-lg-4, .py-lg-4 {
+ padding-top: 1.5rem !important; }
+ .pr-lg-4, .px-lg-4 {
+ padding-right: 1.5rem !important; }
+ .pb-lg-4, .py-lg-4 {
+ padding-bottom: 1.5rem !important; }
+ .pl-lg-4, .px-lg-4 {
+ padding-left: 1.5rem !important; }
+ .p-lg-5 {
+ padding: 3rem !important; }
+ .pt-lg-5, .py-lg-5 {
+ padding-top: 3rem !important; }
+ .pr-lg-5, .px-lg-5 {
+ padding-right: 3rem !important; }
+ .pb-lg-5, .py-lg-5 {
+ padding-bottom: 3rem !important; }
+ .pl-lg-5, .px-lg-5 {
+ padding-left: 3rem !important; }
+ .m-lg-auto {
+ margin: auto !important; }
+ .mt-lg-auto, .my-lg-auto {
+ margin-top: auto !important; }
+ .mr-lg-auto, .mx-lg-auto {
+ margin-right: auto !important; }
+ .mb-lg-auto, .my-lg-auto {
+ margin-bottom: auto !important; }
+ .ml-lg-auto, .mx-lg-auto {
+ margin-left: auto !important; } }
+
+@media (min-width: 1200px) {
+ .m-xl-0 {
+ margin: 0 !important; }
+ .mt-xl-0, .my-xl-0 {
+ margin-top: 0 !important; }
+ .mr-xl-0, .mx-xl-0 {
+ margin-right: 0 !important; }
+ .mb-xl-0, .my-xl-0 {
+ margin-bottom: 0 !important; }
+ .ml-xl-0, .mx-xl-0 {
+ margin-left: 0 !important; }
+ .m-xl-1 {
+ margin: 0.25rem !important; }
+ .mt-xl-1, .my-xl-1 {
+ margin-top: 0.25rem !important; }
+ .mr-xl-1, .mx-xl-1 {
+ margin-right: 0.25rem !important; }
+ .mb-xl-1, .my-xl-1 {
+ margin-bottom: 0.25rem !important; }
+ .ml-xl-1, .mx-xl-1 {
+ margin-left: 0.25rem !important; }
+ .m-xl-2 {
+ margin: 0.5rem !important; }
+ .mt-xl-2, .my-xl-2 {
+ margin-top: 0.5rem !important; }
+ .mr-xl-2, .mx-xl-2 {
+ margin-right: 0.5rem !important; }
+ .mb-xl-2, .my-xl-2 {
+ margin-bottom: 0.5rem !important; }
+ .ml-xl-2, .mx-xl-2 {
+ margin-left: 0.5rem !important; }
+ .m-xl-3 {
+ margin: 1rem !important; }
+ .mt-xl-3, .my-xl-3 {
+ margin-top: 1rem !important; }
+ .mr-xl-3, .mx-xl-3 {
+ margin-right: 1rem !important; }
+ .mb-xl-3, .my-xl-3 {
+ margin-bottom: 1rem !important; }
+ .ml-xl-3, .mx-xl-3 {
+ margin-left: 1rem !important; }
+ .m-xl-4 {
+ margin: 1.5rem !important; }
+ .mt-xl-4, .my-xl-4 {
+ margin-top: 1.5rem !important; }
+ .mr-xl-4, .mx-xl-4 {
+ margin-right: 1.5rem !important; }
+ .mb-xl-4, .my-xl-4 {
+ margin-bottom: 1.5rem !important; }
+ .ml-xl-4, .mx-xl-4 {
+ margin-left: 1.5rem !important; }
+ .m-xl-5 {
+ margin: 3rem !important; }
+ .mt-xl-5, .my-xl-5 {
+ margin-top: 3rem !important; }
+ .mr-xl-5, .mx-xl-5 {
+ margin-right: 3rem !important; }
+ .mb-xl-5, .my-xl-5 {
+ margin-bottom: 3rem !important; }
+ .ml-xl-5, .mx-xl-5 {
+ margin-left: 3rem !important; }
+ .p-xl-0 {
+ padding: 0 !important; }
+ .pt-xl-0, .py-xl-0 {
+ padding-top: 0 !important; }
+ .pr-xl-0, .px-xl-0 {
+ padding-right: 0 !important; }
+ .pb-xl-0, .py-xl-0 {
+ padding-bottom: 0 !important; }
+ .pl-xl-0, .px-xl-0 {
+ padding-left: 0 !important; }
+ .p-xl-1 {
+ padding: 0.25rem !important; }
+ .pt-xl-1, .py-xl-1 {
+ padding-top: 0.25rem !important; }
+ .pr-xl-1, .px-xl-1 {
+ padding-right: 0.25rem !important; }
+ .pb-xl-1, .py-xl-1 {
+ padding-bottom: 0.25rem !important; }
+ .pl-xl-1, .px-xl-1 {
+ padding-left: 0.25rem !important; }
+ .p-xl-2 {
+ padding: 0.5rem !important; }
+ .pt-xl-2, .py-xl-2 {
+ padding-top: 0.5rem !important; }
+ .pr-xl-2, .px-xl-2 {
+ padding-right: 0.5rem !important; }
+ .pb-xl-2, .py-xl-2 {
+ padding-bottom: 0.5rem !important; }
+ .pl-xl-2, .px-xl-2 {
+ padding-left: 0.5rem !important; }
+ .p-xl-3 {
+ padding: 1rem !important; }
+ .pt-xl-3, .py-xl-3 {
+ padding-top: 1rem !important; }
+ .pr-xl-3, .px-xl-3 {
+ padding-right: 1rem !important; }
+ .pb-xl-3, .py-xl-3 {
+ padding-bottom: 1rem !important; }
+ .pl-xl-3, .px-xl-3 {
+ padding-left: 1rem !important; }
+ .p-xl-4 {
+ padding: 1.5rem !important; }
+ .pt-xl-4, .py-xl-4 {
+ padding-top: 1.5rem !important; }
+ .pr-xl-4, .px-xl-4 {
+ padding-right: 1.5rem !important; }
+ .pb-xl-4, .py-xl-4 {
+ padding-bottom: 1.5rem !important; }
+ .pl-xl-4, .px-xl-4 {
+ padding-left: 1.5rem !important; }
+ .p-xl-5 {
+ padding: 3rem !important; }
+ .pt-xl-5, .py-xl-5 {
+ padding-top: 3rem !important; }
+ .pr-xl-5, .px-xl-5 {
+ padding-right: 3rem !important; }
+ .pb-xl-5, .py-xl-5 {
+ padding-bottom: 3rem !important; }
+ .pl-xl-5, .px-xl-5 {
+ padding-left: 3rem !important; }
+ .m-xl-auto {
+ margin: auto !important; }
+ .mt-xl-auto, .my-xl-auto {
+ margin-top: auto !important; }
+ .mr-xl-auto, .mx-xl-auto {
+ margin-right: auto !important; }
+ .mb-xl-auto, .my-xl-auto {
+ margin-bottom: auto !important; }
+ .ml-xl-auto, .mx-xl-auto {
+ margin-left: auto !important; } }
+
+.text-justify {
+ text-align: justify !important; }
+
+.text-nowrap {
+ white-space: nowrap !important; }
+
+.text-truncate {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap; }
+
+.text-left {
+ text-align: left !important; }
+
+.text-right {
+ text-align: right !important; }
+
+.text-center {
+ text-align: center !important; }
+
+@media (min-width: 576px) {
+ .text-sm-left {
+ text-align: left !important; }
+ .text-sm-right {
+ text-align: right !important; }
+ .text-sm-center {
+ text-align: center !important; } }
+
+@media (min-width: 768px) {
+ .text-md-left {
+ text-align: left !important; }
+ .text-md-right {
+ text-align: right !important; }
+ .text-md-center {
+ text-align: center !important; } }
+
+@media (min-width: 992px) {
+ .text-lg-left {
+ text-align: left !important; }
+ .text-lg-right {
+ text-align: right !important; }
+ .text-lg-center {
+ text-align: center !important; } }
+
+@media (min-width: 1200px) {
+ .text-xl-left {
+ text-align: left !important; }
+ .text-xl-right {
+ text-align: right !important; }
+ .text-xl-center {
+ text-align: center !important; } }
+
+.text-lowercase {
+ text-transform: lowercase !important; }
+
+.text-uppercase {
+ text-transform: uppercase !important; }
+
+.text-capitalize {
+ text-transform: capitalize !important; }
+
+.font-weight-light {
+ font-weight: 300 !important; }
+
+.font-weight-normal {
+ font-weight: 400 !important; }
+
+.font-weight-bold {
+ font-weight: 700 !important; }
+
+.font-italic {
+ font-style: italic !important; }
+
+.text-white {
+ color: #fff !important; }
+
+.text-primary {
+ color: #007bff !important; }
+
+a.text-primary:focus, a.text-primary:hover {
+ color: #0062cc !important; }
+
+.text-secondary {
+ color: #6c757d !important; }
+
+a.text-secondary:focus, a.text-secondary:hover {
+ color: #545b62 !important; }
+
+.text-success {
+ color: #28a745 !important; }
+
+a.text-success:focus, a.text-success:hover {
+ color: #1e7e34 !important; }
+
+.text-info {
+ color: #17a2b8 !important; }
+
+a.text-info:focus, a.text-info:hover {
+ color: #117a8b !important; }
+
+.text-warning {
+ color: #ffc107 !important; }
+
+a.text-warning:focus, a.text-warning:hover {
+ color: #d39e00 !important; }
+
+.text-danger {
+ color: #dc3545 !important; }
+
+a.text-danger:focus, a.text-danger:hover {
+ color: #bd2130 !important; }
+
+.text-light {
+ color: #f8f9fa !important; }
+
+a.text-light:focus, a.text-light:hover {
+ color: #dae0e5 !important; }
+
+.text-dark {
+ color: #343a40 !important; }
+
+a.text-dark:focus, a.text-dark:hover {
+ color: #1d2124 !important; }
+
+.text-muted {
+ color: #6c757d !important; }
+
+.text-hide {
+ font: 0/0 a;
+ color: transparent;
+ text-shadow: none;
+ background-color: transparent;
+ border: 0; }
+
+.visible {
+ visibility: visible !important; }
+
+.invisible {
+ visibility: hidden !important; }
+
+@media print {
+ *, ::after, ::before {
+ text-shadow: none !important;
+ box-shadow: none !important; }
+ a:not(.btn) {
+ text-decoration: underline; }
+ abbr[title]::after {
+ content: " (" attr(title) ")"; }
+ pre {
+ white-space: pre-wrap !important; }
+ blockquote, pre {
+ border: 1px solid #999;
+ page-break-inside: avoid; }
+ thead {
+ display: table-header-group; }
+ img, tr {
+ page-break-inside: avoid; }
+ h2, h3, p {
+ orphans: 3;
+ widows: 3; }
+ h2, h3 {
+ page-break-after: avoid; }
+ @page {
+ size: a3; }
+ body {
+ min-width: 992px !important; }
+ .container {
+ min-width: 992px !important; }
+ .navbar {
+ display: none; }
+ .badge {
+ border: 1px solid #000; }
+ .table {
+ border-collapse: collapse !important; }
+ .table td, .table th {
+ background-color: #fff !important; }
+ .table-bordered td, .table-bordered th {
+ border: 1px solid #ddd !important; } }
+/*!
+ * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
+ * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
+ */
+@font-face {
+ font-family: 'FontAwesome';
+ src: url(../dist/fonts/fontawesome-webfont.eot);
+ src: url(../dist/fonts/fontawesome-webfont.eot?#iefix&v=4.7.0) format("embedded-opentype"), url(../dist/fonts/fontawesome-webfont.woff2) format("woff2"), url(../dist/fonts/fontawesome-webfont.woff) format("woff"), url(../dist/fonts/fontawesome-webfont.ttf) format("truetype"), url(../dist/img/fontawesome-webfont.svg#fontawesomeregular) format("svg");
+ font-weight: normal;
+ font-style: normal; }
+
+.fa {
+ display: inline-block;
+ font: normal normal normal 14px/1 FontAwesome;
+ font-size: inherit;
+ text-rendering: auto;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale; }
+
+.fa-lg {
+ font-size: 1.33333333em;
+ line-height: .75em;
+ vertical-align: -15%; }
+
+.fa-2x {
+ font-size: 2em; }
+
+.fa-3x {
+ font-size: 3em; }
+
+.fa-4x {
+ font-size: 4em; }
+
+.fa-5x {
+ font-size: 5em; }
+
+.fa-fw {
+ width: 1.28571429em;
+ text-align: center; }
+
+.fa-ul {
+ padding-left: 0;
+ margin-left: 2.14285714em;
+ list-style-type: none; }
+
+.fa-ul > li {
+ position: relative; }
+
+.fa-li {
+ position: absolute;
+ left: -2.14285714em;
+ width: 2.14285714em;
+ top: .14285714em;
+ text-align: center; }
+
+.fa-li.fa-lg {
+ left: -1.85714286em; }
+
+.fa-border {
+ padding: .2em .25em .15em;
+ border: solid .08em #eee;
+ border-radius: .1em; }
+
+.fa-pull-left {
+ float: left; }
+
+.fa-pull-right {
+ float: right; }
+
+.fa.fa-pull-left {
+ margin-right: .3em; }
+
+.fa.fa-pull-right {
+ margin-left: .3em; }
+
+.pull-right {
+ float: right; }
+
+.pull-left {
+ float: left; }
+
+.fa.pull-left {
+ margin-right: .3em; }
+
+.fa.pull-right {
+ margin-left: .3em; }
+
+.fa-spin {
+ -webkit-animation: fa-spin 2s infinite linear;
+ animation: fa-spin 2s infinite linear; }
+
+.fa-pulse {
+ -webkit-animation: fa-spin 1s infinite steps(8);
+ animation: fa-spin 1s infinite steps(8); }
+
+@-webkit-keyframes fa-spin {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg); }
+ 100% {
+ -webkit-transform: rotate(359deg);
+ transform: rotate(359deg); } }
+
+@keyframes fa-spin {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg); }
+ 100% {
+ -webkit-transform: rotate(359deg);
+ transform: rotate(359deg); } }
+
+.fa-rotate-90 {
+ -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";
+ -webkit-transform: rotate(90deg);
+ -ms-transform: rotate(90deg);
+ transform: rotate(90deg); }
+
+.fa-rotate-180 {
+ -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";
+ -webkit-transform: rotate(180deg);
+ -ms-transform: rotate(180deg);
+ transform: rotate(180deg); }
+
+.fa-rotate-270 {
+ -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";
+ -webkit-transform: rotate(270deg);
+ -ms-transform: rotate(270deg);
+ transform: rotate(270deg); }
+
+.fa-flip-horizontal {
+ -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";
+ -webkit-transform: scale(-1, 1);
+ -ms-transform: scale(-1, 1);
+ transform: scale(-1, 1); }
+
+.fa-flip-vertical {
+ -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";
+ -webkit-transform: scale(1, -1);
+ -ms-transform: scale(1, -1);
+ transform: scale(1, -1); }
+
+:root .fa-rotate-90, :root .fa-rotate-180, :root .fa-rotate-270, :root .fa-flip-horizontal, :root .fa-flip-vertical {
+ filter: none; }
+
+.fa-stack {
+ position: relative;
+ display: inline-block;
+ width: 2em;
+ height: 2em;
+ line-height: 2em;
+ vertical-align: middle; }
+
+.fa-stack-1x, .fa-stack-2x {
+ position: absolute;
+ left: 0;
+ width: 100%;
+ text-align: center; }
+
+.fa-stack-1x {
+ line-height: inherit; }
+
+.fa-stack-2x {
+ font-size: 2em; }
+
+.fa-inverse {
+ color: #fff; }
+
+.fa-glass:before {
+ content: "\F000"; }
+
+.fa-music:before {
+ content: "\F001"; }
+
+.fa-search:before {
+ content: "\F002"; }
+
+.fa-envelope-o:before {
+ content: "\F003"; }
+
+.fa-heart:before {
+ content: "\F004"; }
+
+.fa-star:before {
+ content: "\F005"; }
+
+.fa-star-o:before {
+ content: "\F006"; }
+
+.fa-user:before {
+ content: "\F007"; }
+
+.fa-film:before {
+ content: "\F008"; }
+
+.fa-th-large:before {
+ content: "\F009"; }
+
+.fa-th:before {
+ content: "\F00A"; }
+
+.fa-th-list:before {
+ content: "\F00B"; }
+
+.fa-check:before {
+ content: "\F00C"; }
+
+.fa-remove:before, .fa-close:before, .fa-times:before {
+ content: "\F00D"; }
+
+.fa-search-plus:before {
+ content: "\F00E"; }
+
+.fa-search-minus:before {
+ content: "\F010"; }
+
+.fa-power-off:before {
+ content: "\F011"; }
+
+.fa-signal:before {
+ content: "\F012"; }
+
+.fa-gear:before, .fa-cog:before {
+ content: "\F013"; }
+
+.fa-trash-o:before {
+ content: "\F014"; }
+
+.fa-home:before {
+ content: "\F015"; }
+
+.fa-file-o:before {
+ content: "\F016"; }
+
+.fa-clock-o:before {
+ content: "\F017"; }
+
+.fa-road:before {
+ content: "\F018"; }
+
+.fa-download:before {
+ content: "\F019"; }
+
+.fa-arrow-circle-o-down:before {
+ content: "\F01A"; }
+
+.fa-arrow-circle-o-up:before {
+ content: "\F01B"; }
+
+.fa-inbox:before {
+ content: "\F01C"; }
+
+.fa-play-circle-o:before {
+ content: "\F01D"; }
+
+.fa-rotate-right:before, .fa-repeat:before {
+ content: "\F01E"; }
+
+.fa-refresh:before {
+ content: "\F021"; }
+
+.fa-list-alt:before {
+ content: "\F022"; }
+
+.fa-lock:before {
+ content: "\F023"; }
+
+.fa-flag:before {
+ content: "\F024"; }
+
+.fa-headphones:before {
+ content: "\F025"; }
+
+.fa-volume-off:before {
+ content: "\F026"; }
+
+.fa-volume-down:before {
+ content: "\F027"; }
+
+.fa-volume-up:before {
+ content: "\F028"; }
+
+.fa-qrcode:before {
+ content: "\F029"; }
+
+.fa-barcode:before {
+ content: "\F02A"; }
+
+.fa-tag:before {
+ content: "\F02B"; }
+
+.fa-tags:before {
+ content: "\F02C"; }
+
+.fa-book:before {
+ content: "\F02D"; }
+
+.fa-bookmark:before {
+ content: "\F02E"; }
+
+.fa-print:before {
+ content: "\F02F"; }
+
+.fa-camera:before {
+ content: "\F030"; }
+
+.fa-font:before {
+ content: "\F031"; }
+
+.fa-bold:before {
+ content: "\F032"; }
+
+.fa-italic:before {
+ content: "\F033"; }
+
+.fa-text-height:before {
+ content: "\F034"; }
+
+.fa-text-width:before {
+ content: "\F035"; }
+
+.fa-align-left:before {
+ content: "\F036"; }
+
+.fa-align-center:before {
+ content: "\F037"; }
+
+.fa-align-right:before {
+ content: "\F038"; }
+
+.fa-align-justify:before {
+ content: "\F039"; }
+
+.fa-list:before {
+ content: "\F03A"; }
+
+.fa-dedent:before, .fa-outdent:before {
+ content: "\F03B"; }
+
+.fa-indent:before {
+ content: "\F03C"; }
+
+.fa-video-camera:before {
+ content: "\F03D"; }
+
+.fa-photo:before, .fa-image:before, .fa-picture-o:before {
+ content: "\F03E"; }
+
+.fa-pencil:before {
+ content: "\F040"; }
+
+.fa-map-marker:before {
+ content: "\F041"; }
+
+.fa-adjust:before {
+ content: "\F042"; }
+
+.fa-tint:before {
+ content: "\F043"; }
+
+.fa-edit:before, .fa-pencil-square-o:before {
+ content: "\F044"; }
+
+.fa-share-square-o:before {
+ content: "\F045"; }
+
+.fa-check-square-o:before {
+ content: "\F046"; }
+
+.fa-arrows:before {
+ content: "\F047"; }
+
+.fa-step-backward:before {
+ content: "\F048"; }
+
+.fa-fast-backward:before {
+ content: "\F049"; }
+
+.fa-backward:before {
+ content: "\F04A"; }
+
+.fa-play:before {
+ content: "\F04B"; }
+
+.fa-pause:before {
+ content: "\F04C"; }
+
+.fa-stop:before {
+ content: "\F04D"; }
+
+.fa-forward:before {
+ content: "\F04E"; }
+
+.fa-fast-forward:before {
+ content: "\F050"; }
+
+.fa-step-forward:before {
+ content: "\F051"; }
+
+.fa-eject:before {
+ content: "\F052"; }
+
+.fa-chevron-left:before {
+ content: "\F053"; }
+
+.fa-chevron-right:before {
+ content: "\F054"; }
+
+.fa-plus-circle:before {
+ content: "\F055"; }
+
+.fa-minus-circle:before {
+ content: "\F056"; }
+
+.fa-times-circle:before {
+ content: "\F057"; }
+
+.fa-check-circle:before {
+ content: "\F058"; }
+
+.fa-question-circle:before {
+ content: "\F059"; }
+
+.fa-info-circle:before {
+ content: "\F05A"; }
+
+.fa-crosshairs:before {
+ content: "\F05B"; }
+
+.fa-times-circle-o:before {
+ content: "\F05C"; }
+
+.fa-check-circle-o:before {
+ content: "\F05D"; }
+
+.fa-ban:before {
+ content: "\F05E"; }
+
+.fa-arrow-left:before {
+ content: "\F060"; }
+
+.fa-arrow-right:before {
+ content: "\F061"; }
+
+.fa-arrow-up:before {
+ content: "\F062"; }
+
+.fa-arrow-down:before {
+ content: "\F063"; }
+
+.fa-mail-forward:before, .fa-share:before {
+ content: "\F064"; }
+
+.fa-expand:before {
+ content: "\F065"; }
+
+.fa-compress:before {
+ content: "\F066"; }
+
+.fa-plus:before {
+ content: "\F067"; }
+
+.fa-minus:before {
+ content: "\F068"; }
+
+.fa-asterisk:before {
+ content: "\F069"; }
+
+.fa-exclamation-circle:before {
+ content: "\F06A"; }
+
+.fa-gift:before {
+ content: "\F06B"; }
+
+.fa-leaf:before {
+ content: "\F06C"; }
+
+.fa-fire:before {
+ content: "\F06D"; }
+
+.fa-eye:before {
+ content: "\F06E"; }
+
+.fa-eye-slash:before {
+ content: "\F070"; }
+
+.fa-warning:before, .fa-exclamation-triangle:before {
+ content: "\F071"; }
+
+.fa-plane:before {
+ content: "\F072"; }
+
+.fa-calendar:before {
+ content: "\F073"; }
+
+.fa-random:before {
+ content: "\F074"; }
+
+.fa-comment:before {
+ content: "\F075"; }
+
+.fa-magnet:before {
+ content: "\F076"; }
+
+.fa-chevron-up:before {
+ content: "\F077"; }
+
+.fa-chevron-down:before {
+ content: "\F078"; }
+
+.fa-retweet:before {
+ content: "\F079"; }
+
+.fa-shopping-cart:before {
+ content: "\F07A"; }
+
+.fa-folder:before {
+ content: "\F07B"; }
+
+.fa-folder-open:before {
+ content: "\F07C"; }
+
+.fa-arrows-v:before {
+ content: "\F07D"; }
+
+.fa-arrows-h:before {
+ content: "\F07E"; }
+
+.fa-bar-chart-o:before, .fa-bar-chart:before {
+ content: "\F080"; }
+
+.fa-twitter-square:before {
+ content: "\F081"; }
+
+.fa-facebook-square:before {
+ content: "\F082"; }
+
+.fa-camera-retro:before {
+ content: "\F083"; }
+
+.fa-key:before {
+ content: "\F084"; }
+
+.fa-gears:before, .fa-cogs:before {
+ content: "\F085"; }
+
+.fa-comments:before {
+ content: "\F086"; }
+
+.fa-thumbs-o-up:before {
+ content: "\F087"; }
+
+.fa-thumbs-o-down:before {
+ content: "\F088"; }
+
+.fa-star-half:before {
+ content: "\F089"; }
+
+.fa-heart-o:before {
+ content: "\F08A"; }
+
+.fa-sign-out:before {
+ content: "\F08B"; }
+
+.fa-linkedin-square:before {
+ content: "\F08C"; }
+
+.fa-thumb-tack:before {
+ content: "\F08D"; }
+
+.fa-external-link:before {
+ content: "\F08E"; }
+
+.fa-sign-in:before {
+ content: "\F090"; }
+
+.fa-trophy:before {
+ content: "\F091"; }
+
+.fa-github-square:before {
+ content: "\F092"; }
+
+.fa-upload:before {
+ content: "\F093"; }
+
+.fa-lemon-o:before {
+ content: "\F094"; }
+
+.fa-phone:before {
+ content: "\F095"; }
+
+.fa-square-o:before {
+ content: "\F096"; }
+
+.fa-bookmark-o:before {
+ content: "\F097"; }
+
+.fa-phone-square:before {
+ content: "\F098"; }
+
+.fa-twitter:before {
+ content: "\F099"; }
+
+.fa-facebook-f:before, .fa-facebook:before {
+ content: "\F09A"; }
+
+.fa-github:before {
+ content: "\F09B"; }
+
+.fa-unlock:before {
+ content: "\F09C"; }
+
+.fa-credit-card:before {
+ content: "\F09D"; }
+
+.fa-feed:before, .fa-rss:before {
+ content: "\F09E"; }
+
+.fa-hdd-o:before {
+ content: "\F0A0"; }
+
+.fa-bullhorn:before {
+ content: "\F0A1"; }
+
+.fa-bell:before {
+ content: "\F0F3"; }
+
+.fa-certificate:before {
+ content: "\F0A3"; }
+
+.fa-hand-o-right:before {
+ content: "\F0A4"; }
+
+.fa-hand-o-left:before {
+ content: "\F0A5"; }
+
+.fa-hand-o-up:before {
+ content: "\F0A6"; }
+
+.fa-hand-o-down:before {
+ content: "\F0A7"; }
+
+.fa-arrow-circle-left:before {
+ content: "\F0A8"; }
+
+.fa-arrow-circle-right:before {
+ content: "\F0A9"; }
+
+.fa-arrow-circle-up:before {
+ content: "\F0AA"; }
+
+.fa-arrow-circle-down:before {
+ content: "\F0AB"; }
+
+.fa-globe:before {
+ content: "\F0AC"; }
+
+.fa-wrench:before {
+ content: "\F0AD"; }
+
+.fa-tasks:before {
+ content: "\F0AE"; }
+
+.fa-filter:before {
+ content: "\F0B0"; }
+
+.fa-briefcase:before {
+ content: "\F0B1"; }
+
+.fa-arrows-alt:before {
+ content: "\F0B2"; }
+
+.fa-group:before, .fa-users:before {
+ content: "\F0C0"; }
+
+.fa-chain:before, .fa-link:before {
+ content: "\F0C1"; }
+
+.fa-cloud:before {
+ content: "\F0C2"; }
+
+.fa-flask:before {
+ content: "\F0C3"; }
+
+.fa-cut:before, .fa-scissors:before {
+ content: "\F0C4"; }
+
+.fa-copy:before, .fa-files-o:before {
+ content: "\F0C5"; }
+
+.fa-paperclip:before {
+ content: "\F0C6"; }
+
+.fa-save:before, .fa-floppy-o:before {
+ content: "\F0C7"; }
+
+.fa-square:before {
+ content: "\F0C8"; }
+
+.fa-navicon:before, .fa-reorder:before, .fa-bars:before {
+ content: "\F0C9"; }
+
+.fa-list-ul:before {
+ content: "\F0CA"; }
+
+.fa-list-ol:before {
+ content: "\F0CB"; }
+
+.fa-strikethrough:before {
+ content: "\F0CC"; }
+
+.fa-underline:before {
+ content: "\F0CD"; }
+
+.fa-table:before {
+ content: "\F0CE"; }
+
+.fa-magic:before {
+ content: "\F0D0"; }
+
+.fa-truck:before {
+ content: "\F0D1"; }
+
+.fa-pinterest:before {
+ content: "\F0D2"; }
+
+.fa-pinterest-square:before {
+ content: "\F0D3"; }
+
+.fa-google-plus-square:before {
+ content: "\F0D4"; }
+
+.fa-google-plus:before {
+ content: "\F0D5"; }
+
+.fa-money:before {
+ content: "\F0D6"; }
+
+.fa-caret-down:before {
+ content: "\F0D7"; }
+
+.fa-caret-up:before {
+ content: "\F0D8"; }
+
+.fa-caret-left:before {
+ content: "\F0D9"; }
+
+.fa-caret-right:before {
+ content: "\F0DA"; }
+
+.fa-columns:before {
+ content: "\F0DB"; }
+
+.fa-unsorted:before, .fa-sort:before {
+ content: "\F0DC"; }
+
+.fa-sort-down:before, .fa-sort-desc:before {
+ content: "\F0DD"; }
+
+.fa-sort-up:before, .fa-sort-asc:before {
+ content: "\F0DE"; }
+
+.fa-envelope:before {
+ content: "\F0E0"; }
+
+.fa-linkedin:before {
+ content: "\F0E1"; }
+
+.fa-rotate-left:before, .fa-undo:before {
+ content: "\F0E2"; }
+
+.fa-legal:before, .fa-gavel:before {
+ content: "\F0E3"; }
+
+.fa-dashboard:before, .fa-tachometer:before {
+ content: "\F0E4"; }
+
+.fa-comment-o:before {
+ content: "\F0E5"; }
+
+.fa-comments-o:before {
+ content: "\F0E6"; }
+
+.fa-flash:before, .fa-bolt:before {
+ content: "\F0E7"; }
+
+.fa-sitemap:before {
+ content: "\F0E8"; }
+
+.fa-umbrella:before {
+ content: "\F0E9"; }
+
+.fa-paste:before, .fa-clipboard:before {
+ content: "\F0EA"; }
+
+.fa-lightbulb-o:before {
+ content: "\F0EB"; }
+
+.fa-exchange:before {
+ content: "\F0EC"; }
+
+.fa-cloud-download:before {
+ content: "\F0ED"; }
+
+.fa-cloud-upload:before {
+ content: "\F0EE"; }
+
+.fa-user-md:before {
+ content: "\F0F0"; }
+
+.fa-stethoscope:before {
+ content: "\F0F1"; }
+
+.fa-suitcase:before {
+ content: "\F0F2"; }
+
+.fa-bell-o:before {
+ content: "\F0A2"; }
+
+.fa-coffee:before {
+ content: "\F0F4"; }
+
+.fa-cutlery:before {
+ content: "\F0F5"; }
+
+.fa-file-text-o:before {
+ content: "\F0F6"; }
+
+.fa-building-o:before {
+ content: "\F0F7"; }
+
+.fa-hospital-o:before {
+ content: "\F0F8"; }
+
+.fa-ambulance:before {
+ content: "\F0F9"; }
+
+.fa-medkit:before {
+ content: "\F0FA"; }
+
+.fa-fighter-jet:before {
+ content: "\F0FB"; }
+
+.fa-beer:before {
+ content: "\F0FC"; }
+
+.fa-h-square:before {
+ content: "\F0FD"; }
+
+.fa-plus-square:before {
+ content: "\F0FE"; }
+
+.fa-angle-double-left:before {
+ content: "\F100"; }
+
+.fa-angle-double-right:before {
+ content: "\F101"; }
+
+.fa-angle-double-up:before {
+ content: "\F102"; }
+
+.fa-angle-double-down:before {
+ content: "\F103"; }
+
+.fa-angle-left:before {
+ content: "\F104"; }
+
+.fa-angle-right:before {
+ content: "\F105"; }
+
+.fa-angle-up:before {
+ content: "\F106"; }
+
+.fa-angle-down:before {
+ content: "\F107"; }
+
+.fa-desktop:before {
+ content: "\F108"; }
+
+.fa-laptop:before {
+ content: "\F109"; }
+
+.fa-tablet:before {
+ content: "\F10A"; }
+
+.fa-mobile-phone:before, .fa-mobile:before {
+ content: "\F10B"; }
+
+.fa-circle-o:before {
+ content: "\F10C"; }
+
+.fa-quote-left:before {
+ content: "\F10D"; }
+
+.fa-quote-right:before {
+ content: "\F10E"; }
+
+.fa-spinner:before {
+ content: "\F110"; }
+
+.fa-circle:before {
+ content: "\F111"; }
+
+.fa-mail-reply:before, .fa-reply:before {
+ content: "\F112"; }
+
+.fa-github-alt:before {
+ content: "\F113"; }
+
+.fa-folder-o:before {
+ content: "\F114"; }
+
+.fa-folder-open-o:before {
+ content: "\F115"; }
+
+.fa-smile-o:before {
+ content: "\F118"; }
+
+.fa-frown-o:before {
+ content: "\F119"; }
+
+.fa-meh-o:before {
+ content: "\F11A"; }
+
+.fa-gamepad:before {
+ content: "\F11B"; }
+
+.fa-keyboard-o:before {
+ content: "\F11C"; }
+
+.fa-flag-o:before {
+ content: "\F11D"; }
+
+.fa-flag-checkered:before {
+ content: "\F11E"; }
+
+.fa-terminal:before {
+ content: "\F120"; }
+
+.fa-code:before {
+ content: "\F121"; }
+
+.fa-mail-reply-all:before, .fa-reply-all:before {
+ content: "\F122"; }
+
+.fa-star-half-empty:before, .fa-star-half-full:before, .fa-star-half-o:before {
+ content: "\F123"; }
+
+.fa-location-arrow:before {
+ content: "\F124"; }
+
+.fa-crop:before {
+ content: "\F125"; }
+
+.fa-code-fork:before {
+ content: "\F126"; }
+
+.fa-unlink:before, .fa-chain-broken:before {
+ content: "\F127"; }
+
+.fa-question:before {
+ content: "\F128"; }
+
+.fa-info:before {
+ content: "\F129"; }
+
+.fa-exclamation:before {
+ content: "\F12A"; }
+
+.fa-superscript:before {
+ content: "\F12B"; }
+
+.fa-subscript:before {
+ content: "\F12C"; }
+
+.fa-eraser:before {
+ content: "\F12D"; }
+
+.fa-puzzle-piece:before {
+ content: "\F12E"; }
+
+.fa-microphone:before {
+ content: "\F130"; }
+
+.fa-microphone-slash:before {
+ content: "\F131"; }
+
+.fa-shield:before {
+ content: "\F132"; }
+
+.fa-calendar-o:before {
+ content: "\F133"; }
+
+.fa-fire-extinguisher:before {
+ content: "\F134"; }
+
+.fa-rocket:before {
+ content: "\F135"; }
+
+.fa-maxcdn:before {
+ content: "\F136"; }
+
+.fa-chevron-circle-left:before {
+ content: "\F137"; }
+
+.fa-chevron-circle-right:before {
+ content: "\F138"; }
+
+.fa-chevron-circle-up:before {
+ content: "\F139"; }
+
+.fa-chevron-circle-down:before {
+ content: "\F13A"; }
+
+.fa-html5:before {
+ content: "\F13B"; }
+
+.fa-css3:before {
+ content: "\F13C"; }
+
+.fa-anchor:before {
+ content: "\F13D"; }
+
+.fa-unlock-alt:before {
+ content: "\F13E"; }
+
+.fa-bullseye:before {
+ content: "\F140"; }
+
+.fa-ellipsis-h:before {
+ content: "\F141"; }
+
+.fa-ellipsis-v:before {
+ content: "\F142"; }
+
+.fa-rss-square:before {
+ content: "\F143"; }
+
+.fa-play-circle:before {
+ content: "\F144"; }
+
+.fa-ticket:before {
+ content: "\F145"; }
+
+.fa-minus-square:before {
+ content: "\F146"; }
+
+.fa-minus-square-o:before {
+ content: "\F147"; }
+
+.fa-level-up:before {
+ content: "\F148"; }
+
+.fa-level-down:before {
+ content: "\F149"; }
+
+.fa-check-square:before {
+ content: "\F14A"; }
+
+.fa-pencil-square:before {
+ content: "\F14B"; }
+
+.fa-external-link-square:before {
+ content: "\F14C"; }
+
+.fa-share-square:before {
+ content: "\F14D"; }
+
+.fa-compass:before {
+ content: "\F14E"; }
+
+.fa-toggle-down:before, .fa-caret-square-o-down:before {
+ content: "\F150"; }
+
+.fa-toggle-up:before, .fa-caret-square-o-up:before {
+ content: "\F151"; }
+
+.fa-toggle-right:before, .fa-caret-square-o-right:before {
+ content: "\F152"; }
+
+.fa-euro:before, .fa-eur:before {
+ content: "\F153"; }
+
+.fa-gbp:before {
+ content: "\F154"; }
+
+.fa-dollar:before, .fa-usd:before {
+ content: "\F155"; }
+
+.fa-rupee:before, .fa-inr:before {
+ content: "\F156"; }
+
+.fa-cny:before, .fa-rmb:before, .fa-yen:before, .fa-jpy:before {
+ content: "\F157"; }
+
+.fa-ruble:before, .fa-rouble:before, .fa-rub:before {
+ content: "\F158"; }
+
+.fa-won:before, .fa-krw:before {
+ content: "\F159"; }
+
+.fa-bitcoin:before, .fa-btc:before {
+ content: "\F15A"; }
+
+.fa-file:before {
+ content: "\F15B"; }
+
+.fa-file-text:before {
+ content: "\F15C"; }
+
+.fa-sort-alpha-asc:before {
+ content: "\F15D"; }
+
+.fa-sort-alpha-desc:before {
+ content: "\F15E"; }
+
+.fa-sort-amount-asc:before {
+ content: "\F160"; }
+
+.fa-sort-amount-desc:before {
+ content: "\F161"; }
+
+.fa-sort-numeric-asc:before {
+ content: "\F162"; }
+
+.fa-sort-numeric-desc:before {
+ content: "\F163"; }
+
+.fa-thumbs-up:before {
+ content: "\F164"; }
+
+.fa-thumbs-down:before {
+ content: "\F165"; }
+
+.fa-youtube-square:before {
+ content: "\F166"; }
+
+.fa-youtube:before {
+ content: "\F167"; }
+
+.fa-xing:before {
+ content: "\F168"; }
+
+.fa-xing-square:before {
+ content: "\F169"; }
+
+.fa-youtube-play:before {
+ content: "\F16A"; }
+
+.fa-dropbox:before {
+ content: "\F16B"; }
+
+.fa-stack-overflow:before {
+ content: "\F16C"; }
+
+.fa-instagram:before {
+ content: "\F16D"; }
+
+.fa-flickr:before {
+ content: "\F16E"; }
+
+.fa-adn:before {
+ content: "\F170"; }
+
+.fa-bitbucket:before {
+ content: "\F171"; }
+
+.fa-bitbucket-square:before {
+ content: "\F172"; }
+
+.fa-tumblr:before {
+ content: "\F173"; }
+
+.fa-tumblr-square:before {
+ content: "\F174"; }
+
+.fa-long-arrow-down:before {
+ content: "\F175"; }
+
+.fa-long-arrow-up:before {
+ content: "\F176"; }
+
+.fa-long-arrow-left:before {
+ content: "\F177"; }
+
+.fa-long-arrow-right:before {
+ content: "\F178"; }
+
+.fa-apple:before {
+ content: "\F179"; }
+
+.fa-windows:before {
+ content: "\F17A"; }
+
+.fa-android:before {
+ content: "\F17B"; }
+
+.fa-linux:before {
+ content: "\F17C"; }
+
+.fa-dribbble:before {
+ content: "\F17D"; }
+
+.fa-skype:before {
+ content: "\F17E"; }
+
+.fa-foursquare:before {
+ content: "\F180"; }
+
+.fa-trello:before {
+ content: "\F181"; }
+
+.fa-female:before {
+ content: "\F182"; }
+
+.fa-male:before {
+ content: "\F183"; }
+
+.fa-gittip:before, .fa-gratipay:before {
+ content: "\F184"; }
+
+.fa-sun-o:before {
+ content: "\F185"; }
+
+.fa-moon-o:before {
+ content: "\F186"; }
+
+.fa-archive:before {
+ content: "\F187"; }
+
+.fa-bug:before {
+ content: "\F188"; }
+
+.fa-vk:before {
+ content: "\F189"; }
+
+.fa-weibo:before {
+ content: "\F18A"; }
+
+.fa-renren:before {
+ content: "\F18B"; }
+
+.fa-pagelines:before {
+ content: "\F18C"; }
+
+.fa-stack-exchange:before {
+ content: "\F18D"; }
+
+.fa-arrow-circle-o-right:before {
+ content: "\F18E"; }
+
+.fa-arrow-circle-o-left:before {
+ content: "\F190"; }
+
+.fa-toggle-left:before, .fa-caret-square-o-left:before {
+ content: "\F191"; }
+
+.fa-dot-circle-o:before {
+ content: "\F192"; }
+
+.fa-wheelchair:before {
+ content: "\F193"; }
+
+.fa-vimeo-square:before {
+ content: "\F194"; }
+
+.fa-turkish-lira:before, .fa-try:before {
+ content: "\F195"; }
+
+.fa-plus-square-o:before {
+ content: "\F196"; }
+
+.fa-space-shuttle:before {
+ content: "\F197"; }
+
+.fa-slack:before {
+ content: "\F198"; }
+
+.fa-envelope-square:before {
+ content: "\F199"; }
+
+.fa-wordpress:before {
+ content: "\F19A"; }
+
+.fa-openid:before {
+ content: "\F19B"; }
+
+.fa-institution:before, .fa-bank:before, .fa-university:before {
+ content: "\F19C"; }
+
+.fa-mortar-board:before, .fa-graduation-cap:before {
+ content: "\F19D"; }
+
+.fa-yahoo:before {
+ content: "\F19E"; }
+
+.fa-google:before {
+ content: "\F1A0"; }
+
+.fa-reddit:before {
+ content: "\F1A1"; }
+
+.fa-reddit-square:before {
+ content: "\F1A2"; }
+
+.fa-stumbleupon-circle:before {
+ content: "\F1A3"; }
+
+.fa-stumbleupon:before {
+ content: "\F1A4"; }
+
+.fa-delicious:before {
+ content: "\F1A5"; }
+
+.fa-digg:before {
+ content: "\F1A6"; }
+
+.fa-pied-piper-pp:before {
+ content: "\F1A7"; }
+
+.fa-pied-piper-alt:before {
+ content: "\F1A8"; }
+
+.fa-drupal:before {
+ content: "\F1A9"; }
+
+.fa-joomla:before {
+ content: "\F1AA"; }
+
+.fa-language:before {
+ content: "\F1AB"; }
+
+.fa-fax:before {
+ content: "\F1AC"; }
+
+.fa-building:before {
+ content: "\F1AD"; }
+
+.fa-child:before {
+ content: "\F1AE"; }
+
+.fa-paw:before {
+ content: "\F1B0"; }
+
+.fa-spoon:before {
+ content: "\F1B1"; }
+
+.fa-cube:before {
+ content: "\F1B2"; }
+
+.fa-cubes:before {
+ content: "\F1B3"; }
+
+.fa-behance:before {
+ content: "\F1B4"; }
+
+.fa-behance-square:before {
+ content: "\F1B5"; }
+
+.fa-steam:before {
+ content: "\F1B6"; }
+
+.fa-steam-square:before {
+ content: "\F1B7"; }
+
+.fa-recycle:before {
+ content: "\F1B8"; }
+
+.fa-automobile:before, .fa-car:before {
+ content: "\F1B9"; }
+
+.fa-cab:before, .fa-taxi:before {
+ content: "\F1BA"; }
+
+.fa-tree:before {
+ content: "\F1BB"; }
+
+.fa-spotify:before {
+ content: "\F1BC"; }
+
+.fa-deviantart:before {
+ content: "\F1BD"; }
+
+.fa-soundcloud:before {
+ content: "\F1BE"; }
+
+.fa-database:before {
+ content: "\F1C0"; }
+
+.fa-file-pdf-o:before {
+ content: "\F1C1"; }
+
+.fa-file-word-o:before {
+ content: "\F1C2"; }
+
+.fa-file-excel-o:before {
+ content: "\F1C3"; }
+
+.fa-file-powerpoint-o:before {
+ content: "\F1C4"; }
+
+.fa-file-photo-o:before, .fa-file-picture-o:before, .fa-file-image-o:before {
+ content: "\F1C5"; }
+
+.fa-file-zip-o:before, .fa-file-archive-o:before {
+ content: "\F1C6"; }
+
+.fa-file-sound-o:before, .fa-file-audio-o:before {
+ content: "\F1C7"; }
+
+.fa-file-movie-o:before, .fa-file-video-o:before {
+ content: "\F1C8"; }
+
+.fa-file-code-o:before {
+ content: "\F1C9"; }
+
+.fa-vine:before {
+ content: "\F1CA"; }
+
+.fa-codepen:before {
+ content: "\F1CB"; }
+
+.fa-jsfiddle:before {
+ content: "\F1CC"; }
+
+.fa-life-bouy:before, .fa-life-buoy:before, .fa-life-saver:before, .fa-support:before, .fa-life-ring:before {
+ content: "\F1CD"; }
+
+.fa-circle-o-notch:before {
+ content: "\F1CE"; }
+
+.fa-ra:before, .fa-resistance:before, .fa-rebel:before {
+ content: "\F1D0"; }
+
+.fa-ge:before, .fa-empire:before {
+ content: "\F1D1"; }
+
+.fa-git-square:before {
+ content: "\F1D2"; }
+
+.fa-git:before {
+ content: "\F1D3"; }
+
+.fa-y-combinator-square:before, .fa-yc-square:before, .fa-hacker-news:before {
+ content: "\F1D4"; }
+
+.fa-tencent-weibo:before {
+ content: "\F1D5"; }
+
+.fa-qq:before {
+ content: "\F1D6"; }
+
+.fa-wechat:before, .fa-weixin:before {
+ content: "\F1D7"; }
+
+.fa-send:before, .fa-paper-plane:before {
+ content: "\F1D8"; }
+
+.fa-send-o:before, .fa-paper-plane-o:before {
+ content: "\F1D9"; }
+
+.fa-history:before {
+ content: "\F1DA"; }
+
+.fa-circle-thin:before {
+ content: "\F1DB"; }
+
+.fa-header:before {
+ content: "\F1DC"; }
+
+.fa-paragraph:before {
+ content: "\F1DD"; }
+
+.fa-sliders:before {
+ content: "\F1DE"; }
+
+.fa-share-alt:before {
+ content: "\F1E0"; }
+
+.fa-share-alt-square:before {
+ content: "\F1E1"; }
+
+.fa-bomb:before {
+ content: "\F1E2"; }
+
+.fa-soccer-ball-o:before, .fa-futbol-o:before {
+ content: "\F1E3"; }
+
+.fa-tty:before {
+ content: "\F1E4"; }
+
+.fa-binoculars:before {
+ content: "\F1E5"; }
+
+.fa-plug:before {
+ content: "\F1E6"; }
+
+.fa-slideshare:before {
+ content: "\F1E7"; }
+
+.fa-twitch:before {
+ content: "\F1E8"; }
+
+.fa-yelp:before {
+ content: "\F1E9"; }
+
+.fa-newspaper-o:before {
+ content: "\F1EA"; }
+
+.fa-wifi:before {
+ content: "\F1EB"; }
+
+.fa-calculator:before {
+ content: "\F1EC"; }
+
+.fa-paypal:before {
+ content: "\F1ED"; }
+
+.fa-google-wallet:before {
+ content: "\F1EE"; }
+
+.fa-cc-visa:before {
+ content: "\F1F0"; }
+
+.fa-cc-mastercard:before {
+ content: "\F1F1"; }
+
+.fa-cc-discover:before {
+ content: "\F1F2"; }
+
+.fa-cc-amex:before {
+ content: "\F1F3"; }
+
+.fa-cc-paypal:before {
+ content: "\F1F4"; }
+
+.fa-cc-stripe:before {
+ content: "\F1F5"; }
+
+.fa-bell-slash:before {
+ content: "\F1F6"; }
+
+.fa-bell-slash-o:before {
+ content: "\F1F7"; }
+
+.fa-trash:before {
+ content: "\F1F8"; }
+
+.fa-copyright:before {
+ content: "\F1F9"; }
+
+.fa-at:before {
+ content: "\F1FA"; }
+
+.fa-eyedropper:before {
+ content: "\F1FB"; }
+
+.fa-paint-brush:before {
+ content: "\F1FC"; }
+
+.fa-birthday-cake:before {
+ content: "\F1FD"; }
+
+.fa-area-chart:before {
+ content: "\F1FE"; }
+
+.fa-pie-chart:before {
+ content: "\F200"; }
+
+.fa-line-chart:before {
+ content: "\F201"; }
+
+.fa-lastfm:before {
+ content: "\F202"; }
+
+.fa-lastfm-square:before {
+ content: "\F203"; }
+
+.fa-toggle-off:before {
+ content: "\F204"; }
+
+.fa-toggle-on:before {
+ content: "\F205"; }
+
+.fa-bicycle:before {
+ content: "\F206"; }
+
+.fa-bus:before {
+ content: "\F207"; }
+
+.fa-ioxhost:before {
+ content: "\F208"; }
+
+.fa-angellist:before {
+ content: "\F209"; }
+
+.fa-cc:before {
+ content: "\F20A"; }
+
+.fa-shekel:before, .fa-sheqel:before, .fa-ils:before {
+ content: "\F20B"; }
+
+.fa-meanpath:before {
+ content: "\F20C"; }
+
+.fa-buysellads:before {
+ content: "\F20D"; }
+
+.fa-connectdevelop:before {
+ content: "\F20E"; }
+
+.fa-dashcube:before {
+ content: "\F210"; }
+
+.fa-forumbee:before {
+ content: "\F211"; }
+
+.fa-leanpub:before {
+ content: "\F212"; }
+
+.fa-sellsy:before {
+ content: "\F213"; }
+
+.fa-shirtsinbulk:before {
+ content: "\F214"; }
+
+.fa-simplybuilt:before {
+ content: "\F215"; }
+
+.fa-skyatlas:before {
+ content: "\F216"; }
+
+.fa-cart-plus:before {
+ content: "\F217"; }
+
+.fa-cart-arrow-down:before {
+ content: "\F218"; }
+
+.fa-diamond:before {
+ content: "\F219"; }
+
+.fa-ship:before {
+ content: "\F21A"; }
+
+.fa-user-secret:before {
+ content: "\F21B"; }
+
+.fa-motorcycle:before {
+ content: "\F21C"; }
+
+.fa-street-view:before {
+ content: "\F21D"; }
+
+.fa-heartbeat:before {
+ content: "\F21E"; }
+
+.fa-venus:before {
+ content: "\F221"; }
+
+.fa-mars:before {
+ content: "\F222"; }
+
+.fa-mercury:before {
+ content: "\F223"; }
+
+.fa-intersex:before, .fa-transgender:before {
+ content: "\F224"; }
+
+.fa-transgender-alt:before {
+ content: "\F225"; }
+
+.fa-venus-double:before {
+ content: "\F226"; }
+
+.fa-mars-double:before {
+ content: "\F227"; }
+
+.fa-venus-mars:before {
+ content: "\F228"; }
+
+.fa-mars-stroke:before {
+ content: "\F229"; }
+
+.fa-mars-stroke-v:before {
+ content: "\F22A"; }
+
+.fa-mars-stroke-h:before {
+ content: "\F22B"; }
+
+.fa-neuter:before {
+ content: "\F22C"; }
+
+.fa-genderless:before {
+ content: "\F22D"; }
+
+.fa-facebook-official:before {
+ content: "\F230"; }
+
+.fa-pinterest-p:before {
+ content: "\F231"; }
+
+.fa-whatsapp:before {
+ content: "\F232"; }
+
+.fa-server:before {
+ content: "\F233"; }
+
+.fa-user-plus:before {
+ content: "\F234"; }
+
+.fa-user-times:before {
+ content: "\F235"; }
+
+.fa-hotel:before, .fa-bed:before {
+ content: "\F236"; }
+
+.fa-viacoin:before {
+ content: "\F237"; }
+
+.fa-train:before {
+ content: "\F238"; }
+
+.fa-subway:before {
+ content: "\F239"; }
+
+.fa-medium:before {
+ content: "\F23A"; }
+
+.fa-yc:before, .fa-y-combinator:before {
+ content: "\F23B"; }
+
+.fa-optin-monster:before {
+ content: "\F23C"; }
+
+.fa-opencart:before {
+ content: "\F23D"; }
+
+.fa-expeditedssl:before {
+ content: "\F23E"; }
+
+.fa-battery-4:before, .fa-battery:before, .fa-battery-full:before {
+ content: "\F240"; }
+
+.fa-battery-3:before, .fa-battery-three-quarters:before {
+ content: "\F241"; }
+
+.fa-battery-2:before, .fa-battery-half:before {
+ content: "\F242"; }
+
+.fa-battery-1:before, .fa-battery-quarter:before {
+ content: "\F243"; }
+
+.fa-battery-0:before, .fa-battery-empty:before {
+ content: "\F244"; }
+
+.fa-mouse-pointer:before {
+ content: "\F245"; }
+
+.fa-i-cursor:before {
+ content: "\F246"; }
+
+.fa-object-group:before {
+ content: "\F247"; }
+
+.fa-object-ungroup:before {
+ content: "\F248"; }
+
+.fa-sticky-note:before {
+ content: "\F249"; }
+
+.fa-sticky-note-o:before {
+ content: "\F24A"; }
+
+.fa-cc-jcb:before {
+ content: "\F24B"; }
+
+.fa-cc-diners-club:before {
+ content: "\F24C"; }
+
+.fa-clone:before {
+ content: "\F24D"; }
+
+.fa-balance-scale:before {
+ content: "\F24E"; }
+
+.fa-hourglass-o:before {
+ content: "\F250"; }
+
+.fa-hourglass-1:before, .fa-hourglass-start:before {
+ content: "\F251"; }
+
+.fa-hourglass-2:before, .fa-hourglass-half:before {
+ content: "\F252"; }
+
+.fa-hourglass-3:before, .fa-hourglass-end:before {
+ content: "\F253"; }
+
+.fa-hourglass:before {
+ content: "\F254"; }
+
+.fa-hand-grab-o:before, .fa-hand-rock-o:before {
+ content: "\F255"; }
+
+.fa-hand-stop-o:before, .fa-hand-paper-o:before {
+ content: "\F256"; }
+
+.fa-hand-scissors-o:before {
+ content: "\F257"; }
+
+.fa-hand-lizard-o:before {
+ content: "\F258"; }
+
+.fa-hand-spock-o:before {
+ content: "\F259"; }
+
+.fa-hand-pointer-o:before {
+ content: "\F25A"; }
+
+.fa-hand-peace-o:before {
+ content: "\F25B"; }
+
+.fa-trademark:before {
+ content: "\F25C"; }
+
+.fa-registered:before {
+ content: "\F25D"; }
+
+.fa-creative-commons:before {
+ content: "\F25E"; }
+
+.fa-gg:before {
+ content: "\F260"; }
+
+.fa-gg-circle:before {
+ content: "\F261"; }
+
+.fa-tripadvisor:before {
+ content: "\F262"; }
+
+.fa-odnoklassniki:before {
+ content: "\F263"; }
+
+.fa-odnoklassniki-square:before {
+ content: "\F264"; }
+
+.fa-get-pocket:before {
+ content: "\F265"; }
+
+.fa-wikipedia-w:before {
+ content: "\F266"; }
+
+.fa-safari:before {
+ content: "\F267"; }
+
+.fa-chrome:before {
+ content: "\F268"; }
+
+.fa-firefox:before {
+ content: "\F269"; }
+
+.fa-opera:before {
+ content: "\F26A"; }
+
+.fa-internet-explorer:before {
+ content: "\F26B"; }
+
+.fa-tv:before, .fa-television:before {
+ content: "\F26C"; }
+
+.fa-contao:before {
+ content: "\F26D"; }
+
+.fa-500px:before {
+ content: "\F26E"; }
+
+.fa-amazon:before {
+ content: "\F270"; }
+
+.fa-calendar-plus-o:before {
+ content: "\F271"; }
+
+.fa-calendar-minus-o:before {
+ content: "\F272"; }
+
+.fa-calendar-times-o:before {
+ content: "\F273"; }
+
+.fa-calendar-check-o:before {
+ content: "\F274"; }
+
+.fa-industry:before {
+ content: "\F275"; }
+
+.fa-map-pin:before {
+ content: "\F276"; }
+
+.fa-map-signs:before {
+ content: "\F277"; }
+
+.fa-map-o:before {
+ content: "\F278"; }
+
+.fa-map:before {
+ content: "\F279"; }
+
+.fa-commenting:before {
+ content: "\F27A"; }
+
+.fa-commenting-o:before {
+ content: "\F27B"; }
+
+.fa-houzz:before {
+ content: "\F27C"; }
+
+.fa-vimeo:before {
+ content: "\F27D"; }
+
+.fa-black-tie:before {
+ content: "\F27E"; }
+
+.fa-fonticons:before {
+ content: "\F280"; }
+
+.fa-reddit-alien:before {
+ content: "\F281"; }
+
+.fa-edge:before {
+ content: "\F282"; }
+
+.fa-credit-card-alt:before {
+ content: "\F283"; }
+
+.fa-codiepie:before {
+ content: "\F284"; }
+
+.fa-modx:before {
+ content: "\F285"; }
+
+.fa-fort-awesome:before {
+ content: "\F286"; }
+
+.fa-usb:before {
+ content: "\F287"; }
+
+.fa-product-hunt:before {
+ content: "\F288"; }
+
+.fa-mixcloud:before {
+ content: "\F289"; }
+
+.fa-scribd:before {
+ content: "\F28A"; }
+
+.fa-pause-circle:before {
+ content: "\F28B"; }
+
+.fa-pause-circle-o:before {
+ content: "\F28C"; }
+
+.fa-stop-circle:before {
+ content: "\F28D"; }
+
+.fa-stop-circle-o:before {
+ content: "\F28E"; }
+
+.fa-shopping-bag:before {
+ content: "\F290"; }
+
+.fa-shopping-basket:before {
+ content: "\F291"; }
+
+.fa-hashtag:before {
+ content: "\F292"; }
+
+.fa-bluetooth:before {
+ content: "\F293"; }
+
+.fa-bluetooth-b:before {
+ content: "\F294"; }
+
+.fa-percent:before {
+ content: "\F295"; }
+
+.fa-gitlab:before {
+ content: "\F296"; }
+
+.fa-wpbeginner:before {
+ content: "\F297"; }
+
+.fa-wpforms:before {
+ content: "\F298"; }
+
+.fa-envira:before {
+ content: "\F299"; }
+
+.fa-universal-access:before {
+ content: "\F29A"; }
+
+.fa-wheelchair-alt:before {
+ content: "\F29B"; }
+
+.fa-question-circle-o:before {
+ content: "\F29C"; }
+
+.fa-blind:before {
+ content: "\F29D"; }
+
+.fa-audio-description:before {
+ content: "\F29E"; }
+
+.fa-volume-control-phone:before {
+ content: "\F2A0"; }
+
+.fa-braille:before {
+ content: "\F2A1"; }
+
+.fa-assistive-listening-systems:before {
+ content: "\F2A2"; }
+
+.fa-asl-interpreting:before, .fa-american-sign-language-interpreting:before {
+ content: "\F2A3"; }
+
+.fa-deafness:before, .fa-hard-of-hearing:before, .fa-deaf:before {
+ content: "\F2A4"; }
+
+.fa-glide:before {
+ content: "\F2A5"; }
+
+.fa-glide-g:before {
+ content: "\F2A6"; }
+
+.fa-signing:before, .fa-sign-language:before {
+ content: "\F2A7"; }
+
+.fa-low-vision:before {
+ content: "\F2A8"; }
+
+.fa-viadeo:before {
+ content: "\F2A9"; }
+
+.fa-viadeo-square:before {
+ content: "\F2AA"; }
+
+.fa-snapchat:before {
+ content: "\F2AB"; }
+
+.fa-snapchat-ghost:before {
+ content: "\F2AC"; }
+
+.fa-snapchat-square:before {
+ content: "\F2AD"; }
+
+.fa-pied-piper:before {
+ content: "\F2AE"; }
+
+.fa-first-order:before {
+ content: "\F2B0"; }
+
+.fa-yoast:before {
+ content: "\F2B1"; }
+
+.fa-themeisle:before {
+ content: "\F2B2"; }
+
+.fa-google-plus-circle:before, .fa-google-plus-official:before {
+ content: "\F2B3"; }
+
+.fa-fa:before, .fa-font-awesome:before {
+ content: "\F2B4"; }
+
+.fa-handshake-o:before {
+ content: "\F2B5"; }
+
+.fa-envelope-open:before {
+ content: "\F2B6"; }
+
+.fa-envelope-open-o:before {
+ content: "\F2B7"; }
+
+.fa-linode:before {
+ content: "\F2B8"; }
+
+.fa-address-book:before {
+ content: "\F2B9"; }
+
+.fa-address-book-o:before {
+ content: "\F2BA"; }
+
+.fa-vcard:before, .fa-address-card:before {
+ content: "\F2BB"; }
+
+.fa-vcard-o:before, .fa-address-card-o:before {
+ content: "\F2BC"; }
+
+.fa-user-circle:before {
+ content: "\F2BD"; }
+
+.fa-user-circle-o:before {
+ content: "\F2BE"; }
+
+.fa-user-o:before {
+ content: "\F2C0"; }
+
+.fa-id-badge:before {
+ content: "\F2C1"; }
+
+.fa-drivers-license:before, .fa-id-card:before {
+ content: "\F2C2"; }
+
+.fa-drivers-license-o:before, .fa-id-card-o:before {
+ content: "\F2C3"; }
+
+.fa-quora:before {
+ content: "\F2C4"; }
+
+.fa-free-code-camp:before {
+ content: "\F2C5"; }
+
+.fa-telegram:before {
+ content: "\F2C6"; }
+
+.fa-thermometer-4:before, .fa-thermometer:before, .fa-thermometer-full:before {
+ content: "\F2C7"; }
+
+.fa-thermometer-3:before, .fa-thermometer-three-quarters:before {
+ content: "\F2C8"; }
+
+.fa-thermometer-2:before, .fa-thermometer-half:before {
+ content: "\F2C9"; }
+
+.fa-thermometer-1:before, .fa-thermometer-quarter:before {
+ content: "\F2CA"; }
+
+.fa-thermometer-0:before, .fa-thermometer-empty:before {
+ content: "\F2CB"; }
+
+.fa-shower:before {
+ content: "\F2CC"; }
+
+.fa-bathtub:before, .fa-s15:before, .fa-bath:before {
+ content: "\F2CD"; }
+
+.fa-podcast:before {
+ content: "\F2CE"; }
+
+.fa-window-maximize:before {
+ content: "\F2D0"; }
+
+.fa-window-minimize:before {
+ content: "\F2D1"; }
+
+.fa-window-restore:before {
+ content: "\F2D2"; }
+
+.fa-times-rectangle:before, .fa-window-close:before {
+ content: "\F2D3"; }
+
+.fa-times-rectangle-o:before, .fa-window-close-o:before {
+ content: "\F2D4"; }
+
+.fa-bandcamp:before {
+ content: "\F2D5"; }
+
+.fa-grav:before {
+ content: "\F2D6"; }
+
+.fa-etsy:before {
+ content: "\F2D7"; }
+
+.fa-imdb:before {
+ content: "\F2D8"; }
+
+.fa-ravelry:before {
+ content: "\F2D9"; }
+
+.fa-eercast:before {
+ content: "\F2DA"; }
+
+.fa-microchip:before {
+ content: "\F2DB"; }
+
+.fa-snowflake-o:before {
+ content: "\F2DC"; }
+
+.fa-superpowers:before {
+ content: "\F2DD"; }
+
+.fa-wpexplorer:before {
+ content: "\F2DE"; }
+
+.fa-meetup:before {
+ content: "\F2E0"; }
+
+.sr-only {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ margin: -1px;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ border: 0; }
+
+.sr-only-focusable:active, .sr-only-focusable:focus {
+ position: static;
+ width: auto;
+ height: auto;
+ margin: 0;
+ overflow: visible;
+ clip: auto; }
+html {
+ position: relative;
+ min-height: 100%; }
+
+body {
+ overflow-x: hidden; }
+
+body.sticky-footer {
+ margin-bottom: 56px; }
+ body.sticky-footer .content-wrapper {
+ min-height: calc(100vh - 56px - 56px); }
+
+body.fixed-nav {
+ padding-top: 56px; }
+
+.content-wrapper {
+ min-height: calc(100vh - 56px);
+ padding: 2rem; }
+
+pre {
+ background-color: #e9ecef;
+ padding: 1.5rem;
+ white-space: pre-wrap;
+ overflow: auto; }
+
+.smaller {
+ font-size: 0.7rem; }
+
+.larger {
+ font-size: 1.25rem; }
+
+.o-hidden {
+ overflow: hidden !important; }
+
+.z-0 {
+ z-index: 0; }
+
+.z-1 {
+ z-index: 1; }
+
+.jumbotron .update-tabs tr {
+ cursor: pointer; }
+ .jumbotron .update-tabs tr:hover {
+ color: tomato; }
+
+#mainNav .navbar-collapse {
+ overflow: auto;
+ max-height: 75vh; }
+ #mainNav .navbar-collapse .navbar-nav .nav-item .nav-link {
+ cursor: pointer; }
+ #mainNav .navbar-collapse .navbar-sidenav .nav-link-collapse:after {
+ float: right;
+ content: '\F107';
+ font-family: 'FontAwesome'; }
+ #mainNav .navbar-collapse .navbar-sidenav .nav-link-collapse.collapsed:after {
+ content: '\F105'; }
+ #mainNav .navbar-collapse .navbar-sidenav .sidenav-second-level,
+ #mainNav .navbar-collapse .navbar-sidenav .sidenav-third-level {
+ padding-left: 0; }
+ #mainNav .navbar-collapse .navbar-sidenav .sidenav-second-level > li > a,
+ #mainNav .navbar-collapse .navbar-sidenav .sidenav-third-level > li > a {
+ display: block;
+ padding: 0.5em 0; }
+ #mainNav .navbar-collapse .navbar-sidenav .sidenav-second-level > li > a:focus, #mainNav .navbar-collapse .navbar-sidenav .sidenav-second-level > li > a:hover,
+ #mainNav .navbar-collapse .navbar-sidenav .sidenav-third-level > li > a:focus,
+ #mainNav .navbar-collapse .navbar-sidenav .sidenav-third-level > li > a:hover {
+ text-decoration: none; }
+ #mainNav .navbar-collapse .navbar-sidenav .sidenav-second-level > li > a {
+ padding-left: 1em; }
+ #mainNav .navbar-collapse .navbar-sidenav .sidenav-third-level > li > a {
+ padding-left: 2em; }
+ #mainNav .navbar-collapse .sidenav-toggler {
+ display: none; }
+ #mainNav .navbar-collapse .navbar-nav > .nav-item.dropdown > .nav-link {
+ position: relative;
+ min-width: 45px; }
+ #mainNav .navbar-collapse .navbar-nav > .nav-item.dropdown > .nav-link:after {
+ float: right;
+ width: auto;
+ content: '\F105';
+ border: none;
+ font-family: 'FontAwesome'; }
+ #mainNav .navbar-collapse .navbar-nav > .nav-item.dropdown > .nav-link .indicator {
+ position: absolute;
+ top: 5px;
+ left: 21px;
+ font-size: 10px; }
+ #mainNav .navbar-collapse .navbar-nav > .nav-item.dropdown.show > .nav-link:after {
+ content: '\F107'; }
+ #mainNav .navbar-collapse .navbar-nav > .nav-item.dropdown .dropdown-menu > .dropdown-item > .dropdown-message {
+ overflow: hidden;
+ max-width: none;
+ text-overflow: ellipsis; }
+
+@media (min-width: 992px) {
+ #mainNav .navbar-brand {
+ width: 150px; }
+ #mainNav .navbar-collapse {
+ overflow: visible;
+ max-height: none; }
+ #mainNav .navbar-collapse .navbar-sidenav {
+ position: absolute;
+ top: 0;
+ left: 0;
+ -webkit-flex-direction: column;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ margin-top: 56px; }
+ #mainNav .navbar-collapse .navbar-sidenav > .nav-item {
+ width: 150px;
+ padding: 0; }
+ #mainNav .navbar-collapse .navbar-sidenav > .nav-item > .nav-link {
+ padding: 1em; }
+ #mainNav .navbar-collapse .navbar-sidenav > .nav-item .sidenav-second-level,
+ #mainNav .navbar-collapse .navbar-sidenav > .nav-item .sidenav-third-level {
+ padding-left: 0;
+ list-style: none; }
+ #mainNav .navbar-collapse .navbar-sidenav > .nav-item .sidenav-second-level > li,
+ #mainNav .navbar-collapse .navbar-sidenav > .nav-item .sidenav-third-level > li {
+ width: 150px; }
+ #mainNav .navbar-collapse .navbar-sidenav > .nav-item .sidenav-second-level > li > a,
+ #mainNav .navbar-collapse .navbar-sidenav > .nav-item .sidenav-third-level > li > a {
+ padding: 1em; }
+ #mainNav .navbar-collapse .navbar-sidenav > .nav-item .sidenav-second-level > li > a {
+ padding-left: 2.75em; }
+ #mainNav .navbar-collapse .navbar-sidenav > .nav-item .sidenav-third-level > li > a {
+ padding-left: 3.75em; }
+ #mainNav .navbar-collapse .navbar-nav > .nav-item.dropdown > .nav-link {
+ min-width: 0; }
+ #mainNav .navbar-collapse .navbar-nav > .nav-item.dropdown > .nav-link:after {
+ width: 24px;
+ text-align: center; }
+ #mainNav .navbar-collapse .navbar-nav > .nav-item.dropdown .dropdown-menu > .dropdown-item > .dropdown-message {
+ max-width: 300px; } }
+
+#mainNav.fixed-top .sidenav-toggler {
+ display: none; }
+
+@media (min-width: 992px) {
+ #mainNav.fixed-top .navbar-sidenav {
+ height: calc(100vh - 112px); }
+ #mainNav.fixed-top .sidenav-toggler {
+ position: absolute;
+ top: 0;
+ left: 0;
+ display: flex;
+ -webkit-flex-direction: column;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ margin-top: calc(100vh - 56px); }
+ #mainNav.fixed-top .sidenav-toggler > .nav-item {
+ width: 150px;
+ padding: 0; }
+ #mainNav.fixed-top .sidenav-toggler > .nav-item > .nav-link {
+ padding: 1em; } }
+
+#mainNav.fixed-top.navbar-light .sidenav-toggler {
+ background-color: #dee2e6; }
+ #mainNav.fixed-top.navbar-light .sidenav-toggler a i {
+ color: rgba(0, 0, 0, 0.5); }
+
+body.sidenav-toggled #mainNav.fixed-top .sidenav-toggler {
+ overflow-x: hidden;
+ width: 55px; }
+ body.sidenav-toggled #mainNav.fixed-top .sidenav-toggler .nav-item,
+ body.sidenav-toggled #mainNav.fixed-top .sidenav-toggler .nav-link {
+ width: 55px !important; }
+
+body.sidenav-toggled #mainNav.fixed-top #sidenavToggler i {
+ -webkit-transform: scaleX(-1);
+ -moz-transform: scaleX(-1);
+ -o-transform: scaleX(-1);
+ transform: scaleX(-1);
+ filter: FlipH;
+ -ms-filter: 'FlipH'; }
+
+#mainNav.static-top .sidenav-toggler {
+ display: none; }
+
+@media (min-width: 992px) {
+ #mainNav.static-top .sidenav-toggler {
+ display: flex; } }
+
+body.sidenav-toggled #mainNav.static-top #sidenavToggler i {
+ -webkit-transform: scaleX(-1);
+ -moz-transform: scaleX(-1);
+ -o-transform: scaleX(-1);
+ transform: scaleX(-1);
+ filter: FlipH;
+ -ms-filter: 'FlipH'; }
+
+.content-wrapper {
+ overflow-x: hidden;
+ background: white; }
+ @media (min-width: 992px) {
+ .content-wrapper {
+ margin-left: 150px; } }
+
+#sidenavToggler i {
+ font-weight: 800; }
+
+.navbar-sidenav-tooltip.show {
+ display: none; }
+
+@media (min-width: 992px) {
+ body.sidenav-toggled .content-wrapper {
+ margin-left: 55px; } }
+
+body.sidenav-toggled .navbar-sidenav {
+ width: 55px; }
+ body.sidenav-toggled .navbar-sidenav .nav-link-text {
+ display: none; }
+ body.sidenav-toggled .navbar-sidenav .nav-item,
+ body.sidenav-toggled .navbar-sidenav .nav-link {
+ width: 55px !important; }
+ body.sidenav-toggled .navbar-sidenav .nav-item:after,
+ body.sidenav-toggled .navbar-sidenav .nav-link:after {
+ display: none; }
+ body.sidenav-toggled .navbar-sidenav .nav-item {
+ white-space: nowrap; }
+
+body.sidenav-toggled .navbar-sidenav-tooltip.show {
+ display: flex; }
+
+#mainNav.navbar-dark .navbar-collapse .navbar-sidenav .nav-link-collapse:after {
+ color: #868e96; }
+
+#mainNav.navbar-dark .navbar-collapse .navbar-sidenav > .nav-item > .nav-link {
+ color: #868e96; }
+ #mainNav.navbar-dark .navbar-collapse .navbar-sidenav > .nav-item > .nav-link:hover {
+ color: #adb5bd; }
+
+#mainNav.navbar-dark .navbar-collapse .navbar-sidenav > .nav-item .sidenav-second-level > li > a,
+#mainNav.navbar-dark .navbar-collapse .navbar-sidenav > .nav-item .sidenav-third-level > li > a {
+ color: #868e96; }
+ #mainNav.navbar-dark .navbar-collapse .navbar-sidenav > .nav-item .sidenav-second-level > li > a:focus, #mainNav.navbar-dark .navbar-collapse .navbar-sidenav > .nav-item .sidenav-second-level > li > a:hover,
+ #mainNav.navbar-dark .navbar-collapse .navbar-sidenav > .nav-item .sidenav-third-level > li > a:focus,
+ #mainNav.navbar-dark .navbar-collapse .navbar-sidenav > .nav-item .sidenav-third-level > li > a:hover {
+ color: #adb5bd; }
+
+#mainNav.navbar-dark .navbar-collapse .navbar-nav > .nav-item.dropdown > .nav-link:after {
+ color: #adb5bd; }
+
+@media (min-width: 992px) {
+ #mainNav.navbar-dark .navbar-collapse .navbar-sidenav {
+ background: #adb5bd; }
+ #mainNav.navbar-dark .navbar-collapse .navbar-sidenav li.active a {
+ color: white !important;
+ background-color: #495057; }
+ #mainNav.navbar-dark .navbar-collapse .navbar-sidenav li.active a:focus, #mainNav.navbar-dark .navbar-collapse .navbar-sidenav li.active a:hover {
+ color: white; }
+ #mainNav.navbar-dark .navbar-collapse .navbar-sidenav > .nav-item .sidenav-second-level,
+ #mainNav.navbar-dark .navbar-collapse .navbar-sidenav > .nav-item .sidenav-third-level {
+ background: #343a40; } }
+
+#mainNav.navbar-light .navbar-collapse .navbar-sidenav .nav-link-collapse:after {
+ color: rgba(0, 0, 0, 0.5); }
+
+#mainNav.navbar-light .navbar-collapse .navbar-sidenav > .nav-item > .nav-link {
+ color: rgba(0, 0, 0, 0.5); }
+ #mainNav.navbar-light .navbar-collapse .navbar-sidenav > .nav-item > .nav-link:hover {
+ color: rgba(0, 0, 0, 0.7); }
+
+#mainNav.navbar-light .navbar-collapse .navbar-sidenav > .nav-item .sidenav-second-level > li > a,
+#mainNav.navbar-light .navbar-collapse .navbar-sidenav > .nav-item .sidenav-third-level > li > a {
+ color: rgba(0, 0, 0, 0.5); }
+ #mainNav.navbar-light .navbar-collapse .navbar-sidenav > .nav-item .sidenav-second-level > li > a:focus, #mainNav.navbar-light .navbar-collapse .navbar-sidenav > .nav-item .sidenav-second-level > li > a:hover,
+ #mainNav.navbar-light .navbar-collapse .navbar-sidenav > .nav-item .sidenav-third-level > li > a:focus,
+ #mainNav.navbar-light .navbar-collapse .navbar-sidenav > .nav-item .sidenav-third-level > li > a:hover {
+ color: rgba(0, 0, 0, 0.7); }
+
+#mainNav.navbar-light .navbar-collapse .navbar-nav > .nav-item.dropdown > .nav-link:after {
+ color: rgba(0, 0, 0, 0.5); }
+
+@media (min-width: 992px) {
+ #mainNav.navbar-light .navbar-collapse .navbar-sidenav {
+ background: #f8f9fa; }
+ #mainNav.navbar-light .navbar-collapse .navbar-sidenav li.active a {
+ color: #000 !important;
+ background-color: #e9ecef; }
+ #mainNav.navbar-light .navbar-collapse .navbar-sidenav li.active a:focus, #mainNav.navbar-light .navbar-collapse .navbar-sidenav li.active a:hover {
+ color: #000; }
+ #mainNav.navbar-light .navbar-collapse .navbar-sidenav > .nav-item .sidenav-second-level,
+ #mainNav.navbar-light .navbar-collapse .navbar-sidenav > .nav-item .sidenav-third-level {
+ background: #f8f9fa; } }
+
+.palet-red-gray {
+ background-color: #dc3545;
+ color: white; }
+ .palet-red-gray .content-wrapper {
+ color: black; }
+ .palet-red-gray #mainNav a {
+ color: white; }
+ .palet-red-gray .navbar-toggler {
+ color: white; }
+ .palet-red-gray .sidenav-toggler {
+ background-color: #dc3545; }
+ .palet-red-gray .sidenav-toggler a i {
+ color: white; }
+ .palet-red-gray #menu {
+ background-color: #495057; }
+ .palet-red-gray #menu li a {
+ color: white; }
+ .palet-red-gray #menu li a :hover {
+ color: #dc3545; }
+ .palet-red-gray #menu li a.active {
+ color: #dc3545; }
+ .palet-red-gray #menu .nav-link-collapse:after {
+ color: #868e96; }
+ .palet-red-gray .sticky-footer {
+ background-color: #dee2e6; }
+ .palet-red-gray .sticky-footer a {
+ color: #868e96;
+ text-decoration: none; }
+ .palet-red-gray .sticky-footer a :hover {
+ color: red; }
+
+.palet-green-gray {
+ background-color: #478856;
+ color: white; }
+ .palet-green-gray .content-wrapper {
+ color: black; }
+ .palet-green-gray #mainNav a {
+ color: white; }
+ .palet-green-gray .navbar-toggler {
+ color: white; }
+ .palet-green-gray .sidenav-toggler {
+ background-color: #478856; }
+ .palet-green-gray .sidenav-toggler a i {
+ color: white; }
+ .palet-green-gray #menu {
+ background-color: #d0ceda; }
+ .palet-green-gray #menu li a {
+ color: #333333; }
+ .palet-green-gray #menu li a :hover {
+ color: #dc3545; }
+ .palet-green-gray #menu li a.active {
+ color: #dc3545; }
+ .palet-green-gray #menu .nav-link-collapse:after {
+ color: #868e96; }
+ .palet-green-gray .sticky-footer {
+ background-color: #dfdee6; }
+ .palet-green-gray .sticky-footer a {
+ color: #868e96;
+ text-decoration: none; }
+ .palet-green-gray .sticky-footer a :hover {
+ color: #dc3545; }
+
+.palet-cyan-gray {
+ background-color: #318f9e;
+ color: white; }
+ .palet-cyan-gray .content-wrapper {
+ color: black; }
+ .palet-cyan-gray #mainNav a {
+ color: white; }
+ .palet-cyan-gray .navbar-toggler {
+ color: white; }
+ .palet-cyan-gray .sidenav-toggler {
+ background-color: #318f9e; }
+ .palet-cyan-gray .sidenav-toggler a i {
+ color: white; }
+ .palet-cyan-gray #menu {
+ background-color: #6d7a86; }
+ .palet-cyan-gray #menu li a {
+ color: #e6e6e6; }
+ .palet-cyan-gray #menu li a :hover {
+ color: #66121a; }
+ .palet-cyan-gray #menu li a.active {
+ color: #66121a; }
+ .palet-cyan-gray #menu .nav-link-collapse:after {
+ color: #868e96; }
+ .palet-cyan-gray .sticky-footer {
+ background-color: #ced4da; }
+ .palet-cyan-gray .sticky-footer a {
+ color: #495057;
+ text-decoration: none; }
+ .palet-cyan-gray .sticky-footer a :hover {
+ color: #dc3545; }
+
+.palet-yellow-gray {
+ background-color: #e0b226;
+ color: white; }
+ .palet-yellow-gray .content-wrapper {
+ color: black; }
+ .palet-yellow-gray #mainNav a {
+ color: white; }
+ .palet-yellow-gray .navbar-toggler {
+ color: white; }
+ .palet-yellow-gray .sidenav-toggler {
+ background-color: #e0b226; }
+ .palet-yellow-gray .sidenav-toggler a i {
+ color: white; }
+ .palet-yellow-gray #menu {
+ background-color: #868796; }
+ .palet-yellow-gray #menu li a {
+ color: #e6e6e6; }
+ .palet-yellow-gray #menu li a :hover {
+ color: #66121a; }
+ .palet-yellow-gray #menu li a.active {
+ color: #66121a; }
+ .palet-yellow-gray #menu .nav-link-collapse:after {
+ color: #868e96; }
+ .palet-yellow-gray .sticky-footer {
+ background-color: #cfceda; }
+ .palet-yellow-gray .sticky-footer a {
+ color: #495057;
+ text-decoration: none; }
+ .palet-yellow-gray .sticky-footer a :hover {
+ color: #dc3545; }
+
+.palet-tomato-gray {
+ background-color: tomato;
+ color: white; }
+ .palet-tomato-gray .content-wrapper {
+ color: black; }
+ .palet-tomato-gray #mainNav a {
+ color: white; }
+ .palet-tomato-gray .navbar-toggler {
+ color: white; }
+ .palet-tomato-gray .sidenav-toggler {
+ background-color: tomato; }
+ .palet-tomato-gray .sidenav-toggler a i {
+ color: white; }
+ .palet-tomato-gray #menu {
+ background-color: #869099; }
+ .palet-tomato-gray #menu li a {
+ color: #e6e6e6; }
+ .palet-tomato-gray #menu li a :hover {
+ color: #66121a; }
+ .palet-tomato-gray #menu li a.active {
+ color: #66121a; }
+ .palet-tomato-gray #menu .nav-link-collapse:after {
+ color: #868e96; }
+ .palet-tomato-gray .sticky-footer {
+ background-color: #bdc1c5; }
+ .palet-tomato-gray .sticky-footer a {
+ color: #495057;
+ text-decoration: none; }
+ .palet-tomato-gray .sticky-footer a :hover {
+ color: #dc3545; }
+
+.card-body-icon {
+ position: absolute;
+ z-index: 0;
+ top: -5px;
+ right: -5px;
+ font-size: 2rem;
+ -webkit-transform: rotate(15deg);
+ -ms-transform: rotate(15deg);
+ transform: rotate(15deg);
+ overflow: hidden; }
+
+@media (min-width: 576px) {
+ .card-columns {
+ column-count: 1; } }
+
+@media (min-width: 768px) {
+ .card-columns {
+ column-count: 2; } }
+
+@media (min-width: 1200px) {
+ .card-columns {
+ column-count: 2; } }
+
+footer.sticky-footer {
+ position: absolute;
+ right: 0;
+ bottom: 0;
+ width: 100%;
+ height: 56px;
+ line-height: 55px; }
+ @media (min-width: 992px) {
+ footer.sticky-footer {
+ width: calc(100% - 150px); } }
+
+@media (min-width: 992px) {
+ body.sidenav-toggled footer.sticky-footer {
+ width: calc(100% - 55px); } }
+
+.nav-tabs--vertical {
+ border-bottom: none;
+ border-right: 1px solid #ddd;
+ display: flex;
+ flex-flow: column nowrap; }
+
+.nav-tabs--left {
+ margin: 0 15px; }
+ .nav-tabs--left .nav-item + .nav-item {
+ margin-top: .25rem; }
+ .nav-tabs--left .nav-link {
+ transition: border-color .125s ease-in;
+ white-space: nowrap;
+ color: #318f9e; }
+ .nav-tabs--left .nav-link:hover {
+ background-color: #f7f7f7;
+ border-color: transparent;
+ color: #be535d; }
+ .nav-tabs--left .nav-link.active {
+ border-bottom-color: #ddd;
+ border-right-color: #fff;
+ border-bottom-left-radius: 0.25rem;
+ border-top-right-radius: 0;
+ margin-right: -1px;
+ color: #d4ab32; }
+ .nav-tabs--left .nav-link.active:hover {
+ background-color: #fff;
+ border-color: #318f9e #fff #318f9e #318f9e; }
+/**
+* Spinners
+*
+* @see http://tobiasahlin.com/spinkit/
+*/
+.spinner-cube-grid {
+ width: 40px;
+ height: 40px; }
+
+.spinner-cube-grid .sk-cube {
+ width: 33%;
+ height: 33%;
+ background-color: #333;
+ float: left;
+ -webkit-animation: sk-cubeGridScaleDelay 1.3s infinite ease-in-out;
+ animation: sk-cubeGridScaleDelay 1.3s infinite ease-in-out; }
+
+.spinner-cube-grid .sk-cube1 {
+ -webkit-animation-delay: 0.2s;
+ animation-delay: 0.2s; }
+
+.spinner-cube-grid .sk-cube2 {
+ -webkit-animation-delay: 0.3s;
+ animation-delay: 0.3s; }
+
+.spinner-cube-grid .sk-cube3 {
+ -webkit-animation-delay: 0.4s;
+ animation-delay: 0.4s; }
+
+.spinner-cube-grid .sk-cube4 {
+ -webkit-animation-delay: 0.1s;
+ animation-delay: 0.1s; }
+
+.spinner-cube-grid .sk-cube5 {
+ -webkit-animation-delay: 0.2s;
+ animation-delay: 0.2s; }
+
+.spinner-cube-grid .sk-cube6 {
+ -webkit-animation-delay: 0.3s;
+ animation-delay: 0.3s; }
+
+.spinner-cube-grid .sk-cube7 {
+ -webkit-animation-delay: 0s;
+ animation-delay: 0s; }
+
+.spinner-cube-grid .sk-cube8 {
+ -webkit-animation-delay: 0.1s;
+ animation-delay: 0.1s; }
+
+.spinner-cube-grid .sk-cube9 {
+ -webkit-animation-delay: 0.2s;
+ animation-delay: 0.2s; }
+
+@-webkit-keyframes sk-cubeGridScaleDelay {
+ 0%, 70%, 100% {
+ -webkit-transform: scale3D(1, 1, 1);
+ transform: scale3D(1, 1, 1); }
+ 35% {
+ -webkit-transform: scale3D(0, 0, 1);
+ transform: scale3D(0, 0, 1); } }
+
+@keyframes sk-cubeGridScaleDelay {
+ 0%, 70%, 100% {
+ -webkit-transform: scale3D(1, 1, 1);
+ transform: scale3D(1, 1, 1); }
+ 35% {
+ -webkit-transform: scale3D(0, 0, 1);
+ transform: scale3D(0, 0, 1); } }
+
+.spinner-circle-line {
+ margin: 10px auto 0;
+ width: 70px;
+ text-align: center; }
+
+.spinner-circle-line > div {
+ width: 18px;
+ height: 18px;
+ background-color: #333;
+ border-radius: 100%;
+ display: inline-block;
+ -webkit-animation: sk-bouncedelay 1.4s infinite ease-in-out both;
+ animation: sk-bouncedelay 1.4s infinite ease-in-out both; }
+
+.spinner-circle-line .bounce1 {
+ -webkit-animation-delay: -0.32s;
+ animation-delay: -0.32s; }
+
+.spinner-circle-line .bounce2 {
+ -webkit-animation-delay: -0.16s;
+ animation-delay: -0.16s; }
+
+@-webkit-keyframes sk-bouncedelay {
+ 0%, 80%, 100% {
+ -webkit-transform: scale(0); }
+ 40% {
+ -webkit-transform: scale(1); } }
+
+@keyframes sk-bouncedelay {
+ 0%, 80%, 100% {
+ -webkit-transform: scale(0);
+ transform: scale(0); }
+ 40% {
+ -webkit-transform: scale(1);
+ transform: scale(1); } }
+
+.spinner-circles {
+ width: 40px;
+ height: 40px;
+ position: relative;
+ text-align: center;
+ -webkit-animation: sk-rotate 2.0s infinite linear;
+ animation: sk-rotate 2.0s infinite linear; }
+
+.dot1, .dot2 {
+ width: 60%;
+ height: 60%;
+ display: inline-block;
+ position: absolute;
+ top: 0;
+ background-color: #333;
+ border-radius: 100%;
+ -webkit-animation: sk-bounce 2.0s infinite ease-in-out;
+ animation: sk-bounce 2.0s infinite ease-in-out; }
+
+.dot2 {
+ top: auto;
+ bottom: 0;
+ -webkit-animation-delay: -1.0s;
+ animation-delay: -1.0s; }
+
+@-webkit-keyframes sk-rotate {
+ 100% {
+ -webkit-transform: rotate(360deg); } }
+
+@keyframes sk-rotate {
+ 100% {
+ transform: rotate(360deg);
+ -webkit-transform: rotate(360deg); } }
+
+@-webkit-keyframes sk-bounce {
+ 0%, 100% {
+ -webkit-transform: scale(0); }
+ 50% {
+ -webkit-transform: scale(1); } }
+
+@keyframes sk-bounce {
+ 0%, 100% {
+ transform: scale(0);
+ -webkit-transform: scale(0); }
+ 50% {
+ transform: scale(1);
+ -webkit-transform: scale(1); } }
+
+/* Cube */
+.spinner-cube {
+ width: 40px;
+ height: 40px;
+ background-color: #333;
+ margin: 100px auto;
+ -webkit-animation: sk-rotateplane 1.2s infinite ease-in-out;
+ animation: sk-rotateplane 1.2s infinite ease-in-out; }
+
+@-webkit-keyframes sk-rotateplane {
+ 0% {
+ -webkit-transform: perspective(120px); }
+ 50% {
+ -webkit-transform: perspective(120px) rotateY(180deg); }
+ 100% {
+ -webkit-transform: perspective(120px) rotateY(180deg) rotateX(180deg); } }
+
+@keyframes sk-rotateplane {
+ 0% {
+ transform: perspective(120px) rotateX(0deg) rotateY(0deg);
+ -webkit-transform: perspective(120px) rotateX(0deg) rotateY(0deg); }
+ 50% {
+ transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg);
+ -webkit-transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg); }
+ 100% {
+ transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg);
+ -webkit-transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg); } }
+
+.spinner-cubes {
+ width: 40px;
+ height: 40px;
+ position: relative; }
+
+.cube1, .cube2 {
+ background-color: #333;
+ width: 15px;
+ height: 15px;
+ position: absolute;
+ top: 0;
+ left: 0;
+ -webkit-animation: sk-cubemove 1.8s infinite ease-in-out;
+ animation: sk-cubemove 1.8s infinite ease-in-out; }
+
+.cube2 {
+ -webkit-animation-delay: -0.9s;
+ animation-delay: -0.9s; }
+
+@-webkit-keyframes sk-cubemove {
+ 25% {
+ -webkit-transform: translateX(42px) rotate(-90deg) scale(0.5); }
+ 50% {
+ -webkit-transform: translateX(42px) translateY(42px) rotate(-180deg); }
+ 75% {
+ -webkit-transform: translateX(0px) translateY(42px) rotate(-270deg) scale(0.5); }
+ 100% {
+ -webkit-transform: rotate(-360deg); } }
+
+@keyframes sk-cubemove {
+ 25% {
+ transform: translateX(42px) rotate(-90deg) scale(0.5);
+ -webkit-transform: translateX(42px) rotate(-90deg) scale(0.5); }
+ 50% {
+ transform: translateX(42px) translateY(42px) rotate(-179deg);
+ -webkit-transform: translateX(42px) translateY(42px) rotate(-179deg); }
+ 50.1% {
+ transform: translateX(42px) translateY(42px) rotate(-180deg);
+ -webkit-transform: translateX(42px) translateY(42px) rotate(-180deg); }
+ 75% {
+ transform: translateX(0px) translateY(42px) rotate(-270deg) scale(0.5);
+ -webkit-transform: translateX(0px) translateY(42px) rotate(-270deg) scale(0.5); }
+ 100% {
+ transform: rotate(-360deg);
+ -webkit-transform: rotate(-360deg); } }
+
+.spinner-pump {
+ width: 40px;
+ height: 40px;
+ position: relative; }
+
+.double-bounce1, .double-bounce2 {
+ width: 100%;
+ height: 100%;
+ border-radius: 50%;
+ background-color: #333;
+ opacity: 0.6;
+ position: absolute;
+ top: 0;
+ left: 0;
+ -webkit-animation: sk-bounce 2.0s infinite ease-in-out;
+ animation: sk-bounce 2.0s infinite ease-in-out; }
+
+.double-bounce2 {
+ -webkit-animation-delay: -1.0s;
+ animation-delay: -1.0s; }
+
+@-webkit-keyframes sk-bounce {
+ 0%, 100% {
+ -webkit-transform: scale(0); }
+ 50% {
+ -webkit-transform: scale(1); } }
+
+@keyframes sk-bounce {
+ 0%, 100% {
+ transform: scale(0);
+ -webkit-transform: scale(0); }
+ 50% {
+ transform: scale(1);
+ -webkit-transform: scale(1); } }
+
+/* Pulsar */
+.spinner-pulsar {
+ width: 40px;
+ height: 40px;
+ background-color: #333;
+ border-radius: 100%;
+ -webkit-animation: sk-scaleout 1.0s infinite ease-in-out;
+ animation: sk-scaleout 1.0s infinite ease-in-out; }
+
+@-webkit-keyframes sk-scaleout {
+ 0% {
+ -webkit-transform: scale(0); }
+ 100% {
+ -webkit-transform: scale(1);
+ opacity: 0; } }
+
+@keyframes sk-scaleout {
+ 0% {
+ -webkit-transform: scale(0);
+ transform: scale(0); }
+ 100% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ opacity: 0; } }
+
+/* Accordion */
+.spinner-accordion {
+ margin: 100px auto;
+ width: 50px;
+ height: 40px;
+ text-align: center;
+ font-size: 10px; }
+
+.spinner-accordion > div {
+ background-color: #333;
+ height: 100%;
+ width: 6px;
+ display: inline-block;
+ -webkit-animation: sk-stretchdelay 1.2s infinite ease-in-out;
+ animation: sk-stretchdelay 1.2s infinite ease-in-out; }
+
+.spinner-accordion.rect2 {
+ -webkit-animation-delay: -1.1s;
+ animation-delay: -1.1s; }
+
+.spinner-accordion .rect3 {
+ -webkit-animation-delay: -1.0s;
+ animation-delay: -1.0s; }
+
+.spinner-accordion .rect4 {
+ -webkit-animation-delay: -0.9s;
+ animation-delay: -0.9s; }
+
+.spinner-accordion.rect5 {
+ -webkit-animation-delay: -0.8s;
+ animation-delay: -0.8s; }
+
+@-webkit-keyframes sk-stretchdelay {
+ 0%, 40%, 100% {
+ -webkit-transform: scaleY(0.4); }
+ 20% {
+ -webkit-transform: scaleY(1); } }
+
+@keyframes sk-stretchdelay {
+ 0%, 40%, 100% {
+ transform: scaleY(0.4);
+ -webkit-transform: scaleY(0.4); }
+ 20% {
+ transform: scaleY(1);
+ -webkit-transform: scaleY(1); } }
+
+.no-scroll {
+ overflow: hidden; }
+
+/*# sourceMappingURL=theme.bundle.css.map*/
\ No newline at end of file
diff --git a/dist/theme.bundle.css.map b/dist/theme.bundle.css.map
new file mode 100644
index 0000000..1ac6ac2
--- /dev/null
+++ b/dist/theme.bundle.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":[],"names":[],"mappings":"","file":"theme.bundle.css","sourceRoot":""}
\ No newline at end of file
diff --git a/dist/theme.bundle.js b/dist/theme.bundle.js
new file mode 100644
index 0000000..ab27f28
--- /dev/null
+++ b/dist/theme.bundle.js
@@ -0,0 +1,9639 @@
+webpackJsonp([0],{
+
+/***/ "./node_modules/bootstrap/dist/css/bootstrap.min.css":
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+
+/***/ "./node_modules/bootstrap/dist/js/bootstrap.js":
+/***/ (function(module, exports, __webpack_require__) {
+
+/*!
+ * Bootstrap v4.0.0 (https://getbootstrap.com)
+ * Copyright 2011-2018 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+(function (global, factory) {
+ true ? factory(exports, __webpack_require__("./node_modules/jquery/dist/jquery.js-exposed"), __webpack_require__("./node_modules/popper.js/dist/esm/popper.js")) :
+ typeof define === 'function' && define.amd ? define(['exports', 'jquery', 'popper.js'], factory) :
+ (factory((global.bootstrap = {}),global.jQuery,global.Popper));
+}(this, (function (exports,$,Popper) { 'use strict';
+
+$ = $ && $.hasOwnProperty('default') ? $['default'] : $;
+Popper = Popper && Popper.hasOwnProperty('default') ? Popper['default'] : Popper;
+
+function _defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || false;
+ descriptor.configurable = true;
+ if ("value" in descriptor) descriptor.writable = true;
+ Object.defineProperty(target, descriptor.key, descriptor);
+ }
+}
+
+function _createClass(Constructor, protoProps, staticProps) {
+ if (protoProps) _defineProperties(Constructor.prototype, protoProps);
+ if (staticProps) _defineProperties(Constructor, staticProps);
+ return Constructor;
+}
+
+function _extends() {
+ _extends = Object.assign || function (target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+
+ for (var key in source) {
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
+ target[key] = source[key];
+ }
+ }
+ }
+
+ return target;
+ };
+
+ return _extends.apply(this, arguments);
+}
+
+function _inheritsLoose(subClass, superClass) {
+ subClass.prototype = Object.create(superClass.prototype);
+ subClass.prototype.constructor = subClass;
+ subClass.__proto__ = superClass;
+}
+
+/**
+ * --------------------------------------------------------------------------
+ * Bootstrap (v4.0.0): util.js
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * --------------------------------------------------------------------------
+ */
+
+var Util = function ($$$1) {
+ /**
+ * ------------------------------------------------------------------------
+ * Private TransitionEnd Helpers
+ * ------------------------------------------------------------------------
+ */
+ var transition = false;
+ var MAX_UID = 1000000; // Shoutout AngusCroll (https://goo.gl/pxwQGp)
+
+ function toType(obj) {
+ return {}.toString.call(obj).match(/\s([a-zA-Z]+)/)[1].toLowerCase();
+ }
+
+ function getSpecialTransitionEndEvent() {
+ return {
+ bindType: transition.end,
+ delegateType: transition.end,
+ handle: function handle(event) {
+ if ($$$1(event.target).is(this)) {
+ return event.handleObj.handler.apply(this, arguments); // eslint-disable-line prefer-rest-params
+ }
+
+ return undefined; // eslint-disable-line no-undefined
+ }
+ };
+ }
+
+ function transitionEndTest() {
+ if (typeof window !== 'undefined' && window.QUnit) {
+ return false;
+ }
+
+ return {
+ end: 'transitionend'
+ };
+ }
+
+ function transitionEndEmulator(duration) {
+ var _this = this;
+
+ var called = false;
+ $$$1(this).one(Util.TRANSITION_END, function () {
+ called = true;
+ });
+ setTimeout(function () {
+ if (!called) {
+ Util.triggerTransitionEnd(_this);
+ }
+ }, duration);
+ return this;
+ }
+
+ function setTransitionEndSupport() {
+ transition = transitionEndTest();
+ $$$1.fn.emulateTransitionEnd = transitionEndEmulator;
+
+ if (Util.supportsTransitionEnd()) {
+ $$$1.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent();
+ }
+ }
+
+ function escapeId(selector) {
+ // We escape IDs in case of special selectors (selector = '#myId:something')
+ // $.escapeSelector does not exist in jQuery < 3
+ selector = typeof $$$1.escapeSelector === 'function' ? $$$1.escapeSelector(selector).substr(1) : selector.replace(/(:|\.|\[|\]|,|=|@)/g, '\\$1');
+ return selector;
+ }
+ /**
+ * --------------------------------------------------------------------------
+ * Public Util Api
+ * --------------------------------------------------------------------------
+ */
+
+
+ var Util = {
+ TRANSITION_END: 'bsTransitionEnd',
+ getUID: function getUID(prefix) {
+ do {
+ // eslint-disable-next-line no-bitwise
+ prefix += ~~(Math.random() * MAX_UID); // "~~" acts like a faster Math.floor() here
+ } while (document.getElementById(prefix));
+
+ return prefix;
+ },
+ getSelectorFromElement: function getSelectorFromElement(element) {
+ var selector = element.getAttribute('data-target');
+
+ if (!selector || selector === '#') {
+ selector = element.getAttribute('href') || '';
+ } // If it's an ID
+
+
+ if (selector.charAt(0) === '#') {
+ selector = escapeId(selector);
+ }
+
+ try {
+ var $selector = $$$1(document).find(selector);
+ return $selector.length > 0 ? selector : null;
+ } catch (err) {
+ return null;
+ }
+ },
+ reflow: function reflow(element) {
+ return element.offsetHeight;
+ },
+ triggerTransitionEnd: function triggerTransitionEnd(element) {
+ $$$1(element).trigger(transition.end);
+ },
+ supportsTransitionEnd: function supportsTransitionEnd() {
+ return Boolean(transition);
+ },
+ isElement: function isElement(obj) {
+ return (obj[0] || obj).nodeType;
+ },
+ typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) {
+ for (var property in configTypes) {
+ if (Object.prototype.hasOwnProperty.call(configTypes, property)) {
+ var expectedTypes = configTypes[property];
+ var value = config[property];
+ var valueType = value && Util.isElement(value) ? 'element' : toType(value);
+
+ if (!new RegExp(expectedTypes).test(valueType)) {
+ throw new Error(componentName.toUpperCase() + ": " + ("Option \"" + property + "\" provided type \"" + valueType + "\" ") + ("but expected type \"" + expectedTypes + "\"."));
+ }
+ }
+ }
+ }
+ };
+ setTransitionEndSupport();
+ return Util;
+}($);
+
+/**
+ * --------------------------------------------------------------------------
+ * Bootstrap (v4.0.0): alert.js
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * --------------------------------------------------------------------------
+ */
+
+var Alert = function ($$$1) {
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+ var NAME = 'alert';
+ var VERSION = '4.0.0';
+ var DATA_KEY = 'bs.alert';
+ var EVENT_KEY = "." + DATA_KEY;
+ var DATA_API_KEY = '.data-api';
+ var JQUERY_NO_CONFLICT = $$$1.fn[NAME];
+ var TRANSITION_DURATION = 150;
+ var Selector = {
+ DISMISS: '[data-dismiss="alert"]'
+ };
+ var Event = {
+ CLOSE: "close" + EVENT_KEY,
+ CLOSED: "closed" + EVENT_KEY,
+ CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY
+ };
+ var ClassName = {
+ ALERT: 'alert',
+ FADE: 'fade',
+ SHOW: 'show'
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ };
+
+ var Alert =
+ /*#__PURE__*/
+ function () {
+ function Alert(element) {
+ this._element = element;
+ } // Getters
+
+
+ var _proto = Alert.prototype;
+
+ // Public
+ _proto.close = function close(element) {
+ element = element || this._element;
+
+ var rootElement = this._getRootElement(element);
+
+ var customEvent = this._triggerCloseEvent(rootElement);
+
+ if (customEvent.isDefaultPrevented()) {
+ return;
+ }
+
+ this._removeElement(rootElement);
+ };
+
+ _proto.dispose = function dispose() {
+ $$$1.removeData(this._element, DATA_KEY);
+ this._element = null;
+ }; // Private
+
+
+ _proto._getRootElement = function _getRootElement(element) {
+ var selector = Util.getSelectorFromElement(element);
+ var parent = false;
+
+ if (selector) {
+ parent = $$$1(selector)[0];
+ }
+
+ if (!parent) {
+ parent = $$$1(element).closest("." + ClassName.ALERT)[0];
+ }
+
+ return parent;
+ };
+
+ _proto._triggerCloseEvent = function _triggerCloseEvent(element) {
+ var closeEvent = $$$1.Event(Event.CLOSE);
+ $$$1(element).trigger(closeEvent);
+ return closeEvent;
+ };
+
+ _proto._removeElement = function _removeElement(element) {
+ var _this = this;
+
+ $$$1(element).removeClass(ClassName.SHOW);
+
+ if (!Util.supportsTransitionEnd() || !$$$1(element).hasClass(ClassName.FADE)) {
+ this._destroyElement(element);
+
+ return;
+ }
+
+ $$$1(element).one(Util.TRANSITION_END, function (event) {
+ return _this._destroyElement(element, event);
+ }).emulateTransitionEnd(TRANSITION_DURATION);
+ };
+
+ _proto._destroyElement = function _destroyElement(element) {
+ $$$1(element).detach().trigger(Event.CLOSED).remove();
+ }; // Static
+
+
+ Alert._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ var $element = $$$1(this);
+ var data = $element.data(DATA_KEY);
+
+ if (!data) {
+ data = new Alert(this);
+ $element.data(DATA_KEY, data);
+ }
+
+ if (config === 'close') {
+ data[config](this);
+ }
+ });
+ };
+
+ Alert._handleDismiss = function _handleDismiss(alertInstance) {
+ return function (event) {
+ if (event) {
+ event.preventDefault();
+ }
+
+ alertInstance.close(this);
+ };
+ };
+
+ _createClass(Alert, null, [{
+ key: "VERSION",
+ get: function get() {
+ return VERSION;
+ }
+ }]);
+ return Alert;
+ }();
+ /**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
+
+
+ $$$1(document).on(Event.CLICK_DATA_API, Selector.DISMISS, Alert._handleDismiss(new Alert()));
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+ $$$1.fn[NAME] = Alert._jQueryInterface;
+ $$$1.fn[NAME].Constructor = Alert;
+
+ $$$1.fn[NAME].noConflict = function () {
+ $$$1.fn[NAME] = JQUERY_NO_CONFLICT;
+ return Alert._jQueryInterface;
+ };
+
+ return Alert;
+}($);
+
+/**
+ * --------------------------------------------------------------------------
+ * Bootstrap (v4.0.0): button.js
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * --------------------------------------------------------------------------
+ */
+
+var Button = function ($$$1) {
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+ var NAME = 'button';
+ var VERSION = '4.0.0';
+ var DATA_KEY = 'bs.button';
+ var EVENT_KEY = "." + DATA_KEY;
+ var DATA_API_KEY = '.data-api';
+ var JQUERY_NO_CONFLICT = $$$1.fn[NAME];
+ var ClassName = {
+ ACTIVE: 'active',
+ BUTTON: 'btn',
+ FOCUS: 'focus'
+ };
+ var Selector = {
+ DATA_TOGGLE_CARROT: '[data-toggle^="button"]',
+ DATA_TOGGLE: '[data-toggle="buttons"]',
+ INPUT: 'input',
+ ACTIVE: '.active',
+ BUTTON: '.btn'
+ };
+ var Event = {
+ CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY,
+ FOCUS_BLUR_DATA_API: "focus" + EVENT_KEY + DATA_API_KEY + " " + ("blur" + EVENT_KEY + DATA_API_KEY)
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ };
+
+ var Button =
+ /*#__PURE__*/
+ function () {
+ function Button(element) {
+ this._element = element;
+ } // Getters
+
+
+ var _proto = Button.prototype;
+
+ // Public
+ _proto.toggle = function toggle() {
+ var triggerChangeEvent = true;
+ var addAriaPressed = true;
+ var rootElement = $$$1(this._element).closest(Selector.DATA_TOGGLE)[0];
+
+ if (rootElement) {
+ var input = $$$1(this._element).find(Selector.INPUT)[0];
+
+ if (input) {
+ if (input.type === 'radio') {
+ if (input.checked && $$$1(this._element).hasClass(ClassName.ACTIVE)) {
+ triggerChangeEvent = false;
+ } else {
+ var activeElement = $$$1(rootElement).find(Selector.ACTIVE)[0];
+
+ if (activeElement) {
+ $$$1(activeElement).removeClass(ClassName.ACTIVE);
+ }
+ }
+ }
+
+ if (triggerChangeEvent) {
+ if (input.hasAttribute('disabled') || rootElement.hasAttribute('disabled') || input.classList.contains('disabled') || rootElement.classList.contains('disabled')) {
+ return;
+ }
+
+ input.checked = !$$$1(this._element).hasClass(ClassName.ACTIVE);
+ $$$1(input).trigger('change');
+ }
+
+ input.focus();
+ addAriaPressed = false;
+ }
+ }
+
+ if (addAriaPressed) {
+ this._element.setAttribute('aria-pressed', !$$$1(this._element).hasClass(ClassName.ACTIVE));
+ }
+
+ if (triggerChangeEvent) {
+ $$$1(this._element).toggleClass(ClassName.ACTIVE);
+ }
+ };
+
+ _proto.dispose = function dispose() {
+ $$$1.removeData(this._element, DATA_KEY);
+ this._element = null;
+ }; // Static
+
+
+ Button._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ var data = $$$1(this).data(DATA_KEY);
+
+ if (!data) {
+ data = new Button(this);
+ $$$1(this).data(DATA_KEY, data);
+ }
+
+ if (config === 'toggle') {
+ data[config]();
+ }
+ });
+ };
+
+ _createClass(Button, null, [{
+ key: "VERSION",
+ get: function get() {
+ return VERSION;
+ }
+ }]);
+ return Button;
+ }();
+ /**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
+
+
+ $$$1(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) {
+ event.preventDefault();
+ var button = event.target;
+
+ if (!$$$1(button).hasClass(ClassName.BUTTON)) {
+ button = $$$1(button).closest(Selector.BUTTON);
+ }
+
+ Button._jQueryInterface.call($$$1(button), 'toggle');
+ }).on(Event.FOCUS_BLUR_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) {
+ var button = $$$1(event.target).closest(Selector.BUTTON)[0];
+ $$$1(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type));
+ });
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+ $$$1.fn[NAME] = Button._jQueryInterface;
+ $$$1.fn[NAME].Constructor = Button;
+
+ $$$1.fn[NAME].noConflict = function () {
+ $$$1.fn[NAME] = JQUERY_NO_CONFLICT;
+ return Button._jQueryInterface;
+ };
+
+ return Button;
+}($);
+
+/**
+ * --------------------------------------------------------------------------
+ * Bootstrap (v4.0.0): carousel.js
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * --------------------------------------------------------------------------
+ */
+
+var Carousel = function ($$$1) {
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+ var NAME = 'carousel';
+ var VERSION = '4.0.0';
+ var DATA_KEY = 'bs.carousel';
+ var EVENT_KEY = "." + DATA_KEY;
+ var DATA_API_KEY = '.data-api';
+ var JQUERY_NO_CONFLICT = $$$1.fn[NAME];
+ var TRANSITION_DURATION = 600;
+ var ARROW_LEFT_KEYCODE = 37; // KeyboardEvent.which value for left arrow key
+
+ var ARROW_RIGHT_KEYCODE = 39; // KeyboardEvent.which value for right arrow key
+
+ var TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch
+
+ var Default = {
+ interval: 5000,
+ keyboard: true,
+ slide: false,
+ pause: 'hover',
+ wrap: true
+ };
+ var DefaultType = {
+ interval: '(number|boolean)',
+ keyboard: 'boolean',
+ slide: '(boolean|string)',
+ pause: '(string|boolean)',
+ wrap: 'boolean'
+ };
+ var Direction = {
+ NEXT: 'next',
+ PREV: 'prev',
+ LEFT: 'left',
+ RIGHT: 'right'
+ };
+ var Event = {
+ SLIDE: "slide" + EVENT_KEY,
+ SLID: "slid" + EVENT_KEY,
+ KEYDOWN: "keydown" + EVENT_KEY,
+ MOUSEENTER: "mouseenter" + EVENT_KEY,
+ MOUSELEAVE: "mouseleave" + EVENT_KEY,
+ TOUCHEND: "touchend" + EVENT_KEY,
+ LOAD_DATA_API: "load" + EVENT_KEY + DATA_API_KEY,
+ CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY
+ };
+ var ClassName = {
+ CAROUSEL: 'carousel',
+ ACTIVE: 'active',
+ SLIDE: 'slide',
+ RIGHT: 'carousel-item-right',
+ LEFT: 'carousel-item-left',
+ NEXT: 'carousel-item-next',
+ PREV: 'carousel-item-prev',
+ ITEM: 'carousel-item'
+ };
+ var Selector = {
+ ACTIVE: '.active',
+ ACTIVE_ITEM: '.active.carousel-item',
+ ITEM: '.carousel-item',
+ NEXT_PREV: '.carousel-item-next, .carousel-item-prev',
+ INDICATORS: '.carousel-indicators',
+ DATA_SLIDE: '[data-slide], [data-slide-to]',
+ DATA_RIDE: '[data-ride="carousel"]'
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ };
+
+ var Carousel =
+ /*#__PURE__*/
+ function () {
+ function Carousel(element, config) {
+ this._items = null;
+ this._interval = null;
+ this._activeElement = null;
+ this._isPaused = false;
+ this._isSliding = false;
+ this.touchTimeout = null;
+ this._config = this._getConfig(config);
+ this._element = $$$1(element)[0];
+ this._indicatorsElement = $$$1(this._element).find(Selector.INDICATORS)[0];
+
+ this._addEventListeners();
+ } // Getters
+
+
+ var _proto = Carousel.prototype;
+
+ // Public
+ _proto.next = function next() {
+ if (!this._isSliding) {
+ this._slide(Direction.NEXT);
+ }
+ };
+
+ _proto.nextWhenVisible = function nextWhenVisible() {
+ // Don't call next when the page isn't visible
+ // or the carousel or its parent isn't visible
+ if (!document.hidden && $$$1(this._element).is(':visible') && $$$1(this._element).css('visibility') !== 'hidden') {
+ this.next();
+ }
+ };
+
+ _proto.prev = function prev() {
+ if (!this._isSliding) {
+ this._slide(Direction.PREV);
+ }
+ };
+
+ _proto.pause = function pause(event) {
+ if (!event) {
+ this._isPaused = true;
+ }
+
+ if ($$$1(this._element).find(Selector.NEXT_PREV)[0] && Util.supportsTransitionEnd()) {
+ Util.triggerTransitionEnd(this._element);
+ this.cycle(true);
+ }
+
+ clearInterval(this._interval);
+ this._interval = null;
+ };
+
+ _proto.cycle = function cycle(event) {
+ if (!event) {
+ this._isPaused = false;
+ }
+
+ if (this._interval) {
+ clearInterval(this._interval);
+ this._interval = null;
+ }
+
+ if (this._config.interval && !this._isPaused) {
+ this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval);
+ }
+ };
+
+ _proto.to = function to(index) {
+ var _this = this;
+
+ this._activeElement = $$$1(this._element).find(Selector.ACTIVE_ITEM)[0];
+
+ var activeIndex = this._getItemIndex(this._activeElement);
+
+ if (index > this._items.length - 1 || index < 0) {
+ return;
+ }
+
+ if (this._isSliding) {
+ $$$1(this._element).one(Event.SLID, function () {
+ return _this.to(index);
+ });
+ return;
+ }
+
+ if (activeIndex === index) {
+ this.pause();
+ this.cycle();
+ return;
+ }
+
+ var direction = index > activeIndex ? Direction.NEXT : Direction.PREV;
+
+ this._slide(direction, this._items[index]);
+ };
+
+ _proto.dispose = function dispose() {
+ $$$1(this._element).off(EVENT_KEY);
+ $$$1.removeData(this._element, DATA_KEY);
+ this._items = null;
+ this._config = null;
+ this._element = null;
+ this._interval = null;
+ this._isPaused = null;
+ this._isSliding = null;
+ this._activeElement = null;
+ this._indicatorsElement = null;
+ }; // Private
+
+
+ _proto._getConfig = function _getConfig(config) {
+ config = _extends({}, Default, config);
+ Util.typeCheckConfig(NAME, config, DefaultType);
+ return config;
+ };
+
+ _proto._addEventListeners = function _addEventListeners() {
+ var _this2 = this;
+
+ if (this._config.keyboard) {
+ $$$1(this._element).on(Event.KEYDOWN, function (event) {
+ return _this2._keydown(event);
+ });
+ }
+
+ if (this._config.pause === 'hover') {
+ $$$1(this._element).on(Event.MOUSEENTER, function (event) {
+ return _this2.pause(event);
+ }).on(Event.MOUSELEAVE, function (event) {
+ return _this2.cycle(event);
+ });
+
+ if ('ontouchstart' in document.documentElement) {
+ // If it's a touch-enabled device, mouseenter/leave are fired as
+ // part of the mouse compatibility events on first tap - the carousel
+ // would stop cycling until user tapped out of it;
+ // here, we listen for touchend, explicitly pause the carousel
+ // (as if it's the second time we tap on it, mouseenter compat event
+ // is NOT fired) and after a timeout (to allow for mouse compatibility
+ // events to fire) we explicitly restart cycling
+ $$$1(this._element).on(Event.TOUCHEND, function () {
+ _this2.pause();
+
+ if (_this2.touchTimeout) {
+ clearTimeout(_this2.touchTimeout);
+ }
+
+ _this2.touchTimeout = setTimeout(function (event) {
+ return _this2.cycle(event);
+ }, TOUCHEVENT_COMPAT_WAIT + _this2._config.interval);
+ });
+ }
+ }
+ };
+
+ _proto._keydown = function _keydown(event) {
+ if (/input|textarea/i.test(event.target.tagName)) {
+ return;
+ }
+
+ switch (event.which) {
+ case ARROW_LEFT_KEYCODE:
+ event.preventDefault();
+ this.prev();
+ break;
+
+ case ARROW_RIGHT_KEYCODE:
+ event.preventDefault();
+ this.next();
+ break;
+
+ default:
+ }
+ };
+
+ _proto._getItemIndex = function _getItemIndex(element) {
+ this._items = $$$1.makeArray($$$1(element).parent().find(Selector.ITEM));
+ return this._items.indexOf(element);
+ };
+
+ _proto._getItemByDirection = function _getItemByDirection(direction, activeElement) {
+ var isNextDirection = direction === Direction.NEXT;
+ var isPrevDirection = direction === Direction.PREV;
+
+ var activeIndex = this._getItemIndex(activeElement);
+
+ var lastItemIndex = this._items.length - 1;
+ var isGoingToWrap = isPrevDirection && activeIndex === 0 || isNextDirection && activeIndex === lastItemIndex;
+
+ if (isGoingToWrap && !this._config.wrap) {
+ return activeElement;
+ }
+
+ var delta = direction === Direction.PREV ? -1 : 1;
+ var itemIndex = (activeIndex + delta) % this._items.length;
+ return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex];
+ };
+
+ _proto._triggerSlideEvent = function _triggerSlideEvent(relatedTarget, eventDirectionName) {
+ var targetIndex = this._getItemIndex(relatedTarget);
+
+ var fromIndex = this._getItemIndex($$$1(this._element).find(Selector.ACTIVE_ITEM)[0]);
+
+ var slideEvent = $$$1.Event(Event.SLIDE, {
+ relatedTarget: relatedTarget,
+ direction: eventDirectionName,
+ from: fromIndex,
+ to: targetIndex
+ });
+ $$$1(this._element).trigger(slideEvent);
+ return slideEvent;
+ };
+
+ _proto._setActiveIndicatorElement = function _setActiveIndicatorElement(element) {
+ if (this._indicatorsElement) {
+ $$$1(this._indicatorsElement).find(Selector.ACTIVE).removeClass(ClassName.ACTIVE);
+
+ var nextIndicator = this._indicatorsElement.children[this._getItemIndex(element)];
+
+ if (nextIndicator) {
+ $$$1(nextIndicator).addClass(ClassName.ACTIVE);
+ }
+ }
+ };
+
+ _proto._slide = function _slide(direction, element) {
+ var _this3 = this;
+
+ var activeElement = $$$1(this._element).find(Selector.ACTIVE_ITEM)[0];
+
+ var activeElementIndex = this._getItemIndex(activeElement);
+
+ var nextElement = element || activeElement && this._getItemByDirection(direction, activeElement);
+
+ var nextElementIndex = this._getItemIndex(nextElement);
+
+ var isCycling = Boolean(this._interval);
+ var directionalClassName;
+ var orderClassName;
+ var eventDirectionName;
+
+ if (direction === Direction.NEXT) {
+ directionalClassName = ClassName.LEFT;
+ orderClassName = ClassName.NEXT;
+ eventDirectionName = Direction.LEFT;
+ } else {
+ directionalClassName = ClassName.RIGHT;
+ orderClassName = ClassName.PREV;
+ eventDirectionName = Direction.RIGHT;
+ }
+
+ if (nextElement && $$$1(nextElement).hasClass(ClassName.ACTIVE)) {
+ this._isSliding = false;
+ return;
+ }
+
+ var slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName);
+
+ if (slideEvent.isDefaultPrevented()) {
+ return;
+ }
+
+ if (!activeElement || !nextElement) {
+ // Some weirdness is happening, so we bail
+ return;
+ }
+
+ this._isSliding = true;
+
+ if (isCycling) {
+ this.pause();
+ }
+
+ this._setActiveIndicatorElement(nextElement);
+
+ var slidEvent = $$$1.Event(Event.SLID, {
+ relatedTarget: nextElement,
+ direction: eventDirectionName,
+ from: activeElementIndex,
+ to: nextElementIndex
+ });
+
+ if (Util.supportsTransitionEnd() && $$$1(this._element).hasClass(ClassName.SLIDE)) {
+ $$$1(nextElement).addClass(orderClassName);
+ Util.reflow(nextElement);
+ $$$1(activeElement).addClass(directionalClassName);
+ $$$1(nextElement).addClass(directionalClassName);
+ $$$1(activeElement).one(Util.TRANSITION_END, function () {
+ $$$1(nextElement).removeClass(directionalClassName + " " + orderClassName).addClass(ClassName.ACTIVE);
+ $$$1(activeElement).removeClass(ClassName.ACTIVE + " " + orderClassName + " " + directionalClassName);
+ _this3._isSliding = false;
+ setTimeout(function () {
+ return $$$1(_this3._element).trigger(slidEvent);
+ }, 0);
+ }).emulateTransitionEnd(TRANSITION_DURATION);
+ } else {
+ $$$1(activeElement).removeClass(ClassName.ACTIVE);
+ $$$1(nextElement).addClass(ClassName.ACTIVE);
+ this._isSliding = false;
+ $$$1(this._element).trigger(slidEvent);
+ }
+
+ if (isCycling) {
+ this.cycle();
+ }
+ }; // Static
+
+
+ Carousel._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ var data = $$$1(this).data(DATA_KEY);
+
+ var _config = _extends({}, Default, $$$1(this).data());
+
+ if (typeof config === 'object') {
+ _config = _extends({}, _config, config);
+ }
+
+ var action = typeof config === 'string' ? config : _config.slide;
+
+ if (!data) {
+ data = new Carousel(this, _config);
+ $$$1(this).data(DATA_KEY, data);
+ }
+
+ if (typeof config === 'number') {
+ data.to(config);
+ } else if (typeof action === 'string') {
+ if (typeof data[action] === 'undefined') {
+ throw new TypeError("No method named \"" + action + "\"");
+ }
+
+ data[action]();
+ } else if (_config.interval) {
+ data.pause();
+ data.cycle();
+ }
+ });
+ };
+
+ Carousel._dataApiClickHandler = function _dataApiClickHandler(event) {
+ var selector = Util.getSelectorFromElement(this);
+
+ if (!selector) {
+ return;
+ }
+
+ var target = $$$1(selector)[0];
+
+ if (!target || !$$$1(target).hasClass(ClassName.CAROUSEL)) {
+ return;
+ }
+
+ var config = _extends({}, $$$1(target).data(), $$$1(this).data());
+ var slideIndex = this.getAttribute('data-slide-to');
+
+ if (slideIndex) {
+ config.interval = false;
+ }
+
+ Carousel._jQueryInterface.call($$$1(target), config);
+
+ if (slideIndex) {
+ $$$1(target).data(DATA_KEY).to(slideIndex);
+ }
+
+ event.preventDefault();
+ };
+
+ _createClass(Carousel, null, [{
+ key: "VERSION",
+ get: function get() {
+ return VERSION;
+ }
+ }, {
+ key: "Default",
+ get: function get() {
+ return Default;
+ }
+ }]);
+ return Carousel;
+ }();
+ /**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
+
+
+ $$$1(document).on(Event.CLICK_DATA_API, Selector.DATA_SLIDE, Carousel._dataApiClickHandler);
+ $$$1(window).on(Event.LOAD_DATA_API, function () {
+ $$$1(Selector.DATA_RIDE).each(function () {
+ var $carousel = $$$1(this);
+
+ Carousel._jQueryInterface.call($carousel, $carousel.data());
+ });
+ });
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+ $$$1.fn[NAME] = Carousel._jQueryInterface;
+ $$$1.fn[NAME].Constructor = Carousel;
+
+ $$$1.fn[NAME].noConflict = function () {
+ $$$1.fn[NAME] = JQUERY_NO_CONFLICT;
+ return Carousel._jQueryInterface;
+ };
+
+ return Carousel;
+}($);
+
+/**
+ * --------------------------------------------------------------------------
+ * Bootstrap (v4.0.0): collapse.js
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * --------------------------------------------------------------------------
+ */
+
+var Collapse = function ($$$1) {
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+ var NAME = 'collapse';
+ var VERSION = '4.0.0';
+ var DATA_KEY = 'bs.collapse';
+ var EVENT_KEY = "." + DATA_KEY;
+ var DATA_API_KEY = '.data-api';
+ var JQUERY_NO_CONFLICT = $$$1.fn[NAME];
+ var TRANSITION_DURATION = 600;
+ var Default = {
+ toggle: true,
+ parent: ''
+ };
+ var DefaultType = {
+ toggle: 'boolean',
+ parent: '(string|element)'
+ };
+ var Event = {
+ SHOW: "show" + EVENT_KEY,
+ SHOWN: "shown" + EVENT_KEY,
+ HIDE: "hide" + EVENT_KEY,
+ HIDDEN: "hidden" + EVENT_KEY,
+ CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY
+ };
+ var ClassName = {
+ SHOW: 'show',
+ COLLAPSE: 'collapse',
+ COLLAPSING: 'collapsing',
+ COLLAPSED: 'collapsed'
+ };
+ var Dimension = {
+ WIDTH: 'width',
+ HEIGHT: 'height'
+ };
+ var Selector = {
+ ACTIVES: '.show, .collapsing',
+ DATA_TOGGLE: '[data-toggle="collapse"]'
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ };
+
+ var Collapse =
+ /*#__PURE__*/
+ function () {
+ function Collapse(element, config) {
+ this._isTransitioning = false;
+ this._element = element;
+ this._config = this._getConfig(config);
+ this._triggerArray = $$$1.makeArray($$$1("[data-toggle=\"collapse\"][href=\"#" + element.id + "\"]," + ("[data-toggle=\"collapse\"][data-target=\"#" + element.id + "\"]")));
+ var tabToggles = $$$1(Selector.DATA_TOGGLE);
+
+ for (var i = 0; i < tabToggles.length; i++) {
+ var elem = tabToggles[i];
+ var selector = Util.getSelectorFromElement(elem);
+
+ if (selector !== null && $$$1(selector).filter(element).length > 0) {
+ this._selector = selector;
+
+ this._triggerArray.push(elem);
+ }
+ }
+
+ this._parent = this._config.parent ? this._getParent() : null;
+
+ if (!this._config.parent) {
+ this._addAriaAndCollapsedClass(this._element, this._triggerArray);
+ }
+
+ if (this._config.toggle) {
+ this.toggle();
+ }
+ } // Getters
+
+
+ var _proto = Collapse.prototype;
+
+ // Public
+ _proto.toggle = function toggle() {
+ if ($$$1(this._element).hasClass(ClassName.SHOW)) {
+ this.hide();
+ } else {
+ this.show();
+ }
+ };
+
+ _proto.show = function show() {
+ var _this = this;
+
+ if (this._isTransitioning || $$$1(this._element).hasClass(ClassName.SHOW)) {
+ return;
+ }
+
+ var actives;
+ var activesData;
+
+ if (this._parent) {
+ actives = $$$1.makeArray($$$1(this._parent).find(Selector.ACTIVES).filter("[data-parent=\"" + this._config.parent + "\"]"));
+
+ if (actives.length === 0) {
+ actives = null;
+ }
+ }
+
+ if (actives) {
+ activesData = $$$1(actives).not(this._selector).data(DATA_KEY);
+
+ if (activesData && activesData._isTransitioning) {
+ return;
+ }
+ }
+
+ var startEvent = $$$1.Event(Event.SHOW);
+ $$$1(this._element).trigger(startEvent);
+
+ if (startEvent.isDefaultPrevented()) {
+ return;
+ }
+
+ if (actives) {
+ Collapse._jQueryInterface.call($$$1(actives).not(this._selector), 'hide');
+
+ if (!activesData) {
+ $$$1(actives).data(DATA_KEY, null);
+ }
+ }
+
+ var dimension = this._getDimension();
+
+ $$$1(this._element).removeClass(ClassName.COLLAPSE).addClass(ClassName.COLLAPSING);
+ this._element.style[dimension] = 0;
+
+ if (this._triggerArray.length > 0) {
+ $$$1(this._triggerArray).removeClass(ClassName.COLLAPSED).attr('aria-expanded', true);
+ }
+
+ this.setTransitioning(true);
+
+ var complete = function complete() {
+ $$$1(_this._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).addClass(ClassName.SHOW);
+ _this._element.style[dimension] = '';
+
+ _this.setTransitioning(false);
+
+ $$$1(_this._element).trigger(Event.SHOWN);
+ };
+
+ if (!Util.supportsTransitionEnd()) {
+ complete();
+ return;
+ }
+
+ var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);
+ var scrollSize = "scroll" + capitalizedDimension;
+ $$$1(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);
+ this._element.style[dimension] = this._element[scrollSize] + "px";
+ };
+
+ _proto.hide = function hide() {
+ var _this2 = this;
+
+ if (this._isTransitioning || !$$$1(this._element).hasClass(ClassName.SHOW)) {
+ return;
+ }
+
+ var startEvent = $$$1.Event(Event.HIDE);
+ $$$1(this._element).trigger(startEvent);
+
+ if (startEvent.isDefaultPrevented()) {
+ return;
+ }
+
+ var dimension = this._getDimension();
+
+ this._element.style[dimension] = this._element.getBoundingClientRect()[dimension] + "px";
+ Util.reflow(this._element);
+ $$$1(this._element).addClass(ClassName.COLLAPSING).removeClass(ClassName.COLLAPSE).removeClass(ClassName.SHOW);
+
+ if (this._triggerArray.length > 0) {
+ for (var i = 0; i < this._triggerArray.length; i++) {
+ var trigger = this._triggerArray[i];
+ var selector = Util.getSelectorFromElement(trigger);
+
+ if (selector !== null) {
+ var $elem = $$$1(selector);
+
+ if (!$elem.hasClass(ClassName.SHOW)) {
+ $$$1(trigger).addClass(ClassName.COLLAPSED).attr('aria-expanded', false);
+ }
+ }
+ }
+ }
+
+ this.setTransitioning(true);
+
+ var complete = function complete() {
+ _this2.setTransitioning(false);
+
+ $$$1(_this2._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).trigger(Event.HIDDEN);
+ };
+
+ this._element.style[dimension] = '';
+
+ if (!Util.supportsTransitionEnd()) {
+ complete();
+ return;
+ }
+
+ $$$1(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);
+ };
+
+ _proto.setTransitioning = function setTransitioning(isTransitioning) {
+ this._isTransitioning = isTransitioning;
+ };
+
+ _proto.dispose = function dispose() {
+ $$$1.removeData(this._element, DATA_KEY);
+ this._config = null;
+ this._parent = null;
+ this._element = null;
+ this._triggerArray = null;
+ this._isTransitioning = null;
+ }; // Private
+
+
+ _proto._getConfig = function _getConfig(config) {
+ config = _extends({}, Default, config);
+ config.toggle = Boolean(config.toggle); // Coerce string values
+
+ Util.typeCheckConfig(NAME, config, DefaultType);
+ return config;
+ };
+
+ _proto._getDimension = function _getDimension() {
+ var hasWidth = $$$1(this._element).hasClass(Dimension.WIDTH);
+ return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT;
+ };
+
+ _proto._getParent = function _getParent() {
+ var _this3 = this;
+
+ var parent = null;
+
+ if (Util.isElement(this._config.parent)) {
+ parent = this._config.parent; // It's a jQuery object
+
+ if (typeof this._config.parent.jquery !== 'undefined') {
+ parent = this._config.parent[0];
+ }
+ } else {
+ parent = $$$1(this._config.parent)[0];
+ }
+
+ var selector = "[data-toggle=\"collapse\"][data-parent=\"" + this._config.parent + "\"]";
+ $$$1(parent).find(selector).each(function (i, element) {
+ _this3._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]);
+ });
+ return parent;
+ };
+
+ _proto._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) {
+ if (element) {
+ var isOpen = $$$1(element).hasClass(ClassName.SHOW);
+
+ if (triggerArray.length > 0) {
+ $$$1(triggerArray).toggleClass(ClassName.COLLAPSED, !isOpen).attr('aria-expanded', isOpen);
+ }
+ }
+ }; // Static
+
+
+ Collapse._getTargetFromElement = function _getTargetFromElement(element) {
+ var selector = Util.getSelectorFromElement(element);
+ return selector ? $$$1(selector)[0] : null;
+ };
+
+ Collapse._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ var $this = $$$1(this);
+ var data = $this.data(DATA_KEY);
+
+ var _config = _extends({}, Default, $this.data(), typeof config === 'object' && config);
+
+ if (!data && _config.toggle && /show|hide/.test(config)) {
+ _config.toggle = false;
+ }
+
+ if (!data) {
+ data = new Collapse(this, _config);
+ $this.data(DATA_KEY, data);
+ }
+
+ if (typeof config === 'string') {
+ if (typeof data[config] === 'undefined') {
+ throw new TypeError("No method named \"" + config + "\"");
+ }
+
+ data[config]();
+ }
+ });
+ };
+
+ _createClass(Collapse, null, [{
+ key: "VERSION",
+ get: function get() {
+ return VERSION;
+ }
+ }, {
+ key: "Default",
+ get: function get() {
+ return Default;
+ }
+ }]);
+ return Collapse;
+ }();
+ /**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
+
+
+ $$$1(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
+ // preventDefault only for elements (which change the URL) not inside the collapsible element
+ if (event.currentTarget.tagName === 'A') {
+ event.preventDefault();
+ }
+
+ var $trigger = $$$1(this);
+ var selector = Util.getSelectorFromElement(this);
+ $$$1(selector).each(function () {
+ var $target = $$$1(this);
+ var data = $target.data(DATA_KEY);
+ var config = data ? 'toggle' : $trigger.data();
+
+ Collapse._jQueryInterface.call($target, config);
+ });
+ });
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+ $$$1.fn[NAME] = Collapse._jQueryInterface;
+ $$$1.fn[NAME].Constructor = Collapse;
+
+ $$$1.fn[NAME].noConflict = function () {
+ $$$1.fn[NAME] = JQUERY_NO_CONFLICT;
+ return Collapse._jQueryInterface;
+ };
+
+ return Collapse;
+}($);
+
+/**
+ * --------------------------------------------------------------------------
+ * Bootstrap (v4.0.0): dropdown.js
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * --------------------------------------------------------------------------
+ */
+
+var Dropdown = function ($$$1) {
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+ var NAME = 'dropdown';
+ var VERSION = '4.0.0';
+ var DATA_KEY = 'bs.dropdown';
+ var EVENT_KEY = "." + DATA_KEY;
+ var DATA_API_KEY = '.data-api';
+ var JQUERY_NO_CONFLICT = $$$1.fn[NAME];
+ var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key
+
+ var SPACE_KEYCODE = 32; // KeyboardEvent.which value for space key
+
+ var TAB_KEYCODE = 9; // KeyboardEvent.which value for tab key
+
+ var ARROW_UP_KEYCODE = 38; // KeyboardEvent.which value for up arrow key
+
+ var ARROW_DOWN_KEYCODE = 40; // KeyboardEvent.which value for down arrow key
+
+ var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse)
+
+ var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEYCODE + "|" + ARROW_DOWN_KEYCODE + "|" + ESCAPE_KEYCODE);
+ var Event = {
+ HIDE: "hide" + EVENT_KEY,
+ HIDDEN: "hidden" + EVENT_KEY,
+ SHOW: "show" + EVENT_KEY,
+ SHOWN: "shown" + EVENT_KEY,
+ CLICK: "click" + EVENT_KEY,
+ CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY,
+ KEYDOWN_DATA_API: "keydown" + EVENT_KEY + DATA_API_KEY,
+ KEYUP_DATA_API: "keyup" + EVENT_KEY + DATA_API_KEY
+ };
+ var ClassName = {
+ DISABLED: 'disabled',
+ SHOW: 'show',
+ DROPUP: 'dropup',
+ DROPRIGHT: 'dropright',
+ DROPLEFT: 'dropleft',
+ MENURIGHT: 'dropdown-menu-right',
+ MENULEFT: 'dropdown-menu-left',
+ POSITION_STATIC: 'position-static'
+ };
+ var Selector = {
+ DATA_TOGGLE: '[data-toggle="dropdown"]',
+ FORM_CHILD: '.dropdown form',
+ MENU: '.dropdown-menu',
+ NAVBAR_NAV: '.navbar-nav',
+ VISIBLE_ITEMS: '.dropdown-menu .dropdown-item:not(.disabled)'
+ };
+ var AttachmentMap = {
+ TOP: 'top-start',
+ TOPEND: 'top-end',
+ BOTTOM: 'bottom-start',
+ BOTTOMEND: 'bottom-end',
+ RIGHT: 'right-start',
+ RIGHTEND: 'right-end',
+ LEFT: 'left-start',
+ LEFTEND: 'left-end'
+ };
+ var Default = {
+ offset: 0,
+ flip: true,
+ boundary: 'scrollParent'
+ };
+ var DefaultType = {
+ offset: '(number|string|function)',
+ flip: 'boolean',
+ boundary: '(string|element)'
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ };
+
+ var Dropdown =
+ /*#__PURE__*/
+ function () {
+ function Dropdown(element, config) {
+ this._element = element;
+ this._popper = null;
+ this._config = this._getConfig(config);
+ this._menu = this._getMenuElement();
+ this._inNavbar = this._detectNavbar();
+
+ this._addEventListeners();
+ } // Getters
+
+
+ var _proto = Dropdown.prototype;
+
+ // Public
+ _proto.toggle = function toggle() {
+ if (this._element.disabled || $$$1(this._element).hasClass(ClassName.DISABLED)) {
+ return;
+ }
+
+ var parent = Dropdown._getParentFromElement(this._element);
+
+ var isActive = $$$1(this._menu).hasClass(ClassName.SHOW);
+
+ Dropdown._clearMenus();
+
+ if (isActive) {
+ return;
+ }
+
+ var relatedTarget = {
+ relatedTarget: this._element
+ };
+ var showEvent = $$$1.Event(Event.SHOW, relatedTarget);
+ $$$1(parent).trigger(showEvent);
+
+ if (showEvent.isDefaultPrevented()) {
+ return;
+ } // Disable totally Popper.js for Dropdown in Navbar
+
+
+ if (!this._inNavbar) {
+ /**
+ * Check for Popper dependency
+ * Popper - https://popper.js.org
+ */
+ if (typeof Popper === 'undefined') {
+ throw new TypeError('Bootstrap dropdown require Popper.js (https://popper.js.org)');
+ }
+
+ var element = this._element; // For dropup with alignment we use the parent as popper container
+
+ if ($$$1(parent).hasClass(ClassName.DROPUP)) {
+ if ($$$1(this._menu).hasClass(ClassName.MENULEFT) || $$$1(this._menu).hasClass(ClassName.MENURIGHT)) {
+ element = parent;
+ }
+ } // If boundary is not `scrollParent`, then set position to `static`
+ // to allow the menu to "escape" the scroll parent's boundaries
+ // https://github.com/twbs/bootstrap/issues/24251
+
+
+ if (this._config.boundary !== 'scrollParent') {
+ $$$1(parent).addClass(ClassName.POSITION_STATIC);
+ }
+
+ this._popper = new Popper(element, this._menu, this._getPopperConfig());
+ } // If this is a touch-enabled device we add extra
+ // empty mouseover listeners to the body's immediate children;
+ // only needed because of broken event delegation on iOS
+ // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
+
+
+ if ('ontouchstart' in document.documentElement && $$$1(parent).closest(Selector.NAVBAR_NAV).length === 0) {
+ $$$1('body').children().on('mouseover', null, $$$1.noop);
+ }
+
+ this._element.focus();
+
+ this._element.setAttribute('aria-expanded', true);
+
+ $$$1(this._menu).toggleClass(ClassName.SHOW);
+ $$$1(parent).toggleClass(ClassName.SHOW).trigger($$$1.Event(Event.SHOWN, relatedTarget));
+ };
+
+ _proto.dispose = function dispose() {
+ $$$1.removeData(this._element, DATA_KEY);
+ $$$1(this._element).off(EVENT_KEY);
+ this._element = null;
+ this._menu = null;
+
+ if (this._popper !== null) {
+ this._popper.destroy();
+
+ this._popper = null;
+ }
+ };
+
+ _proto.update = function update() {
+ this._inNavbar = this._detectNavbar();
+
+ if (this._popper !== null) {
+ this._popper.scheduleUpdate();
+ }
+ }; // Private
+
+
+ _proto._addEventListeners = function _addEventListeners() {
+ var _this = this;
+
+ $$$1(this._element).on(Event.CLICK, function (event) {
+ event.preventDefault();
+ event.stopPropagation();
+
+ _this.toggle();
+ });
+ };
+
+ _proto._getConfig = function _getConfig(config) {
+ config = _extends({}, this.constructor.Default, $$$1(this._element).data(), config);
+ Util.typeCheckConfig(NAME, config, this.constructor.DefaultType);
+ return config;
+ };
+
+ _proto._getMenuElement = function _getMenuElement() {
+ if (!this._menu) {
+ var parent = Dropdown._getParentFromElement(this._element);
+
+ this._menu = $$$1(parent).find(Selector.MENU)[0];
+ }
+
+ return this._menu;
+ };
+
+ _proto._getPlacement = function _getPlacement() {
+ var $parentDropdown = $$$1(this._element).parent();
+ var placement = AttachmentMap.BOTTOM; // Handle dropup
+
+ if ($parentDropdown.hasClass(ClassName.DROPUP)) {
+ placement = AttachmentMap.TOP;
+
+ if ($$$1(this._menu).hasClass(ClassName.MENURIGHT)) {
+ placement = AttachmentMap.TOPEND;
+ }
+ } else if ($parentDropdown.hasClass(ClassName.DROPRIGHT)) {
+ placement = AttachmentMap.RIGHT;
+ } else if ($parentDropdown.hasClass(ClassName.DROPLEFT)) {
+ placement = AttachmentMap.LEFT;
+ } else if ($$$1(this._menu).hasClass(ClassName.MENURIGHT)) {
+ placement = AttachmentMap.BOTTOMEND;
+ }
+
+ return placement;
+ };
+
+ _proto._detectNavbar = function _detectNavbar() {
+ return $$$1(this._element).closest('.navbar').length > 0;
+ };
+
+ _proto._getPopperConfig = function _getPopperConfig() {
+ var _this2 = this;
+
+ var offsetConf = {};
+
+ if (typeof this._config.offset === 'function') {
+ offsetConf.fn = function (data) {
+ data.offsets = _extends({}, data.offsets, _this2._config.offset(data.offsets) || {});
+ return data;
+ };
+ } else {
+ offsetConf.offset = this._config.offset;
+ }
+
+ var popperConfig = {
+ placement: this._getPlacement(),
+ modifiers: {
+ offset: offsetConf,
+ flip: {
+ enabled: this._config.flip
+ },
+ preventOverflow: {
+ boundariesElement: this._config.boundary
+ }
+ }
+ };
+ return popperConfig;
+ }; // Static
+
+
+ Dropdown._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ var data = $$$1(this).data(DATA_KEY);
+
+ var _config = typeof config === 'object' ? config : null;
+
+ if (!data) {
+ data = new Dropdown(this, _config);
+ $$$1(this).data(DATA_KEY, data);
+ }
+
+ if (typeof config === 'string') {
+ if (typeof data[config] === 'undefined') {
+ throw new TypeError("No method named \"" + config + "\"");
+ }
+
+ data[config]();
+ }
+ });
+ };
+
+ Dropdown._clearMenus = function _clearMenus(event) {
+ if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH || event.type === 'keyup' && event.which !== TAB_KEYCODE)) {
+ return;
+ }
+
+ var toggles = $$$1.makeArray($$$1(Selector.DATA_TOGGLE));
+
+ for (var i = 0; i < toggles.length; i++) {
+ var parent = Dropdown._getParentFromElement(toggles[i]);
+
+ var context = $$$1(toggles[i]).data(DATA_KEY);
+ var relatedTarget = {
+ relatedTarget: toggles[i]
+ };
+
+ if (!context) {
+ continue;
+ }
+
+ var dropdownMenu = context._menu;
+
+ if (!$$$1(parent).hasClass(ClassName.SHOW)) {
+ continue;
+ }
+
+ if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) && $$$1.contains(parent, event.target)) {
+ continue;
+ }
+
+ var hideEvent = $$$1.Event(Event.HIDE, relatedTarget);
+ $$$1(parent).trigger(hideEvent);
+
+ if (hideEvent.isDefaultPrevented()) {
+ continue;
+ } // If this is a touch-enabled device we remove the extra
+ // empty mouseover listeners we added for iOS support
+
+
+ if ('ontouchstart' in document.documentElement) {
+ $$$1('body').children().off('mouseover', null, $$$1.noop);
+ }
+
+ toggles[i].setAttribute('aria-expanded', 'false');
+ $$$1(dropdownMenu).removeClass(ClassName.SHOW);
+ $$$1(parent).removeClass(ClassName.SHOW).trigger($$$1.Event(Event.HIDDEN, relatedTarget));
+ }
+ };
+
+ Dropdown._getParentFromElement = function _getParentFromElement(element) {
+ var parent;
+ var selector = Util.getSelectorFromElement(element);
+
+ if (selector) {
+ parent = $$$1(selector)[0];
+ }
+
+ return parent || element.parentNode;
+ }; // eslint-disable-next-line complexity
+
+
+ Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) {
+ // If not input/textarea:
+ // - And not a key in REGEXP_KEYDOWN => not a dropdown command
+ // If input/textarea:
+ // - If space key => not a dropdown command
+ // - If key is other than escape
+ // - If key is not up or down => not a dropdown command
+ // - If trigger inside the menu => not a dropdown command
+ if (/input|textarea/i.test(event.target.tagName) ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE && (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE || $$$1(event.target).closest(Selector.MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {
+ return;
+ }
+
+ event.preventDefault();
+ event.stopPropagation();
+
+ if (this.disabled || $$$1(this).hasClass(ClassName.DISABLED)) {
+ return;
+ }
+
+ var parent = Dropdown._getParentFromElement(this);
+
+ var isActive = $$$1(parent).hasClass(ClassName.SHOW);
+
+ if (!isActive && (event.which !== ESCAPE_KEYCODE || event.which !== SPACE_KEYCODE) || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {
+ if (event.which === ESCAPE_KEYCODE) {
+ var toggle = $$$1(parent).find(Selector.DATA_TOGGLE)[0];
+ $$$1(toggle).trigger('focus');
+ }
+
+ $$$1(this).trigger('click');
+ return;
+ }
+
+ var items = $$$1(parent).find(Selector.VISIBLE_ITEMS).get();
+
+ if (items.length === 0) {
+ return;
+ }
+
+ var index = items.indexOf(event.target);
+
+ if (event.which === ARROW_UP_KEYCODE && index > 0) {
+ // Up
+ index--;
+ }
+
+ if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) {
+ // Down
+ index++;
+ }
+
+ if (index < 0) {
+ index = 0;
+ }
+
+ items[index].focus();
+ };
+
+ _createClass(Dropdown, null, [{
+ key: "VERSION",
+ get: function get() {
+ return VERSION;
+ }
+ }, {
+ key: "Default",
+ get: function get() {
+ return Default;
+ }
+ }, {
+ key: "DefaultType",
+ get: function get() {
+ return DefaultType;
+ }
+ }]);
+ return Dropdown;
+ }();
+ /**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
+
+
+ $$$1(document).on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(Event.KEYDOWN_DATA_API, Selector.MENU, Dropdown._dataApiKeydownHandler).on(Event.CLICK_DATA_API + " " + Event.KEYUP_DATA_API, Dropdown._clearMenus).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
+ event.preventDefault();
+ event.stopPropagation();
+
+ Dropdown._jQueryInterface.call($$$1(this), 'toggle');
+ }).on(Event.CLICK_DATA_API, Selector.FORM_CHILD, function (e) {
+ e.stopPropagation();
+ });
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+ $$$1.fn[NAME] = Dropdown._jQueryInterface;
+ $$$1.fn[NAME].Constructor = Dropdown;
+
+ $$$1.fn[NAME].noConflict = function () {
+ $$$1.fn[NAME] = JQUERY_NO_CONFLICT;
+ return Dropdown._jQueryInterface;
+ };
+
+ return Dropdown;
+}($, Popper);
+
+/**
+ * --------------------------------------------------------------------------
+ * Bootstrap (v4.0.0): modal.js
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * --------------------------------------------------------------------------
+ */
+
+var Modal = function ($$$1) {
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+ var NAME = 'modal';
+ var VERSION = '4.0.0';
+ var DATA_KEY = 'bs.modal';
+ var EVENT_KEY = "." + DATA_KEY;
+ var DATA_API_KEY = '.data-api';
+ var JQUERY_NO_CONFLICT = $$$1.fn[NAME];
+ var TRANSITION_DURATION = 300;
+ var BACKDROP_TRANSITION_DURATION = 150;
+ var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key
+
+ var Default = {
+ backdrop: true,
+ keyboard: true,
+ focus: true,
+ show: true
+ };
+ var DefaultType = {
+ backdrop: '(boolean|string)',
+ keyboard: 'boolean',
+ focus: 'boolean',
+ show: 'boolean'
+ };
+ var Event = {
+ HIDE: "hide" + EVENT_KEY,
+ HIDDEN: "hidden" + EVENT_KEY,
+ SHOW: "show" + EVENT_KEY,
+ SHOWN: "shown" + EVENT_KEY,
+ FOCUSIN: "focusin" + EVENT_KEY,
+ RESIZE: "resize" + EVENT_KEY,
+ CLICK_DISMISS: "click.dismiss" + EVENT_KEY,
+ KEYDOWN_DISMISS: "keydown.dismiss" + EVENT_KEY,
+ MOUSEUP_DISMISS: "mouseup.dismiss" + EVENT_KEY,
+ MOUSEDOWN_DISMISS: "mousedown.dismiss" + EVENT_KEY,
+ CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY
+ };
+ var ClassName = {
+ SCROLLBAR_MEASURER: 'modal-scrollbar-measure',
+ BACKDROP: 'modal-backdrop',
+ OPEN: 'modal-open',
+ FADE: 'fade',
+ SHOW: 'show'
+ };
+ var Selector = {
+ DIALOG: '.modal-dialog',
+ DATA_TOGGLE: '[data-toggle="modal"]',
+ DATA_DISMISS: '[data-dismiss="modal"]',
+ FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top',
+ STICKY_CONTENT: '.sticky-top',
+ NAVBAR_TOGGLER: '.navbar-toggler'
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ };
+
+ var Modal =
+ /*#__PURE__*/
+ function () {
+ function Modal(element, config) {
+ this._config = this._getConfig(config);
+ this._element = element;
+ this._dialog = $$$1(element).find(Selector.DIALOG)[0];
+ this._backdrop = null;
+ this._isShown = false;
+ this._isBodyOverflowing = false;
+ this._ignoreBackdropClick = false;
+ this._originalBodyPadding = 0;
+ this._scrollbarWidth = 0;
+ } // Getters
+
+
+ var _proto = Modal.prototype;
+
+ // Public
+ _proto.toggle = function toggle(relatedTarget) {
+ return this._isShown ? this.hide() : this.show(relatedTarget);
+ };
+
+ _proto.show = function show(relatedTarget) {
+ var _this = this;
+
+ if (this._isTransitioning || this._isShown) {
+ return;
+ }
+
+ if (Util.supportsTransitionEnd() && $$$1(this._element).hasClass(ClassName.FADE)) {
+ this._isTransitioning = true;
+ }
+
+ var showEvent = $$$1.Event(Event.SHOW, {
+ relatedTarget: relatedTarget
+ });
+ $$$1(this._element).trigger(showEvent);
+
+ if (this._isShown || showEvent.isDefaultPrevented()) {
+ return;
+ }
+
+ this._isShown = true;
+
+ this._checkScrollbar();
+
+ this._setScrollbar();
+
+ this._adjustDialog();
+
+ $$$1(document.body).addClass(ClassName.OPEN);
+
+ this._setEscapeEvent();
+
+ this._setResizeEvent();
+
+ $$$1(this._element).on(Event.CLICK_DISMISS, Selector.DATA_DISMISS, function (event) {
+ return _this.hide(event);
+ });
+ $$$1(this._dialog).on(Event.MOUSEDOWN_DISMISS, function () {
+ $$$1(_this._element).one(Event.MOUSEUP_DISMISS, function (event) {
+ if ($$$1(event.target).is(_this._element)) {
+ _this._ignoreBackdropClick = true;
+ }
+ });
+ });
+
+ this._showBackdrop(function () {
+ return _this._showElement(relatedTarget);
+ });
+ };
+
+ _proto.hide = function hide(event) {
+ var _this2 = this;
+
+ if (event) {
+ event.preventDefault();
+ }
+
+ if (this._isTransitioning || !this._isShown) {
+ return;
+ }
+
+ var hideEvent = $$$1.Event(Event.HIDE);
+ $$$1(this._element).trigger(hideEvent);
+
+ if (!this._isShown || hideEvent.isDefaultPrevented()) {
+ return;
+ }
+
+ this._isShown = false;
+ var transition = Util.supportsTransitionEnd() && $$$1(this._element).hasClass(ClassName.FADE);
+
+ if (transition) {
+ this._isTransitioning = true;
+ }
+
+ this._setEscapeEvent();
+
+ this._setResizeEvent();
+
+ $$$1(document).off(Event.FOCUSIN);
+ $$$1(this._element).removeClass(ClassName.SHOW);
+ $$$1(this._element).off(Event.CLICK_DISMISS);
+ $$$1(this._dialog).off(Event.MOUSEDOWN_DISMISS);
+
+ if (transition) {
+ $$$1(this._element).one(Util.TRANSITION_END, function (event) {
+ return _this2._hideModal(event);
+ }).emulateTransitionEnd(TRANSITION_DURATION);
+ } else {
+ this._hideModal();
+ }
+ };
+
+ _proto.dispose = function dispose() {
+ $$$1.removeData(this._element, DATA_KEY);
+ $$$1(window, document, this._element, this._backdrop).off(EVENT_KEY);
+ this._config = null;
+ this._element = null;
+ this._dialog = null;
+ this._backdrop = null;
+ this._isShown = null;
+ this._isBodyOverflowing = null;
+ this._ignoreBackdropClick = null;
+ this._scrollbarWidth = null;
+ };
+
+ _proto.handleUpdate = function handleUpdate() {
+ this._adjustDialog();
+ }; // Private
+
+
+ _proto._getConfig = function _getConfig(config) {
+ config = _extends({}, Default, config);
+ Util.typeCheckConfig(NAME, config, DefaultType);
+ return config;
+ };
+
+ _proto._showElement = function _showElement(relatedTarget) {
+ var _this3 = this;
+
+ var transition = Util.supportsTransitionEnd() && $$$1(this._element).hasClass(ClassName.FADE);
+
+ if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
+ // Don't move modal's DOM position
+ document.body.appendChild(this._element);
+ }
+
+ this._element.style.display = 'block';
+
+ this._element.removeAttribute('aria-hidden');
+
+ this._element.scrollTop = 0;
+
+ if (transition) {
+ Util.reflow(this._element);
+ }
+
+ $$$1(this._element).addClass(ClassName.SHOW);
+
+ if (this._config.focus) {
+ this._enforceFocus();
+ }
+
+ var shownEvent = $$$1.Event(Event.SHOWN, {
+ relatedTarget: relatedTarget
+ });
+
+ var transitionComplete = function transitionComplete() {
+ if (_this3._config.focus) {
+ _this3._element.focus();
+ }
+
+ _this3._isTransitioning = false;
+ $$$1(_this3._element).trigger(shownEvent);
+ };
+
+ if (transition) {
+ $$$1(this._dialog).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(TRANSITION_DURATION);
+ } else {
+ transitionComplete();
+ }
+ };
+
+ _proto._enforceFocus = function _enforceFocus() {
+ var _this4 = this;
+
+ $$$1(document).off(Event.FOCUSIN) // Guard against infinite focus loop
+ .on(Event.FOCUSIN, function (event) {
+ if (document !== event.target && _this4._element !== event.target && $$$1(_this4._element).has(event.target).length === 0) {
+ _this4._element.focus();
+ }
+ });
+ };
+
+ _proto._setEscapeEvent = function _setEscapeEvent() {
+ var _this5 = this;
+
+ if (this._isShown && this._config.keyboard) {
+ $$$1(this._element).on(Event.KEYDOWN_DISMISS, function (event) {
+ if (event.which === ESCAPE_KEYCODE) {
+ event.preventDefault();
+
+ _this5.hide();
+ }
+ });
+ } else if (!this._isShown) {
+ $$$1(this._element).off(Event.KEYDOWN_DISMISS);
+ }
+ };
+
+ _proto._setResizeEvent = function _setResizeEvent() {
+ var _this6 = this;
+
+ if (this._isShown) {
+ $$$1(window).on(Event.RESIZE, function (event) {
+ return _this6.handleUpdate(event);
+ });
+ } else {
+ $$$1(window).off(Event.RESIZE);
+ }
+ };
+
+ _proto._hideModal = function _hideModal() {
+ var _this7 = this;
+
+ this._element.style.display = 'none';
+
+ this._element.setAttribute('aria-hidden', true);
+
+ this._isTransitioning = false;
+
+ this._showBackdrop(function () {
+ $$$1(document.body).removeClass(ClassName.OPEN);
+
+ _this7._resetAdjustments();
+
+ _this7._resetScrollbar();
+
+ $$$1(_this7._element).trigger(Event.HIDDEN);
+ });
+ };
+
+ _proto._removeBackdrop = function _removeBackdrop() {
+ if (this._backdrop) {
+ $$$1(this._backdrop).remove();
+ this._backdrop = null;
+ }
+ };
+
+ _proto._showBackdrop = function _showBackdrop(callback) {
+ var _this8 = this;
+
+ var animate = $$$1(this._element).hasClass(ClassName.FADE) ? ClassName.FADE : '';
+
+ if (this._isShown && this._config.backdrop) {
+ var doAnimate = Util.supportsTransitionEnd() && animate;
+ this._backdrop = document.createElement('div');
+ this._backdrop.className = ClassName.BACKDROP;
+
+ if (animate) {
+ $$$1(this._backdrop).addClass(animate);
+ }
+
+ $$$1(this._backdrop).appendTo(document.body);
+ $$$1(this._element).on(Event.CLICK_DISMISS, function (event) {
+ if (_this8._ignoreBackdropClick) {
+ _this8._ignoreBackdropClick = false;
+ return;
+ }
+
+ if (event.target !== event.currentTarget) {
+ return;
+ }
+
+ if (_this8._config.backdrop === 'static') {
+ _this8._element.focus();
+ } else {
+ _this8.hide();
+ }
+ });
+
+ if (doAnimate) {
+ Util.reflow(this._backdrop);
+ }
+
+ $$$1(this._backdrop).addClass(ClassName.SHOW);
+
+ if (!callback) {
+ return;
+ }
+
+ if (!doAnimate) {
+ callback();
+ return;
+ }
+
+ $$$1(this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(BACKDROP_TRANSITION_DURATION);
+ } else if (!this._isShown && this._backdrop) {
+ $$$1(this._backdrop).removeClass(ClassName.SHOW);
+
+ var callbackRemove = function callbackRemove() {
+ _this8._removeBackdrop();
+
+ if (callback) {
+ callback();
+ }
+ };
+
+ if (Util.supportsTransitionEnd() && $$$1(this._element).hasClass(ClassName.FADE)) {
+ $$$1(this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(BACKDROP_TRANSITION_DURATION);
+ } else {
+ callbackRemove();
+ }
+ } else if (callback) {
+ callback();
+ }
+ }; // ----------------------------------------------------------------------
+ // the following methods are used to handle overflowing modals
+ // todo (fat): these should probably be refactored out of modal.js
+ // ----------------------------------------------------------------------
+
+
+ _proto._adjustDialog = function _adjustDialog() {
+ var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
+
+ if (!this._isBodyOverflowing && isModalOverflowing) {
+ this._element.style.paddingLeft = this._scrollbarWidth + "px";
+ }
+
+ if (this._isBodyOverflowing && !isModalOverflowing) {
+ this._element.style.paddingRight = this._scrollbarWidth + "px";
+ }
+ };
+
+ _proto._resetAdjustments = function _resetAdjustments() {
+ this._element.style.paddingLeft = '';
+ this._element.style.paddingRight = '';
+ };
+
+ _proto._checkScrollbar = function _checkScrollbar() {
+ var rect = document.body.getBoundingClientRect();
+ this._isBodyOverflowing = rect.left + rect.right < window.innerWidth;
+ this._scrollbarWidth = this._getScrollbarWidth();
+ };
+
+ _proto._setScrollbar = function _setScrollbar() {
+ var _this9 = this;
+
+ if (this._isBodyOverflowing) {
+ // Note: DOMNode.style.paddingRight returns the actual value or '' if not set
+ // while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set
+ // Adjust fixed content padding
+ $$$1(Selector.FIXED_CONTENT).each(function (index, element) {
+ var actualPadding = $$$1(element)[0].style.paddingRight;
+ var calculatedPadding = $$$1(element).css('padding-right');
+ $$$1(element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this9._scrollbarWidth + "px");
+ }); // Adjust sticky content margin
+
+ $$$1(Selector.STICKY_CONTENT).each(function (index, element) {
+ var actualMargin = $$$1(element)[0].style.marginRight;
+ var calculatedMargin = $$$1(element).css('margin-right');
+ $$$1(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) - _this9._scrollbarWidth + "px");
+ }); // Adjust navbar-toggler margin
+
+ $$$1(Selector.NAVBAR_TOGGLER).each(function (index, element) {
+ var actualMargin = $$$1(element)[0].style.marginRight;
+ var calculatedMargin = $$$1(element).css('margin-right');
+ $$$1(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) + _this9._scrollbarWidth + "px");
+ }); // Adjust body padding
+
+ var actualPadding = document.body.style.paddingRight;
+ var calculatedPadding = $$$1('body').css('padding-right');
+ $$$1('body').data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + this._scrollbarWidth + "px");
+ }
+ };
+
+ _proto._resetScrollbar = function _resetScrollbar() {
+ // Restore fixed content padding
+ $$$1(Selector.FIXED_CONTENT).each(function (index, element) {
+ var padding = $$$1(element).data('padding-right');
+
+ if (typeof padding !== 'undefined') {
+ $$$1(element).css('padding-right', padding).removeData('padding-right');
+ }
+ }); // Restore sticky content and navbar-toggler margin
+
+ $$$1(Selector.STICKY_CONTENT + ", " + Selector.NAVBAR_TOGGLER).each(function (index, element) {
+ var margin = $$$1(element).data('margin-right');
+
+ if (typeof margin !== 'undefined') {
+ $$$1(element).css('margin-right', margin).removeData('margin-right');
+ }
+ }); // Restore body padding
+
+ var padding = $$$1('body').data('padding-right');
+
+ if (typeof padding !== 'undefined') {
+ $$$1('body').css('padding-right', padding).removeData('padding-right');
+ }
+ };
+
+ _proto._getScrollbarWidth = function _getScrollbarWidth() {
+ // thx d.walsh
+ var scrollDiv = document.createElement('div');
+ scrollDiv.className = ClassName.SCROLLBAR_MEASURER;
+ document.body.appendChild(scrollDiv);
+ var scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth;
+ document.body.removeChild(scrollDiv);
+ return scrollbarWidth;
+ }; // Static
+
+
+ Modal._jQueryInterface = function _jQueryInterface(config, relatedTarget) {
+ return this.each(function () {
+ var data = $$$1(this).data(DATA_KEY);
+
+ var _config = _extends({}, Modal.Default, $$$1(this).data(), typeof config === 'object' && config);
+
+ if (!data) {
+ data = new Modal(this, _config);
+ $$$1(this).data(DATA_KEY, data);
+ }
+
+ if (typeof config === 'string') {
+ if (typeof data[config] === 'undefined') {
+ throw new TypeError("No method named \"" + config + "\"");
+ }
+
+ data[config](relatedTarget);
+ } else if (_config.show) {
+ data.show(relatedTarget);
+ }
+ });
+ };
+
+ _createClass(Modal, null, [{
+ key: "VERSION",
+ get: function get() {
+ return VERSION;
+ }
+ }, {
+ key: "Default",
+ get: function get() {
+ return Default;
+ }
+ }]);
+ return Modal;
+ }();
+ /**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
+
+
+ $$$1(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
+ var _this10 = this;
+
+ var target;
+ var selector = Util.getSelectorFromElement(this);
+
+ if (selector) {
+ target = $$$1(selector)[0];
+ }
+
+ var config = $$$1(target).data(DATA_KEY) ? 'toggle' : _extends({}, $$$1(target).data(), $$$1(this).data());
+
+ if (this.tagName === 'A' || this.tagName === 'AREA') {
+ event.preventDefault();
+ }
+
+ var $target = $$$1(target).one(Event.SHOW, function (showEvent) {
+ if (showEvent.isDefaultPrevented()) {
+ // Only register focus restorer if modal will actually get shown
+ return;
+ }
+
+ $target.one(Event.HIDDEN, function () {
+ if ($$$1(_this10).is(':visible')) {
+ _this10.focus();
+ }
+ });
+ });
+
+ Modal._jQueryInterface.call($$$1(target), config, this);
+ });
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+ $$$1.fn[NAME] = Modal._jQueryInterface;
+ $$$1.fn[NAME].Constructor = Modal;
+
+ $$$1.fn[NAME].noConflict = function () {
+ $$$1.fn[NAME] = JQUERY_NO_CONFLICT;
+ return Modal._jQueryInterface;
+ };
+
+ return Modal;
+}($);
+
+/**
+ * --------------------------------------------------------------------------
+ * Bootstrap (v4.0.0): tooltip.js
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * --------------------------------------------------------------------------
+ */
+
+var Tooltip = function ($$$1) {
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+ var NAME = 'tooltip';
+ var VERSION = '4.0.0';
+ var DATA_KEY = 'bs.tooltip';
+ var EVENT_KEY = "." + DATA_KEY;
+ var JQUERY_NO_CONFLICT = $$$1.fn[NAME];
+ var TRANSITION_DURATION = 150;
+ var CLASS_PREFIX = 'bs-tooltip';
+ var BSCLS_PREFIX_REGEX = new RegExp("(^|\\s)" + CLASS_PREFIX + "\\S+", 'g');
+ var DefaultType = {
+ animation: 'boolean',
+ template: 'string',
+ title: '(string|element|function)',
+ trigger: 'string',
+ delay: '(number|object)',
+ html: 'boolean',
+ selector: '(string|boolean)',
+ placement: '(string|function)',
+ offset: '(number|string)',
+ container: '(string|element|boolean)',
+ fallbackPlacement: '(string|array)',
+ boundary: '(string|element)'
+ };
+ var AttachmentMap = {
+ AUTO: 'auto',
+ TOP: 'top',
+ RIGHT: 'right',
+ BOTTOM: 'bottom',
+ LEFT: 'left'
+ };
+ var Default = {
+ animation: true,
+ template: '',
+ trigger: 'hover focus',
+ title: '',
+ delay: 0,
+ html: false,
+ selector: false,
+ placement: 'top',
+ offset: 0,
+ container: false,
+ fallbackPlacement: 'flip',
+ boundary: 'scrollParent'
+ };
+ var HoverState = {
+ SHOW: 'show',
+ OUT: 'out'
+ };
+ var Event = {
+ HIDE: "hide" + EVENT_KEY,
+ HIDDEN: "hidden" + EVENT_KEY,
+ SHOW: "show" + EVENT_KEY,
+ SHOWN: "shown" + EVENT_KEY,
+ INSERTED: "inserted" + EVENT_KEY,
+ CLICK: "click" + EVENT_KEY,
+ FOCUSIN: "focusin" + EVENT_KEY,
+ FOCUSOUT: "focusout" + EVENT_KEY,
+ MOUSEENTER: "mouseenter" + EVENT_KEY,
+ MOUSELEAVE: "mouseleave" + EVENT_KEY
+ };
+ var ClassName = {
+ FADE: 'fade',
+ SHOW: 'show'
+ };
+ var Selector = {
+ TOOLTIP: '.tooltip',
+ TOOLTIP_INNER: '.tooltip-inner',
+ ARROW: '.arrow'
+ };
+ var Trigger = {
+ HOVER: 'hover',
+ FOCUS: 'focus',
+ CLICK: 'click',
+ MANUAL: 'manual'
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ };
+
+ var Tooltip =
+ /*#__PURE__*/
+ function () {
+ function Tooltip(element, config) {
+ /**
+ * Check for Popper dependency
+ * Popper - https://popper.js.org
+ */
+ if (typeof Popper === 'undefined') {
+ throw new TypeError('Bootstrap tooltips require Popper.js (https://popper.js.org)');
+ } // private
+
+
+ this._isEnabled = true;
+ this._timeout = 0;
+ this._hoverState = '';
+ this._activeTrigger = {};
+ this._popper = null; // Protected
+
+ this.element = element;
+ this.config = this._getConfig(config);
+ this.tip = null;
+
+ this._setListeners();
+ } // Getters
+
+
+ var _proto = Tooltip.prototype;
+
+ // Public
+ _proto.enable = function enable() {
+ this._isEnabled = true;
+ };
+
+ _proto.disable = function disable() {
+ this._isEnabled = false;
+ };
+
+ _proto.toggleEnabled = function toggleEnabled() {
+ this._isEnabled = !this._isEnabled;
+ };
+
+ _proto.toggle = function toggle(event) {
+ if (!this._isEnabled) {
+ return;
+ }
+
+ if (event) {
+ var dataKey = this.constructor.DATA_KEY;
+ var context = $$$1(event.currentTarget).data(dataKey);
+
+ if (!context) {
+ context = new this.constructor(event.currentTarget, this._getDelegateConfig());
+ $$$1(event.currentTarget).data(dataKey, context);
+ }
+
+ context._activeTrigger.click = !context._activeTrigger.click;
+
+ if (context._isWithActiveTrigger()) {
+ context._enter(null, context);
+ } else {
+ context._leave(null, context);
+ }
+ } else {
+ if ($$$1(this.getTipElement()).hasClass(ClassName.SHOW)) {
+ this._leave(null, this);
+
+ return;
+ }
+
+ this._enter(null, this);
+ }
+ };
+
+ _proto.dispose = function dispose() {
+ clearTimeout(this._timeout);
+ $$$1.removeData(this.element, this.constructor.DATA_KEY);
+ $$$1(this.element).off(this.constructor.EVENT_KEY);
+ $$$1(this.element).closest('.modal').off('hide.bs.modal');
+
+ if (this.tip) {
+ $$$1(this.tip).remove();
+ }
+
+ this._isEnabled = null;
+ this._timeout = null;
+ this._hoverState = null;
+ this._activeTrigger = null;
+
+ if (this._popper !== null) {
+ this._popper.destroy();
+ }
+
+ this._popper = null;
+ this.element = null;
+ this.config = null;
+ this.tip = null;
+ };
+
+ _proto.show = function show() {
+ var _this = this;
+
+ if ($$$1(this.element).css('display') === 'none') {
+ throw new Error('Please use show on visible elements');
+ }
+
+ var showEvent = $$$1.Event(this.constructor.Event.SHOW);
+
+ if (this.isWithContent() && this._isEnabled) {
+ $$$1(this.element).trigger(showEvent);
+ var isInTheDom = $$$1.contains(this.element.ownerDocument.documentElement, this.element);
+
+ if (showEvent.isDefaultPrevented() || !isInTheDom) {
+ return;
+ }
+
+ var tip = this.getTipElement();
+ var tipId = Util.getUID(this.constructor.NAME);
+ tip.setAttribute('id', tipId);
+ this.element.setAttribute('aria-describedby', tipId);
+ this.setContent();
+
+ if (this.config.animation) {
+ $$$1(tip).addClass(ClassName.FADE);
+ }
+
+ var placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this.element) : this.config.placement;
+
+ var attachment = this._getAttachment(placement);
+
+ this.addAttachmentClass(attachment);
+ var container = this.config.container === false ? document.body : $$$1(this.config.container);
+ $$$1(tip).data(this.constructor.DATA_KEY, this);
+
+ if (!$$$1.contains(this.element.ownerDocument.documentElement, this.tip)) {
+ $$$1(tip).appendTo(container);
+ }
+
+ $$$1(this.element).trigger(this.constructor.Event.INSERTED);
+ this._popper = new Popper(this.element, tip, {
+ placement: attachment,
+ modifiers: {
+ offset: {
+ offset: this.config.offset
+ },
+ flip: {
+ behavior: this.config.fallbackPlacement
+ },
+ arrow: {
+ element: Selector.ARROW
+ },
+ preventOverflow: {
+ boundariesElement: this.config.boundary
+ }
+ },
+ onCreate: function onCreate(data) {
+ if (data.originalPlacement !== data.placement) {
+ _this._handlePopperPlacementChange(data);
+ }
+ },
+ onUpdate: function onUpdate(data) {
+ _this._handlePopperPlacementChange(data);
+ }
+ });
+ $$$1(tip).addClass(ClassName.SHOW); // If this is a touch-enabled device we add extra
+ // empty mouseover listeners to the body's immediate children;
+ // only needed because of broken event delegation on iOS
+ // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
+
+ if ('ontouchstart' in document.documentElement) {
+ $$$1('body').children().on('mouseover', null, $$$1.noop);
+ }
+
+ var complete = function complete() {
+ if (_this.config.animation) {
+ _this._fixTransition();
+ }
+
+ var prevHoverState = _this._hoverState;
+ _this._hoverState = null;
+ $$$1(_this.element).trigger(_this.constructor.Event.SHOWN);
+
+ if (prevHoverState === HoverState.OUT) {
+ _this._leave(null, _this);
+ }
+ };
+
+ if (Util.supportsTransitionEnd() && $$$1(this.tip).hasClass(ClassName.FADE)) {
+ $$$1(this.tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(Tooltip._TRANSITION_DURATION);
+ } else {
+ complete();
+ }
+ }
+ };
+
+ _proto.hide = function hide(callback) {
+ var _this2 = this;
+
+ var tip = this.getTipElement();
+ var hideEvent = $$$1.Event(this.constructor.Event.HIDE);
+
+ var complete = function complete() {
+ if (_this2._hoverState !== HoverState.SHOW && tip.parentNode) {
+ tip.parentNode.removeChild(tip);
+ }
+
+ _this2._cleanTipClass();
+
+ _this2.element.removeAttribute('aria-describedby');
+
+ $$$1(_this2.element).trigger(_this2.constructor.Event.HIDDEN);
+
+ if (_this2._popper !== null) {
+ _this2._popper.destroy();
+ }
+
+ if (callback) {
+ callback();
+ }
+ };
+
+ $$$1(this.element).trigger(hideEvent);
+
+ if (hideEvent.isDefaultPrevented()) {
+ return;
+ }
+
+ $$$1(tip).removeClass(ClassName.SHOW); // If this is a touch-enabled device we remove the extra
+ // empty mouseover listeners we added for iOS support
+
+ if ('ontouchstart' in document.documentElement) {
+ $$$1('body').children().off('mouseover', null, $$$1.noop);
+ }
+
+ this._activeTrigger[Trigger.CLICK] = false;
+ this._activeTrigger[Trigger.FOCUS] = false;
+ this._activeTrigger[Trigger.HOVER] = false;
+
+ if (Util.supportsTransitionEnd() && $$$1(this.tip).hasClass(ClassName.FADE)) {
+ $$$1(tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);
+ } else {
+ complete();
+ }
+
+ this._hoverState = '';
+ };
+
+ _proto.update = function update() {
+ if (this._popper !== null) {
+ this._popper.scheduleUpdate();
+ }
+ }; // Protected
+
+
+ _proto.isWithContent = function isWithContent() {
+ return Boolean(this.getTitle());
+ };
+
+ _proto.addAttachmentClass = function addAttachmentClass(attachment) {
+ $$$1(this.getTipElement()).addClass(CLASS_PREFIX + "-" + attachment);
+ };
+
+ _proto.getTipElement = function getTipElement() {
+ this.tip = this.tip || $$$1(this.config.template)[0];
+ return this.tip;
+ };
+
+ _proto.setContent = function setContent() {
+ var $tip = $$$1(this.getTipElement());
+ this.setElementContent($tip.find(Selector.TOOLTIP_INNER), this.getTitle());
+ $tip.removeClass(ClassName.FADE + " " + ClassName.SHOW);
+ };
+
+ _proto.setElementContent = function setElementContent($element, content) {
+ var html = this.config.html;
+
+ if (typeof content === 'object' && (content.nodeType || content.jquery)) {
+ // Content is a DOM node or a jQuery
+ if (html) {
+ if (!$$$1(content).parent().is($element)) {
+ $element.empty().append(content);
+ }
+ } else {
+ $element.text($$$1(content).text());
+ }
+ } else {
+ $element[html ? 'html' : 'text'](content);
+ }
+ };
+
+ _proto.getTitle = function getTitle() {
+ var title = this.element.getAttribute('data-original-title');
+
+ if (!title) {
+ title = typeof this.config.title === 'function' ? this.config.title.call(this.element) : this.config.title;
+ }
+
+ return title;
+ }; // Private
+
+
+ _proto._getAttachment = function _getAttachment(placement) {
+ return AttachmentMap[placement.toUpperCase()];
+ };
+
+ _proto._setListeners = function _setListeners() {
+ var _this3 = this;
+
+ var triggers = this.config.trigger.split(' ');
+ triggers.forEach(function (trigger) {
+ if (trigger === 'click') {
+ $$$1(_this3.element).on(_this3.constructor.Event.CLICK, _this3.config.selector, function (event) {
+ return _this3.toggle(event);
+ });
+ } else if (trigger !== Trigger.MANUAL) {
+ var eventIn = trigger === Trigger.HOVER ? _this3.constructor.Event.MOUSEENTER : _this3.constructor.Event.FOCUSIN;
+ var eventOut = trigger === Trigger.HOVER ? _this3.constructor.Event.MOUSELEAVE : _this3.constructor.Event.FOCUSOUT;
+ $$$1(_this3.element).on(eventIn, _this3.config.selector, function (event) {
+ return _this3._enter(event);
+ }).on(eventOut, _this3.config.selector, function (event) {
+ return _this3._leave(event);
+ });
+ }
+
+ $$$1(_this3.element).closest('.modal').on('hide.bs.modal', function () {
+ return _this3.hide();
+ });
+ });
+
+ if (this.config.selector) {
+ this.config = _extends({}, this.config, {
+ trigger: 'manual',
+ selector: ''
+ });
+ } else {
+ this._fixTitle();
+ }
+ };
+
+ _proto._fixTitle = function _fixTitle() {
+ var titleType = typeof this.element.getAttribute('data-original-title');
+
+ if (this.element.getAttribute('title') || titleType !== 'string') {
+ this.element.setAttribute('data-original-title', this.element.getAttribute('title') || '');
+ this.element.setAttribute('title', '');
+ }
+ };
+
+ _proto._enter = function _enter(event, context) {
+ var dataKey = this.constructor.DATA_KEY;
+ context = context || $$$1(event.currentTarget).data(dataKey);
+
+ if (!context) {
+ context = new this.constructor(event.currentTarget, this._getDelegateConfig());
+ $$$1(event.currentTarget).data(dataKey, context);
+ }
+
+ if (event) {
+ context._activeTrigger[event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER] = true;
+ }
+
+ if ($$$1(context.getTipElement()).hasClass(ClassName.SHOW) || context._hoverState === HoverState.SHOW) {
+ context._hoverState = HoverState.SHOW;
+ return;
+ }
+
+ clearTimeout(context._timeout);
+ context._hoverState = HoverState.SHOW;
+
+ if (!context.config.delay || !context.config.delay.show) {
+ context.show();
+ return;
+ }
+
+ context._timeout = setTimeout(function () {
+ if (context._hoverState === HoverState.SHOW) {
+ context.show();
+ }
+ }, context.config.delay.show);
+ };
+
+ _proto._leave = function _leave(event, context) {
+ var dataKey = this.constructor.DATA_KEY;
+ context = context || $$$1(event.currentTarget).data(dataKey);
+
+ if (!context) {
+ context = new this.constructor(event.currentTarget, this._getDelegateConfig());
+ $$$1(event.currentTarget).data(dataKey, context);
+ }
+
+ if (event) {
+ context._activeTrigger[event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER] = false;
+ }
+
+ if (context._isWithActiveTrigger()) {
+ return;
+ }
+
+ clearTimeout(context._timeout);
+ context._hoverState = HoverState.OUT;
+
+ if (!context.config.delay || !context.config.delay.hide) {
+ context.hide();
+ return;
+ }
+
+ context._timeout = setTimeout(function () {
+ if (context._hoverState === HoverState.OUT) {
+ context.hide();
+ }
+ }, context.config.delay.hide);
+ };
+
+ _proto._isWithActiveTrigger = function _isWithActiveTrigger() {
+ for (var trigger in this._activeTrigger) {
+ if (this._activeTrigger[trigger]) {
+ return true;
+ }
+ }
+
+ return false;
+ };
+
+ _proto._getConfig = function _getConfig(config) {
+ config = _extends({}, this.constructor.Default, $$$1(this.element).data(), config);
+
+ if (typeof config.delay === 'number') {
+ config.delay = {
+ show: config.delay,
+ hide: config.delay
+ };
+ }
+
+ if (typeof config.title === 'number') {
+ config.title = config.title.toString();
+ }
+
+ if (typeof config.content === 'number') {
+ config.content = config.content.toString();
+ }
+
+ Util.typeCheckConfig(NAME, config, this.constructor.DefaultType);
+ return config;
+ };
+
+ _proto._getDelegateConfig = function _getDelegateConfig() {
+ var config = {};
+
+ if (this.config) {
+ for (var key in this.config) {
+ if (this.constructor.Default[key] !== this.config[key]) {
+ config[key] = this.config[key];
+ }
+ }
+ }
+
+ return config;
+ };
+
+ _proto._cleanTipClass = function _cleanTipClass() {
+ var $tip = $$$1(this.getTipElement());
+ var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX);
+
+ if (tabClass !== null && tabClass.length > 0) {
+ $tip.removeClass(tabClass.join(''));
+ }
+ };
+
+ _proto._handlePopperPlacementChange = function _handlePopperPlacementChange(data) {
+ this._cleanTipClass();
+
+ this.addAttachmentClass(this._getAttachment(data.placement));
+ };
+
+ _proto._fixTransition = function _fixTransition() {
+ var tip = this.getTipElement();
+ var initConfigAnimation = this.config.animation;
+
+ if (tip.getAttribute('x-placement') !== null) {
+ return;
+ }
+
+ $$$1(tip).removeClass(ClassName.FADE);
+ this.config.animation = false;
+ this.hide();
+ this.show();
+ this.config.animation = initConfigAnimation;
+ }; // Static
+
+
+ Tooltip._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ var data = $$$1(this).data(DATA_KEY);
+
+ var _config = typeof config === 'object' && config;
+
+ if (!data && /dispose|hide/.test(config)) {
+ return;
+ }
+
+ if (!data) {
+ data = new Tooltip(this, _config);
+ $$$1(this).data(DATA_KEY, data);
+ }
+
+ if (typeof config === 'string') {
+ if (typeof data[config] === 'undefined') {
+ throw new TypeError("No method named \"" + config + "\"");
+ }
+
+ data[config]();
+ }
+ });
+ };
+
+ _createClass(Tooltip, null, [{
+ key: "VERSION",
+ get: function get() {
+ return VERSION;
+ }
+ }, {
+ key: "Default",
+ get: function get() {
+ return Default;
+ }
+ }, {
+ key: "NAME",
+ get: function get() {
+ return NAME;
+ }
+ }, {
+ key: "DATA_KEY",
+ get: function get() {
+ return DATA_KEY;
+ }
+ }, {
+ key: "Event",
+ get: function get() {
+ return Event;
+ }
+ }, {
+ key: "EVENT_KEY",
+ get: function get() {
+ return EVENT_KEY;
+ }
+ }, {
+ key: "DefaultType",
+ get: function get() {
+ return DefaultType;
+ }
+ }]);
+ return Tooltip;
+ }();
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+
+ $$$1.fn[NAME] = Tooltip._jQueryInterface;
+ $$$1.fn[NAME].Constructor = Tooltip;
+
+ $$$1.fn[NAME].noConflict = function () {
+ $$$1.fn[NAME] = JQUERY_NO_CONFLICT;
+ return Tooltip._jQueryInterface;
+ };
+
+ return Tooltip;
+}($, Popper);
+
+/**
+ * --------------------------------------------------------------------------
+ * Bootstrap (v4.0.0): popover.js
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * --------------------------------------------------------------------------
+ */
+
+var Popover = function ($$$1) {
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+ var NAME = 'popover';
+ var VERSION = '4.0.0';
+ var DATA_KEY = 'bs.popover';
+ var EVENT_KEY = "." + DATA_KEY;
+ var JQUERY_NO_CONFLICT = $$$1.fn[NAME];
+ var CLASS_PREFIX = 'bs-popover';
+ var BSCLS_PREFIX_REGEX = new RegExp("(^|\\s)" + CLASS_PREFIX + "\\S+", 'g');
+ var Default = _extends({}, Tooltip.Default, {
+ placement: 'right',
+ trigger: 'click',
+ content: '',
+ template: ''
+ });
+ var DefaultType = _extends({}, Tooltip.DefaultType, {
+ content: '(string|element|function)'
+ });
+ var ClassName = {
+ FADE: 'fade',
+ SHOW: 'show'
+ };
+ var Selector = {
+ TITLE: '.popover-header',
+ CONTENT: '.popover-body'
+ };
+ var Event = {
+ HIDE: "hide" + EVENT_KEY,
+ HIDDEN: "hidden" + EVENT_KEY,
+ SHOW: "show" + EVENT_KEY,
+ SHOWN: "shown" + EVENT_KEY,
+ INSERTED: "inserted" + EVENT_KEY,
+ CLICK: "click" + EVENT_KEY,
+ FOCUSIN: "focusin" + EVENT_KEY,
+ FOCUSOUT: "focusout" + EVENT_KEY,
+ MOUSEENTER: "mouseenter" + EVENT_KEY,
+ MOUSELEAVE: "mouseleave" + EVENT_KEY
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ };
+
+ var Popover =
+ /*#__PURE__*/
+ function (_Tooltip) {
+ _inheritsLoose(Popover, _Tooltip);
+
+ function Popover() {
+ return _Tooltip.apply(this, arguments) || this;
+ }
+
+ var _proto = Popover.prototype;
+
+ // Overrides
+ _proto.isWithContent = function isWithContent() {
+ return this.getTitle() || this._getContent();
+ };
+
+ _proto.addAttachmentClass = function addAttachmentClass(attachment) {
+ $$$1(this.getTipElement()).addClass(CLASS_PREFIX + "-" + attachment);
+ };
+
+ _proto.getTipElement = function getTipElement() {
+ this.tip = this.tip || $$$1(this.config.template)[0];
+ return this.tip;
+ };
+
+ _proto.setContent = function setContent() {
+ var $tip = $$$1(this.getTipElement()); // We use append for html objects to maintain js events
+
+ this.setElementContent($tip.find(Selector.TITLE), this.getTitle());
+
+ var content = this._getContent();
+
+ if (typeof content === 'function') {
+ content = content.call(this.element);
+ }
+
+ this.setElementContent($tip.find(Selector.CONTENT), content);
+ $tip.removeClass(ClassName.FADE + " " + ClassName.SHOW);
+ }; // Private
+
+
+ _proto._getContent = function _getContent() {
+ return this.element.getAttribute('data-content') || this.config.content;
+ };
+
+ _proto._cleanTipClass = function _cleanTipClass() {
+ var $tip = $$$1(this.getTipElement());
+ var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX);
+
+ if (tabClass !== null && tabClass.length > 0) {
+ $tip.removeClass(tabClass.join(''));
+ }
+ }; // Static
+
+
+ Popover._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ var data = $$$1(this).data(DATA_KEY);
+
+ var _config = typeof config === 'object' ? config : null;
+
+ if (!data && /destroy|hide/.test(config)) {
+ return;
+ }
+
+ if (!data) {
+ data = new Popover(this, _config);
+ $$$1(this).data(DATA_KEY, data);
+ }
+
+ if (typeof config === 'string') {
+ if (typeof data[config] === 'undefined') {
+ throw new TypeError("No method named \"" + config + "\"");
+ }
+
+ data[config]();
+ }
+ });
+ };
+
+ _createClass(Popover, null, [{
+ key: "VERSION",
+ // Getters
+ get: function get() {
+ return VERSION;
+ }
+ }, {
+ key: "Default",
+ get: function get() {
+ return Default;
+ }
+ }, {
+ key: "NAME",
+ get: function get() {
+ return NAME;
+ }
+ }, {
+ key: "DATA_KEY",
+ get: function get() {
+ return DATA_KEY;
+ }
+ }, {
+ key: "Event",
+ get: function get() {
+ return Event;
+ }
+ }, {
+ key: "EVENT_KEY",
+ get: function get() {
+ return EVENT_KEY;
+ }
+ }, {
+ key: "DefaultType",
+ get: function get() {
+ return DefaultType;
+ }
+ }]);
+ return Popover;
+ }(Tooltip);
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+
+ $$$1.fn[NAME] = Popover._jQueryInterface;
+ $$$1.fn[NAME].Constructor = Popover;
+
+ $$$1.fn[NAME].noConflict = function () {
+ $$$1.fn[NAME] = JQUERY_NO_CONFLICT;
+ return Popover._jQueryInterface;
+ };
+
+ return Popover;
+}($);
+
+/**
+ * --------------------------------------------------------------------------
+ * Bootstrap (v4.0.0): scrollspy.js
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * --------------------------------------------------------------------------
+ */
+
+var ScrollSpy = function ($$$1) {
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+ var NAME = 'scrollspy';
+ var VERSION = '4.0.0';
+ var DATA_KEY = 'bs.scrollspy';
+ var EVENT_KEY = "." + DATA_KEY;
+ var DATA_API_KEY = '.data-api';
+ var JQUERY_NO_CONFLICT = $$$1.fn[NAME];
+ var Default = {
+ offset: 10,
+ method: 'auto',
+ target: ''
+ };
+ var DefaultType = {
+ offset: 'number',
+ method: 'string',
+ target: '(string|element)'
+ };
+ var Event = {
+ ACTIVATE: "activate" + EVENT_KEY,
+ SCROLL: "scroll" + EVENT_KEY,
+ LOAD_DATA_API: "load" + EVENT_KEY + DATA_API_KEY
+ };
+ var ClassName = {
+ DROPDOWN_ITEM: 'dropdown-item',
+ DROPDOWN_MENU: 'dropdown-menu',
+ ACTIVE: 'active'
+ };
+ var Selector = {
+ DATA_SPY: '[data-spy="scroll"]',
+ ACTIVE: '.active',
+ NAV_LIST_GROUP: '.nav, .list-group',
+ NAV_LINKS: '.nav-link',
+ NAV_ITEMS: '.nav-item',
+ LIST_ITEMS: '.list-group-item',
+ DROPDOWN: '.dropdown',
+ DROPDOWN_ITEMS: '.dropdown-item',
+ DROPDOWN_TOGGLE: '.dropdown-toggle'
+ };
+ var OffsetMethod = {
+ OFFSET: 'offset',
+ POSITION: 'position'
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ };
+
+ var ScrollSpy =
+ /*#__PURE__*/
+ function () {
+ function ScrollSpy(element, config) {
+ var _this = this;
+
+ this._element = element;
+ this._scrollElement = element.tagName === 'BODY' ? window : element;
+ this._config = this._getConfig(config);
+ this._selector = this._config.target + " " + Selector.NAV_LINKS + "," + (this._config.target + " " + Selector.LIST_ITEMS + ",") + (this._config.target + " " + Selector.DROPDOWN_ITEMS);
+ this._offsets = [];
+ this._targets = [];
+ this._activeTarget = null;
+ this._scrollHeight = 0;
+ $$$1(this._scrollElement).on(Event.SCROLL, function (event) {
+ return _this._process(event);
+ });
+ this.refresh();
+
+ this._process();
+ } // Getters
+
+
+ var _proto = ScrollSpy.prototype;
+
+ // Public
+ _proto.refresh = function refresh() {
+ var _this2 = this;
+
+ var autoMethod = this._scrollElement === this._scrollElement.window ? OffsetMethod.OFFSET : OffsetMethod.POSITION;
+ var offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method;
+ var offsetBase = offsetMethod === OffsetMethod.POSITION ? this._getScrollTop() : 0;
+ this._offsets = [];
+ this._targets = [];
+ this._scrollHeight = this._getScrollHeight();
+ var targets = $$$1.makeArray($$$1(this._selector));
+ targets.map(function (element) {
+ var target;
+ var targetSelector = Util.getSelectorFromElement(element);
+
+ if (targetSelector) {
+ target = $$$1(targetSelector)[0];
+ }
+
+ if (target) {
+ var targetBCR = target.getBoundingClientRect();
+
+ if (targetBCR.width || targetBCR.height) {
+ // TODO (fat): remove sketch reliance on jQuery position/offset
+ return [$$$1(target)[offsetMethod]().top + offsetBase, targetSelector];
+ }
+ }
+
+ return null;
+ }).filter(function (item) {
+ return item;
+ }).sort(function (a, b) {
+ return a[0] - b[0];
+ }).forEach(function (item) {
+ _this2._offsets.push(item[0]);
+
+ _this2._targets.push(item[1]);
+ });
+ };
+
+ _proto.dispose = function dispose() {
+ $$$1.removeData(this._element, DATA_KEY);
+ $$$1(this._scrollElement).off(EVENT_KEY);
+ this._element = null;
+ this._scrollElement = null;
+ this._config = null;
+ this._selector = null;
+ this._offsets = null;
+ this._targets = null;
+ this._activeTarget = null;
+ this._scrollHeight = null;
+ }; // Private
+
+
+ _proto._getConfig = function _getConfig(config) {
+ config = _extends({}, Default, config);
+
+ if (typeof config.target !== 'string') {
+ var id = $$$1(config.target).attr('id');
+
+ if (!id) {
+ id = Util.getUID(NAME);
+ $$$1(config.target).attr('id', id);
+ }
+
+ config.target = "#" + id;
+ }
+
+ Util.typeCheckConfig(NAME, config, DefaultType);
+ return config;
+ };
+
+ _proto._getScrollTop = function _getScrollTop() {
+ return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop;
+ };
+
+ _proto._getScrollHeight = function _getScrollHeight() {
+ return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);
+ };
+
+ _proto._getOffsetHeight = function _getOffsetHeight() {
+ return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height;
+ };
+
+ _proto._process = function _process() {
+ var scrollTop = this._getScrollTop() + this._config.offset;
+
+ var scrollHeight = this._getScrollHeight();
+
+ var maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight();
+
+ if (this._scrollHeight !== scrollHeight) {
+ this.refresh();
+ }
+
+ if (scrollTop >= maxScroll) {
+ var target = this._targets[this._targets.length - 1];
+
+ if (this._activeTarget !== target) {
+ this._activate(target);
+ }
+
+ return;
+ }
+
+ if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {
+ this._activeTarget = null;
+
+ this._clear();
+
+ return;
+ }
+
+ for (var i = this._offsets.length; i--;) {
+ var isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]);
+
+ if (isActiveTarget) {
+ this._activate(this._targets[i]);
+ }
+ }
+ };
+
+ _proto._activate = function _activate(target) {
+ this._activeTarget = target;
+
+ this._clear();
+
+ var queries = this._selector.split(','); // eslint-disable-next-line arrow-body-style
+
+
+ queries = queries.map(function (selector) {
+ return selector + "[data-target=\"" + target + "\"]," + (selector + "[href=\"" + target + "\"]");
+ });
+ var $link = $$$1(queries.join(','));
+
+ if ($link.hasClass(ClassName.DROPDOWN_ITEM)) {
+ $link.closest(Selector.DROPDOWN).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE);
+ $link.addClass(ClassName.ACTIVE);
+ } else {
+ // Set triggered link as active
+ $link.addClass(ClassName.ACTIVE); // Set triggered links parents as active
+ // With both and