diff --git a/.browserslistrc b/.browserslistrc
new file mode 100644
index 0000000..dc3bc09
--- /dev/null
+++ b/.browserslistrc
@@ -0,0 +1,4 @@
+> 1%
+last 2 versions
+not dead
+not ie 11
diff --git a/.env b/.env
new file mode 100644
index 0000000..e69de29
diff --git a/.env.development b/.env.development
new file mode 100644
index 0000000..cef66e1
--- /dev/null
+++ b/.env.development
@@ -0,0 +1,2 @@
+VUE_APP_API_BASE_URL='http://beta.admin.nnbc123.cn'
+VUE_APP_DEBUG_MODE=true
\ No newline at end of file
diff --git a/.env.production b/.env.production
new file mode 100644
index 0000000..fc2595d
--- /dev/null
+++ b/.env.production
@@ -0,0 +1,2 @@
+VUE_APP_API_BASE_URL='http://admin.nnbc123.cn'
+VUE_APP_DEBUG_MODE=false
\ No newline at end of file
diff --git a/.eslintrc.js b/.eslintrc.js
new file mode 100644
index 0000000..b06c640
--- /dev/null
+++ b/.eslintrc.js
@@ -0,0 +1,21 @@
+module.exports = {
+ root: true,
+ env: {
+ node: true,
+ jquery: true
+ },
+ 'extends': [
+ 'plugin:vue/vue3-essential',
+ 'eslint:recommended'
+ ],
+ parserOptions: {
+ parser: '@babel/eslint-parser'
+ },
+ rules: {
+ 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
+ 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
+ 'no-unused-vars': 'off',
+ 'no-useless-escape': 'off',
+ 'no-control-regex': 'off',
+ }
+}
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..403adbc
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,23 @@
+.DS_Store
+node_modules
+/dist
+
+
+# local env files
+.env.local
+.env.*.local
+
+# Log files
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/README.md b/README.md
index 65c3446..918eefa 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,24 @@
# yinmeng-admin-web
+
+## Project setup
+```
+npm install
+```
+
+### Compiles and hot-reloads for development
+```
+npm run serve
+```
+
+### Compiles and minifies for production
+```
+npm run build
+```
+
+### Lints and fixes files
+```
+npm run lint
+```
+
+### Customize configuration
+See [Configuration Reference](https://cli.vuejs.org/config/).
diff --git a/babel.config.js b/babel.config.js
new file mode 100644
index 0000000..e955840
--- /dev/null
+++ b/babel.config.js
@@ -0,0 +1,5 @@
+module.exports = {
+ presets: [
+ '@vue/cli-plugin-babel/preset'
+ ]
+}
diff --git a/jsconfig.json b/jsconfig.json
new file mode 100644
index 0000000..4aafc5f
--- /dev/null
+++ b/jsconfig.json
@@ -0,0 +1,19 @@
+{
+ "compilerOptions": {
+ "target": "es5",
+ "module": "esnext",
+ "baseUrl": "./",
+ "moduleResolution": "node",
+ "paths": {
+ "@/*": [
+ "src/*"
+ ]
+ },
+ "lib": [
+ "esnext",
+ "dom",
+ "dom.iterable",
+ "scripthost"
+ ]
+ }
+}
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..efda226
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,11366 @@
+{
+ "name": "yinmeng-admin-web",
+ "version": "0.1.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "yinmeng-admin-web",
+ "version": "0.1.0",
+ "dependencies": {
+ "admin-lte": "^2.3.2",
+ "axios": "^1.5.1",
+ "bootstrap": "^3.3.5",
+ "core-js": "^3.8.3",
+ "font-awesome": "^4.6.3",
+ "ionicons": "^2.0.1",
+ "jquery": "^2.2.0",
+ "jquery.md5": "^1.0.0",
+ "knockout": "^3.5.1",
+ "less": "^4.2.0",
+ "less-loader": "^11.1.3",
+ "popper.js": "^1.16.1",
+ "vue": "^3.2.13",
+ "vue-router": "^4.0.3",
+ "vuex": "^4.0.0"
+ },
+ "devDependencies": {
+ "@babel/core": "^7.12.16",
+ "@babel/eslint-parser": "^7.12.16",
+ "@vue/cli-plugin-babel": "~5.0.0",
+ "@vue/cli-plugin-eslint": "~5.0.0",
+ "@vue/cli-plugin-router": "~5.0.0",
+ "@vue/cli-plugin-vuex": "~5.0.0",
+ "@vue/cli-service": "~5.0.0",
+ "eslint": "^7.32.0",
+ "eslint-plugin-vue": "^8.0.3",
+ "sass": "^1.32.7",
+ "sass-loader": "^12.0.0",
+ "webpack-bundle-analyzer": "^4.9.1"
+ }
+ },
+ "node_modules/@aashutoshrathi/word-wrap": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmmirror.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
+ "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@achrinza/node-ipc": {
+ "version": "9.2.7",
+ "resolved": "https://registry.npmmirror.com/@achrinza/node-ipc/-/node-ipc-9.2.7.tgz",
+ "integrity": "sha512-/EvNkqB4HNxPWCZASmgrjqG8gIdPOolD67LGASvGMp/FY5ne0rbvpYg5o9x8RmgjAl8KdmNQ4YlV1et9DYiW8g==",
+ "dev": true,
+ "dependencies": {
+ "@node-ipc/js-queue": "2.0.3",
+ "event-pubsub": "4.3.0",
+ "js-message": "1.0.7"
+ },
+ "engines": {
+ "node": "8 || 9 || 10 || 11 || 12 || 13 || 14 || 15 || 16 || 17 || 18 || 19 || 20"
+ }
+ },
+ "node_modules/@ampproject/remapping": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.2.1.tgz",
+ "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.0",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.22.13",
+ "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.22.13.tgz",
+ "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/highlight": "^7.22.13",
+ "chalk": "^2.4.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.22.20",
+ "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.22.20.tgz",
+ "integrity": "sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.23.0",
+ "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.23.0.tgz",
+ "integrity": "sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ==",
+ "dev": true,
+ "dependencies": {
+ "@ampproject/remapping": "^2.2.0",
+ "@babel/code-frame": "^7.22.13",
+ "@babel/generator": "^7.23.0",
+ "@babel/helper-compilation-targets": "^7.22.15",
+ "@babel/helper-module-transforms": "^7.23.0",
+ "@babel/helpers": "^7.23.0",
+ "@babel/parser": "^7.23.0",
+ "@babel/template": "^7.22.15",
+ "@babel/traverse": "^7.23.0",
+ "@babel/types": "^7.23.0",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/eslint-parser": {
+ "version": "7.22.15",
+ "resolved": "https://registry.npmmirror.com/@babel/eslint-parser/-/eslint-parser-7.22.15.tgz",
+ "integrity": "sha512-yc8OOBIQk1EcRrpizuARSQS0TWAcOMpEJ1aafhNznaeYkeL+OhqnDObGFylB8ka8VFF/sZc+S4RzHyO+3LjQxg==",
+ "dev": true,
+ "dependencies": {
+ "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1",
+ "eslint-visitor-keys": "^2.1.0",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || >=14.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.11.0",
+ "eslint": "^7.5.0 || ^8.0.0"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.23.0",
+ "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.23.0.tgz",
+ "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.23.0",
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "@jridgewell/trace-mapping": "^0.3.17",
+ "jsesc": "^2.5.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-annotate-as-pure": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz",
+ "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": {
+ "version": "7.22.15",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz",
+ "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.22.15"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.22.15",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz",
+ "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.22.9",
+ "@babel/helper-validator-option": "^7.22.15",
+ "browserslist": "^4.21.9",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-create-class-features-plugin": {
+ "version": "7.22.15",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz",
+ "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.22.5",
+ "@babel/helper-environment-visitor": "^7.22.5",
+ "@babel/helper-function-name": "^7.22.5",
+ "@babel/helper-member-expression-to-functions": "^7.22.15",
+ "@babel/helper-optimise-call-expression": "^7.22.5",
+ "@babel/helper-replace-supers": "^7.22.9",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5",
+ "@babel/helper-split-export-declaration": "^7.22.6",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-create-regexp-features-plugin": {
+ "version": "7.22.15",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz",
+ "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.22.5",
+ "regexpu-core": "^5.3.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-define-polyfill-provider": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz",
+ "integrity": "sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.22.6",
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "debug": "^4.1.1",
+ "lodash.debounce": "^4.0.8",
+ "resolve": "^1.14.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/@babel/helper-environment-visitor": {
+ "version": "7.22.20",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz",
+ "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-function-name": {
+ "version": "7.23.0",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz",
+ "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/template": "^7.22.15",
+ "@babel/types": "^7.23.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-hoist-variables": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz",
+ "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-member-expression-to-functions": {
+ "version": "7.23.0",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz",
+ "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.23.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.22.15",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz",
+ "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.22.15"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.23.0",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz",
+ "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-environment-visitor": "^7.22.20",
+ "@babel/helper-module-imports": "^7.22.15",
+ "@babel/helper-simple-access": "^7.22.5",
+ "@babel/helper-split-export-declaration": "^7.22.6",
+ "@babel/helper-validator-identifier": "^7.22.20"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-optimise-call-expression": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz",
+ "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz",
+ "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-remap-async-to-generator": {
+ "version": "7.22.20",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz",
+ "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.22.5",
+ "@babel/helper-environment-visitor": "^7.22.20",
+ "@babel/helper-wrap-function": "^7.22.20"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-replace-supers": {
+ "version": "7.22.20",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz",
+ "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-environment-visitor": "^7.22.20",
+ "@babel/helper-member-expression-to-functions": "^7.22.15",
+ "@babel/helper-optimise-call-expression": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-simple-access": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz",
+ "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz",
+ "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-split-export-declaration": {
+ "version": "7.22.6",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz",
+ "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz",
+ "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.22.20",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
+ "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.22.15",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz",
+ "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-wrap-function": {
+ "version": "7.22.20",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz",
+ "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-function-name": "^7.22.5",
+ "@babel/template": "^7.22.15",
+ "@babel/types": "^7.22.19"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.23.1",
+ "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.23.1.tgz",
+ "integrity": "sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/template": "^7.22.15",
+ "@babel/traverse": "^7.23.0",
+ "@babel/types": "^7.23.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/highlight": {
+ "version": "7.22.20",
+ "resolved": "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.22.20.tgz",
+ "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.22.20",
+ "chalk": "^2.4.2",
+ "js-tokens": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.23.0",
+ "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.23.0.tgz",
+ "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==",
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
+ "version": "7.22.15",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz",
+ "integrity": "sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
+ "version": "7.22.15",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz",
+ "integrity": "sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5",
+ "@babel/plugin-transform-optional-chaining": "^7.22.15"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.13.0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-class-properties": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz",
+ "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==",
+ "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-decorators": {
+ "version": "7.23.0",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.0.tgz",
+ "integrity": "sha512-kYsT+f5ARWF6AdFmqoEEp+hpqxEB8vGmRWfw2aj78M2vTwS2uHW91EF58iFm1Z9U8Y/RrLu2XKJn46P9ca1b0w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.22.15",
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/helper-replace-supers": "^7.22.20",
+ "@babel/helper-split-export-declaration": "^7.22.6",
+ "@babel/plugin-syntax-decorators": "^7.22.10"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-private-property-in-object": {
+ "version": "7.21.0-placeholder-for-preset-env.2",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz",
+ "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-async-generators": {
+ "version": "7.8.4",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
+ "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-class-properties": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
+ "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.12.13"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-class-static-block": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
+ "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-decorators": {
+ "version": "7.22.10",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.10.tgz",
+ "integrity": "sha512-z1KTVemBjnz+kSEilAsI4lbkPOl5TvJH7YDSY1CTIzvLWJ+KHXp+mRe8VPmfnyvqOPqar1V2gid2PleKzRUstQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-dynamic-import": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
+ "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-export-namespace-from": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
+ "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.3"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-assertions": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz",
+ "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-attributes": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz",
+ "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-meta": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
+ "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-json-strings": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
+ "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-jsx": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz",
+ "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-logical-assignment-operators": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
+ "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
+ "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-numeric-separator": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
+ "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-object-rest-spread": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
+ "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-optional-catch-binding": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
+ "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-optional-chaining": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
+ "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-private-property-in-object": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
+ "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-top-level-await": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
+ "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-unicode-sets-regex": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz",
+ "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-arrow-functions": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz",
+ "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-async-generator-functions": {
+ "version": "7.22.15",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.15.tgz",
+ "integrity": "sha512-jBm1Es25Y+tVoTi5rfd5t1KLmL8ogLKpXszboWOTTtGFGz2RKnQe2yn7HbZ+kb/B8N0FVSGQo874NSlOU1T4+w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-environment-visitor": "^7.22.5",
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/helper-remap-async-to-generator": "^7.22.9",
+ "@babel/plugin-syntax-async-generators": "^7.8.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-async-to-generator": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz",
+ "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.22.5",
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/helper-remap-async-to-generator": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoped-functions": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz",
+ "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoping": {
+ "version": "7.23.0",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz",
+ "integrity": "sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-class-properties": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz",
+ "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.22.5",
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-class-static-block": {
+ "version": "7.22.11",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz",
+ "integrity": "sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.22.11",
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/plugin-syntax-class-static-block": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.12.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-classes": {
+ "version": "7.22.15",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz",
+ "integrity": "sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.22.5",
+ "@babel/helper-compilation-targets": "^7.22.15",
+ "@babel/helper-environment-visitor": "^7.22.5",
+ "@babel/helper-function-name": "^7.22.5",
+ "@babel/helper-optimise-call-expression": "^7.22.5",
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/helper-replace-supers": "^7.22.9",
+ "@babel/helper-split-export-declaration": "^7.22.6",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-computed-properties": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz",
+ "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/template": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-destructuring": {
+ "version": "7.23.0",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz",
+ "integrity": "sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-dotall-regex": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz",
+ "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.22.5",
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-duplicate-keys": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz",
+ "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-dynamic-import": {
+ "version": "7.22.11",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz",
+ "integrity": "sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/plugin-syntax-dynamic-import": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-exponentiation-operator": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz",
+ "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5",
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-export-namespace-from": {
+ "version": "7.22.11",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz",
+ "integrity": "sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-for-of": {
+ "version": "7.22.15",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz",
+ "integrity": "sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-function-name": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz",
+ "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.22.5",
+ "@babel/helper-function-name": "^7.22.5",
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-json-strings": {
+ "version": "7.22.11",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz",
+ "integrity": "sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/plugin-syntax-json-strings": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-literals": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz",
+ "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-logical-assignment-operators": {
+ "version": "7.22.11",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz",
+ "integrity": "sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-member-expression-literals": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz",
+ "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-amd": {
+ "version": "7.23.0",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz",
+ "integrity": "sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.23.0",
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-commonjs": {
+ "version": "7.23.0",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz",
+ "integrity": "sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.23.0",
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/helper-simple-access": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-systemjs": {
+ "version": "7.23.0",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz",
+ "integrity": "sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-hoist-variables": "^7.22.5",
+ "@babel/helper-module-transforms": "^7.23.0",
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/helper-validator-identifier": "^7.22.20"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-umd": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz",
+ "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.22.5",
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz",
+ "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.22.5",
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-new-target": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz",
+ "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
+ "version": "7.22.11",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz",
+ "integrity": "sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-numeric-separator": {
+ "version": "7.22.11",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz",
+ "integrity": "sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-object-rest-spread": {
+ "version": "7.22.15",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz",
+ "integrity": "sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.22.9",
+ "@babel/helper-compilation-targets": "^7.22.15",
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+ "@babel/plugin-transform-parameters": "^7.22.15"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-object-super": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz",
+ "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/helper-replace-supers": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-optional-catch-binding": {
+ "version": "7.22.11",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz",
+ "integrity": "sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-optional-chaining": {
+ "version": "7.23.0",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz",
+ "integrity": "sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-parameters": {
+ "version": "7.22.15",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz",
+ "integrity": "sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-private-methods": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz",
+ "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.22.5",
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-private-property-in-object": {
+ "version": "7.22.11",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz",
+ "integrity": "sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.22.5",
+ "@babel/helper-create-class-features-plugin": "^7.22.11",
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-property-literals": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz",
+ "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-regenerator": {
+ "version": "7.22.10",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz",
+ "integrity": "sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "regenerator-transform": "^0.15.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-reserved-words": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz",
+ "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-runtime": {
+ "version": "7.22.15",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.15.tgz",
+ "integrity": "sha512-tEVLhk8NRZSmwQ0DJtxxhTrCht1HVo8VaMzYT4w6lwyKBuHsgoioAUA7/6eT2fRfc5/23fuGdlwIxXhRVgWr4g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.22.15",
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "babel-plugin-polyfill-corejs2": "^0.4.5",
+ "babel-plugin-polyfill-corejs3": "^0.8.3",
+ "babel-plugin-polyfill-regenerator": "^0.5.2",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-shorthand-properties": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz",
+ "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-spread": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz",
+ "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-sticky-regex": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz",
+ "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-template-literals": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz",
+ "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-typeof-symbol": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz",
+ "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-escapes": {
+ "version": "7.22.10",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz",
+ "integrity": "sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-property-regex": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz",
+ "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.22.5",
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-regex": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz",
+ "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.22.5",
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-sets-regex": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz",
+ "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.22.5",
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/preset-env": {
+ "version": "7.22.20",
+ "resolved": "https://registry.npmmirror.com/@babel/preset-env/-/preset-env-7.22.20.tgz",
+ "integrity": "sha512-11MY04gGC4kSzlPHRfvVkNAZhUxOvm7DCJ37hPDnUENwe06npjIRAfInEMTGSb4LZK5ZgDFkv5hw0lGebHeTyg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.22.20",
+ "@babel/helper-compilation-targets": "^7.22.15",
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/helper-validator-option": "^7.22.15",
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.15",
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.15",
+ "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",
+ "@babel/plugin-syntax-async-generators": "^7.8.4",
+ "@babel/plugin-syntax-class-properties": "^7.12.13",
+ "@babel/plugin-syntax-class-static-block": "^7.14.5",
+ "@babel/plugin-syntax-dynamic-import": "^7.8.3",
+ "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
+ "@babel/plugin-syntax-import-assertions": "^7.22.5",
+ "@babel/plugin-syntax-import-attributes": "^7.22.5",
+ "@babel/plugin-syntax-import-meta": "^7.10.4",
+ "@babel/plugin-syntax-json-strings": "^7.8.3",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3",
+ "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
+ "@babel/plugin-syntax-top-level-await": "^7.14.5",
+ "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6",
+ "@babel/plugin-transform-arrow-functions": "^7.22.5",
+ "@babel/plugin-transform-async-generator-functions": "^7.22.15",
+ "@babel/plugin-transform-async-to-generator": "^7.22.5",
+ "@babel/plugin-transform-block-scoped-functions": "^7.22.5",
+ "@babel/plugin-transform-block-scoping": "^7.22.15",
+ "@babel/plugin-transform-class-properties": "^7.22.5",
+ "@babel/plugin-transform-class-static-block": "^7.22.11",
+ "@babel/plugin-transform-classes": "^7.22.15",
+ "@babel/plugin-transform-computed-properties": "^7.22.5",
+ "@babel/plugin-transform-destructuring": "^7.22.15",
+ "@babel/plugin-transform-dotall-regex": "^7.22.5",
+ "@babel/plugin-transform-duplicate-keys": "^7.22.5",
+ "@babel/plugin-transform-dynamic-import": "^7.22.11",
+ "@babel/plugin-transform-exponentiation-operator": "^7.22.5",
+ "@babel/plugin-transform-export-namespace-from": "^7.22.11",
+ "@babel/plugin-transform-for-of": "^7.22.15",
+ "@babel/plugin-transform-function-name": "^7.22.5",
+ "@babel/plugin-transform-json-strings": "^7.22.11",
+ "@babel/plugin-transform-literals": "^7.22.5",
+ "@babel/plugin-transform-logical-assignment-operators": "^7.22.11",
+ "@babel/plugin-transform-member-expression-literals": "^7.22.5",
+ "@babel/plugin-transform-modules-amd": "^7.22.5",
+ "@babel/plugin-transform-modules-commonjs": "^7.22.15",
+ "@babel/plugin-transform-modules-systemjs": "^7.22.11",
+ "@babel/plugin-transform-modules-umd": "^7.22.5",
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5",
+ "@babel/plugin-transform-new-target": "^7.22.5",
+ "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11",
+ "@babel/plugin-transform-numeric-separator": "^7.22.11",
+ "@babel/plugin-transform-object-rest-spread": "^7.22.15",
+ "@babel/plugin-transform-object-super": "^7.22.5",
+ "@babel/plugin-transform-optional-catch-binding": "^7.22.11",
+ "@babel/plugin-transform-optional-chaining": "^7.22.15",
+ "@babel/plugin-transform-parameters": "^7.22.15",
+ "@babel/plugin-transform-private-methods": "^7.22.5",
+ "@babel/plugin-transform-private-property-in-object": "^7.22.11",
+ "@babel/plugin-transform-property-literals": "^7.22.5",
+ "@babel/plugin-transform-regenerator": "^7.22.10",
+ "@babel/plugin-transform-reserved-words": "^7.22.5",
+ "@babel/plugin-transform-shorthand-properties": "^7.22.5",
+ "@babel/plugin-transform-spread": "^7.22.5",
+ "@babel/plugin-transform-sticky-regex": "^7.22.5",
+ "@babel/plugin-transform-template-literals": "^7.22.5",
+ "@babel/plugin-transform-typeof-symbol": "^7.22.5",
+ "@babel/plugin-transform-unicode-escapes": "^7.22.10",
+ "@babel/plugin-transform-unicode-property-regex": "^7.22.5",
+ "@babel/plugin-transform-unicode-regex": "^7.22.5",
+ "@babel/plugin-transform-unicode-sets-regex": "^7.22.5",
+ "@babel/preset-modules": "0.1.6-no-external-plugins",
+ "@babel/types": "^7.22.19",
+ "babel-plugin-polyfill-corejs2": "^0.4.5",
+ "babel-plugin-polyfill-corejs3": "^0.8.3",
+ "babel-plugin-polyfill-regenerator": "^0.5.2",
+ "core-js-compat": "^3.31.0",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/preset-modules": {
+ "version": "0.1.6-no-external-plugins",
+ "resolved": "https://registry.npmmirror.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz",
+ "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/types": "^7.4.4",
+ "esutils": "^2.0.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/@babel/regjsgen": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmmirror.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz",
+ "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==",
+ "dev": true
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.23.1",
+ "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.23.1.tgz",
+ "integrity": "sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g==",
+ "dev": true,
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.22.15",
+ "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.22.15.tgz",
+ "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.22.13",
+ "@babel/parser": "^7.22.15",
+ "@babel/types": "^7.22.15"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.23.0",
+ "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.23.0.tgz",
+ "integrity": "sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.22.13",
+ "@babel/generator": "^7.23.0",
+ "@babel/helper-environment-visitor": "^7.22.20",
+ "@babel/helper-function-name": "^7.23.0",
+ "@babel/helper-hoist-variables": "^7.22.5",
+ "@babel/helper-split-export-declaration": "^7.22.6",
+ "@babel/parser": "^7.23.0",
+ "@babel/types": "^7.23.0",
+ "debug": "^4.1.0",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.23.0",
+ "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.23.0.tgz",
+ "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.22.5",
+ "@babel/helper-validator-identifier": "^7.22.20",
+ "to-fast-properties": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@discoveryjs/json-ext": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmmirror.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz",
+ "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz",
+ "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.1.1",
+ "espree": "^7.3.0",
+ "globals": "^13.9.0",
+ "ignore": "^4.0.6",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^3.13.1",
+ "minimatch": "^3.0.4",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/globals": {
+ "version": "13.22.0",
+ "resolved": "https://registry.npmmirror.com/globals/-/globals-13.22.0.tgz",
+ "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/ignore": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmmirror.com/ignore/-/ignore-4.0.6.tgz",
+ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@hapi/hoek": {
+ "version": "9.3.0",
+ "resolved": "https://registry.npmmirror.com/@hapi/hoek/-/hoek-9.3.0.tgz",
+ "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==",
+ "dev": true
+ },
+ "node_modules/@hapi/topo": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmmirror.com/@hapi/topo/-/topo-5.1.0.tgz",
+ "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==",
+ "dev": true,
+ "dependencies": {
+ "@hapi/hoek": "^9.0.0"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz",
+ "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==",
+ "dev": true,
+ "dependencies": {
+ "@humanwhocodes/object-schema": "^1.2.0",
+ "debug": "^4.1.1",
+ "minimatch": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=10.10.0"
+ }
+ },
+ "node_modules/@humanwhocodes/object-schema": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
+ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
+ "dev": true
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
+ "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
+ "dependencies": {
+ "@jridgewell/set-array": "^1.0.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz",
+ "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.1.2.tgz",
+ "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/source-map": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.5.tgz",
+ "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.0",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.4.15",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
+ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.19",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz",
+ "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@leichtgewicht/ip-codec": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmmirror.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz",
+ "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==",
+ "dev": true
+ },
+ "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": {
+ "version": "5.1.1-v1",
+ "resolved": "https://registry.npmmirror.com/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz",
+ "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==",
+ "dev": true,
+ "dependencies": {
+ "eslint-scope": "5.1.1"
+ }
+ },
+ "node_modules/@node-ipc/js-queue": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmmirror.com/@node-ipc/js-queue/-/js-queue-2.0.3.tgz",
+ "integrity": "sha512-fL1wpr8hhD5gT2dA1qifeVaoDFlQR5es8tFuKqjHX+kdOtdNHnxkVZbtIrR2rxnMFvehkjaZRNV2H/gPXlb0hw==",
+ "dev": true,
+ "dependencies": {
+ "easy-stack": "1.0.1"
+ },
+ "engines": {
+ "node": ">=1.0.0"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@polka/url": {
+ "version": "1.0.0-next.23",
+ "resolved": "https://registry.npmmirror.com/@polka/url/-/url-1.0.0-next.23.tgz",
+ "integrity": "sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg==",
+ "dev": true
+ },
+ "node_modules/@sideway/address": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmmirror.com/@sideway/address/-/address-4.1.4.tgz",
+ "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==",
+ "dev": true,
+ "dependencies": {
+ "@hapi/hoek": "^9.0.0"
+ }
+ },
+ "node_modules/@sideway/formula": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/@sideway/formula/-/formula-3.0.1.tgz",
+ "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==",
+ "dev": true
+ },
+ "node_modules/@sideway/pinpoint": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz",
+ "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==",
+ "dev": true
+ },
+ "node_modules/@soda/friendly-errors-webpack-plugin": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmmirror.com/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.8.1.tgz",
+ "integrity": "sha512-h2ooWqP8XuFqTXT+NyAFbrArzfQA7R6HTezADrvD9Re8fxMLTPPniLdqVTdDaO0eIoLaAwKT+d6w+5GeTk7Vbg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^3.0.0",
+ "error-stack-parser": "^2.0.6",
+ "string-width": "^4.2.3",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ },
+ "peerDependencies": {
+ "webpack": "^4.0.0 || ^5.0.0"
+ }
+ },
+ "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@soda/get-current-script": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/@soda/get-current-script/-/get-current-script-1.0.2.tgz",
+ "integrity": "sha512-T7VNNlYVM1SgQ+VsMYhnDkcGmWhQdL0bDyGm5TlQ3GBXnJscEClUUOKduWTmm2zCnvNLC1hc3JpuXjs/nFOc5w==",
+ "dev": true
+ },
+ "node_modules/@trysound/sax": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmmirror.com/@trysound/sax/-/sax-0.2.0.tgz",
+ "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/@types/body-parser": {
+ "version": "1.19.3",
+ "resolved": "https://registry.npmmirror.com/@types/body-parser/-/body-parser-1.19.3.tgz",
+ "integrity": "sha512-oyl4jvAfTGX9Bt6Or4H9ni1Z447/tQuxnZsytsCaExKlmJiU8sFgnIBRzJUpKwB5eWn9HuBYlUlVA74q/yN0eQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/connect": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/bonjour": {
+ "version": "3.5.11",
+ "resolved": "https://registry.npmmirror.com/@types/bonjour/-/bonjour-3.5.11.tgz",
+ "integrity": "sha512-isGhjmBtLIxdHBDl2xGwUzEM8AOyOvWsADWq7rqirdi/ZQoHnLWErHvsThcEzTX8juDRiZtzp2Qkv5bgNh6mAg==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/connect": {
+ "version": "3.4.36",
+ "resolved": "https://registry.npmmirror.com/@types/connect/-/connect-3.4.36.tgz",
+ "integrity": "sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/connect-history-api-fallback": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmmirror.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.1.tgz",
+ "integrity": "sha512-iaQslNbARe8fctL5Lk+DsmgWOM83lM+7FzP0eQUJs1jd3kBE8NWqBTIT2S8SqQOJjxvt2eyIjpOuYeRXq2AdMw==",
+ "dev": true,
+ "dependencies": {
+ "@types/express-serve-static-core": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/eslint": {
+ "version": "8.44.3",
+ "resolved": "https://registry.npmmirror.com/@types/eslint/-/eslint-8.44.3.tgz",
+ "integrity": "sha512-iM/WfkwAhwmPff3wZuPLYiHX18HI24jU8k1ZSH7P8FHwxTjZ2P6CoX2wnF43oprR+YXJM6UUxATkNvyv/JHd+g==",
+ "dependencies": {
+ "@types/estree": "*",
+ "@types/json-schema": "*"
+ }
+ },
+ "node_modules/@types/eslint-scope": {
+ "version": "3.7.5",
+ "resolved": "https://registry.npmmirror.com/@types/eslint-scope/-/eslint-scope-3.7.5.tgz",
+ "integrity": "sha512-JNvhIEyxVW6EoMIFIvj93ZOywYFatlpu9deeH6eSx6PE3WHYvHaQtmHmQeNw7aA81bYGBPPQqdtBm6b1SsQMmA==",
+ "dependencies": {
+ "@types/eslint": "*",
+ "@types/estree": "*"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.2.tgz",
+ "integrity": "sha512-VeiPZ9MMwXjO32/Xu7+OwflfmeoRwkE/qzndw42gGtgJwZopBnzy2gD//NN1+go1mADzkDcqf/KnFRSjTJ8xJA=="
+ },
+ "node_modules/@types/express": {
+ "version": "4.17.18",
+ "resolved": "https://registry.npmmirror.com/@types/express/-/express-4.17.18.tgz",
+ "integrity": "sha512-Sxv8BSLLgsBYmcnGdGjjEjqET2U+AKAdCRODmMiq02FgjwuV75Ut85DRpvFjyw/Mk0vgUOliGRU0UUmuuZHByQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/body-parser": "*",
+ "@types/express-serve-static-core": "^4.17.33",
+ "@types/qs": "*",
+ "@types/serve-static": "*"
+ }
+ },
+ "node_modules/@types/express-serve-static-core": {
+ "version": "4.17.37",
+ "resolved": "https://registry.npmmirror.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.37.tgz",
+ "integrity": "sha512-ZohaCYTgGFcOP7u6aJOhY9uIZQgZ2vxC2yWoArY+FeDXlqeH66ZVBjgvg+RLVAS/DWNq4Ap9ZXu1+SUQiiWYMg==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*",
+ "@types/qs": "*",
+ "@types/range-parser": "*",
+ "@types/send": "*"
+ }
+ },
+ "node_modules/@types/html-minifier-terser": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmmirror.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz",
+ "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==",
+ "dev": true
+ },
+ "node_modules/@types/http-errors": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/@types/http-errors/-/http-errors-2.0.2.tgz",
+ "integrity": "sha512-lPG6KlZs88gef6aD85z3HNkztpj7w2R7HmR3gygjfXCQmsLloWNARFkMuzKiiY8FGdh1XDpgBdrSf4aKDiA7Kg==",
+ "dev": true
+ },
+ "node_modules/@types/http-proxy": {
+ "version": "1.17.12",
+ "resolved": "https://registry.npmmirror.com/@types/http-proxy/-/http-proxy-1.17.12.tgz",
+ "integrity": "sha512-kQtujO08dVtQ2wXAuSFfk9ASy3sug4+ogFR8Kd8UgP8PEuc1/G/8yjYRmp//PcDNJEUKOza/MrQu15bouEUCiw==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.13",
+ "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.13.tgz",
+ "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ=="
+ },
+ "node_modules/@types/mime": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmmirror.com/@types/mime/-/mime-1.3.3.tgz",
+ "integrity": "sha512-Ys+/St+2VF4+xuY6+kDIXGxbNRO0mesVg0bbxEfB97Od1Vjpjx9KD1qxs64Gcb3CWPirk9Xe+PT4YiiHQ9T+eg==",
+ "dev": true
+ },
+ "node_modules/@types/minimist": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmmirror.com/@types/minimist/-/minimist-1.2.3.tgz",
+ "integrity": "sha512-ZYFzrvyWUNhaPomn80dsMNgMeXxNWZBdkuG/hWlUvXvbdUH8ZERNBGXnU87McuGcWDsyzX2aChCv/SVN348k3A==",
+ "dev": true
+ },
+ "node_modules/@types/node": {
+ "version": "20.7.1",
+ "resolved": "https://registry.npmmirror.com/@types/node/-/node-20.7.1.tgz",
+ "integrity": "sha512-LT+OIXpp2kj4E2S/p91BMe+VgGX2+lfO+XTpfXhh+bCk2LkQtHZSub8ewFBMGP5ClysPjTDFa4sMI8Q3n4T0wg=="
+ },
+ "node_modules/@types/normalize-package-data": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmmirror.com/@types/normalize-package-data/-/normalize-package-data-2.4.2.tgz",
+ "integrity": "sha512-lqa4UEhhv/2sjjIQgjX8B+RBjj47eo0mzGasklVJ78UKGQY1r0VpB9XHDaZZO9qzEFDdy4MrXLuEaSmPrPSe/A==",
+ "dev": true
+ },
+ "node_modules/@types/parse-json": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/@types/parse-json/-/parse-json-4.0.0.tgz",
+ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==",
+ "dev": true
+ },
+ "node_modules/@types/qs": {
+ "version": "6.9.8",
+ "resolved": "https://registry.npmmirror.com/@types/qs/-/qs-6.9.8.tgz",
+ "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==",
+ "dev": true
+ },
+ "node_modules/@types/range-parser": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmmirror.com/@types/range-parser/-/range-parser-1.2.5.tgz",
+ "integrity": "sha512-xrO9OoVPqFuYyR/loIHjnbvvyRZREYKLjxV4+dY6v3FQR3stQ9ZxIGkaclF7YhI9hfjpuTbu14hZEy94qKLtOA==",
+ "dev": true
+ },
+ "node_modules/@types/retry": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmmirror.com/@types/retry/-/retry-0.12.0.tgz",
+ "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==",
+ "dev": true
+ },
+ "node_modules/@types/send": {
+ "version": "0.17.2",
+ "resolved": "https://registry.npmmirror.com/@types/send/-/send-0.17.2.tgz",
+ "integrity": "sha512-aAG6yRf6r0wQ29bkS+x97BIs64ZLxeE/ARwyS6wrldMm3C1MdKwCcnnEwMC1slI8wuxJOpiUH9MioC0A0i+GJw==",
+ "dev": true,
+ "dependencies": {
+ "@types/mime": "^1",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/serve-index": {
+ "version": "1.9.2",
+ "resolved": "https://registry.npmmirror.com/@types/serve-index/-/serve-index-1.9.2.tgz",
+ "integrity": "sha512-asaEIoc6J+DbBKXtO7p2shWUpKacZOoMBEGBgPG91P8xhO53ohzHWGCs4ScZo5pQMf5ukQzVT9fhX1WzpHihig==",
+ "dev": true,
+ "dependencies": {
+ "@types/express": "*"
+ }
+ },
+ "node_modules/@types/serve-static": {
+ "version": "1.15.3",
+ "resolved": "https://registry.npmmirror.com/@types/serve-static/-/serve-static-1.15.3.tgz",
+ "integrity": "sha512-yVRvFsEMrv7s0lGhzrggJjNOSmZCdgCjw9xWrPr/kNNLp6FaDfMC1KaYl3TSJ0c58bECwNBMoQrZJ8hA8E1eFg==",
+ "dev": true,
+ "dependencies": {
+ "@types/http-errors": "*",
+ "@types/mime": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/sockjs": {
+ "version": "0.3.34",
+ "resolved": "https://registry.npmmirror.com/@types/sockjs/-/sockjs-0.3.34.tgz",
+ "integrity": "sha512-R+n7qBFnm/6jinlteC9DBL5dGiDGjWAvjo4viUanpnc/dG1y7uDoacXPIQ/PQEg1fI912SMHIa014ZjRpvDw4g==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/ws": {
+ "version": "8.5.6",
+ "resolved": "https://registry.npmmirror.com/@types/ws/-/ws-8.5.6.tgz",
+ "integrity": "sha512-8B5EO9jLVCy+B58PLHvLDuOD8DRVMgQzq8d55SjLCOn9kqGyqOvy27exVaTio1q1nX5zLu8/6N0n2ThSxOM6tg==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@vue/babel-helper-vue-jsx-merge-props": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmmirror.com/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.4.0.tgz",
+ "integrity": "sha512-JkqXfCkUDp4PIlFdDQ0TdXoIejMtTHP67/pvxlgeY+u5k3LEdKuWZ3LK6xkxo52uDoABIVyRwqVkfLQJhk7VBA==",
+ "dev": true
+ },
+ "node_modules/@vue/babel-helper-vue-transform-on": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmmirror.com/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.1.5.tgz",
+ "integrity": "sha512-SgUymFpMoAyWeYWLAY+MkCK3QEROsiUnfaw5zxOVD/M64KQs8D/4oK6Q5omVA2hnvEOE0SCkH2TZxs/jnnUj7w==",
+ "dev": true
+ },
+ "node_modules/@vue/babel-plugin-jsx": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmmirror.com/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.1.5.tgz",
+ "integrity": "sha512-nKs1/Bg9U1n3qSWnsHhCVQtAzI6aQXqua8j/bZrau8ywT1ilXQbK4FwEJGmU8fV7tcpuFvWmmN7TMmV1OBma1g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.22.5",
+ "@babel/plugin-syntax-jsx": "^7.22.5",
+ "@babel/template": "^7.22.5",
+ "@babel/traverse": "^7.22.5",
+ "@babel/types": "^7.22.5",
+ "@vue/babel-helper-vue-transform-on": "^1.1.5",
+ "camelcase": "^6.3.0",
+ "html-tags": "^3.3.1",
+ "svg-tags": "^1.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@vue/babel-plugin-transform-vue-jsx": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmmirror.com/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.4.0.tgz",
+ "integrity": "sha512-Fmastxw4MMx0vlgLS4XBX0XiBbUFzoMGeVXuMV08wyOfXdikAFqBTuYPR0tlk+XskL19EzHc39SgjrPGY23JnA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.0.0",
+ "@babel/plugin-syntax-jsx": "^7.2.0",
+ "@vue/babel-helper-vue-jsx-merge-props": "^1.4.0",
+ "html-tags": "^2.0.0",
+ "lodash.kebabcase": "^4.1.1",
+ "svg-tags": "^1.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@vue/babel-plugin-transform-vue-jsx/node_modules/html-tags": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/html-tags/-/html-tags-2.0.0.tgz",
+ "integrity": "sha512-+Il6N8cCo2wB/Vd3gqy/8TZhTD3QvcVeQLCnZiGkGCH3JP28IgGAY41giccp2W4R3jfyJPAP318FQTa1yU7K7g==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@vue/babel-preset-app": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmmirror.com/@vue/babel-preset-app/-/babel-preset-app-5.0.8.tgz",
+ "integrity": "sha512-yl+5qhpjd8e1G4cMXfORkkBlvtPCIgmRf3IYCWYDKIQ7m+PPa5iTm4feiNmCMD6yGqQWMhhK/7M3oWGL9boKwg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "^7.12.16",
+ "@babel/helper-compilation-targets": "^7.12.16",
+ "@babel/helper-module-imports": "^7.12.13",
+ "@babel/plugin-proposal-class-properties": "^7.12.13",
+ "@babel/plugin-proposal-decorators": "^7.12.13",
+ "@babel/plugin-syntax-dynamic-import": "^7.8.3",
+ "@babel/plugin-syntax-jsx": "^7.12.13",
+ "@babel/plugin-transform-runtime": "^7.12.15",
+ "@babel/preset-env": "^7.12.16",
+ "@babel/runtime": "^7.12.13",
+ "@vue/babel-plugin-jsx": "^1.0.3",
+ "@vue/babel-preset-jsx": "^1.1.2",
+ "babel-plugin-dynamic-import-node": "^2.3.3",
+ "core-js": "^3.8.3",
+ "core-js-compat": "^3.8.3",
+ "semver": "^7.3.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "*",
+ "core-js": "^3",
+ "vue": "^2 || ^3.2.13"
+ },
+ "peerDependenciesMeta": {
+ "core-js": {
+ "optional": true
+ },
+ "vue": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@vue/babel-preset-app/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@vue/babel-preset-app/node_modules/semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@vue/babel-preset-app/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
+ "node_modules/@vue/babel-preset-jsx": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmmirror.com/@vue/babel-preset-jsx/-/babel-preset-jsx-1.4.0.tgz",
+ "integrity": "sha512-QmfRpssBOPZWL5xw7fOuHNifCQcNQC1PrOo/4fu6xlhlKJJKSA3HqX92Nvgyx8fqHZTUGMPHmFA+IDqwXlqkSA==",
+ "dev": true,
+ "dependencies": {
+ "@vue/babel-helper-vue-jsx-merge-props": "^1.4.0",
+ "@vue/babel-plugin-transform-vue-jsx": "^1.4.0",
+ "@vue/babel-sugar-composition-api-inject-h": "^1.4.0",
+ "@vue/babel-sugar-composition-api-render-instance": "^1.4.0",
+ "@vue/babel-sugar-functional-vue": "^1.4.0",
+ "@vue/babel-sugar-inject-h": "^1.4.0",
+ "@vue/babel-sugar-v-model": "^1.4.0",
+ "@vue/babel-sugar-v-on": "^1.4.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0",
+ "vue": "*"
+ },
+ "peerDependenciesMeta": {
+ "vue": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@vue/babel-sugar-composition-api-inject-h": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmmirror.com/@vue/babel-sugar-composition-api-inject-h/-/babel-sugar-composition-api-inject-h-1.4.0.tgz",
+ "integrity": "sha512-VQq6zEddJHctnG4w3TfmlVp5FzDavUSut/DwR0xVoe/mJKXyMcsIibL42wPntozITEoY90aBV0/1d2KjxHU52g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/plugin-syntax-jsx": "^7.2.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@vue/babel-sugar-composition-api-render-instance": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmmirror.com/@vue/babel-sugar-composition-api-render-instance/-/babel-sugar-composition-api-render-instance-1.4.0.tgz",
+ "integrity": "sha512-6ZDAzcxvy7VcnCjNdHJ59mwK02ZFuP5CnucloidqlZwVQv5CQLijc3lGpR7MD3TWFi78J7+a8J56YxbCtHgT9Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/plugin-syntax-jsx": "^7.2.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@vue/babel-sugar-functional-vue": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmmirror.com/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.4.0.tgz",
+ "integrity": "sha512-lTEB4WUFNzYt2In6JsoF9sAYVTo84wC4e+PoZWSgM6FUtqRJz7wMylaEhSRgG71YF+wfLD6cc9nqVeXN2rwBvw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/plugin-syntax-jsx": "^7.2.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@vue/babel-sugar-inject-h": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmmirror.com/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.4.0.tgz",
+ "integrity": "sha512-muwWrPKli77uO2fFM7eA3G1lAGnERuSz2NgAxuOLzrsTlQl8W4G+wwbM4nB6iewlKbwKRae3nL03UaF5ffAPMA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/plugin-syntax-jsx": "^7.2.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@vue/babel-sugar-v-model": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmmirror.com/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.4.0.tgz",
+ "integrity": "sha512-0t4HGgXb7WHYLBciZzN5s0Hzqan4Ue+p/3FdQdcaHAb7s5D9WZFGoSxEZHrR1TFVZlAPu1bejTKGeAzaaG3NCQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/plugin-syntax-jsx": "^7.2.0",
+ "@vue/babel-helper-vue-jsx-merge-props": "^1.4.0",
+ "@vue/babel-plugin-transform-vue-jsx": "^1.4.0",
+ "camelcase": "^5.0.0",
+ "html-tags": "^2.0.0",
+ "svg-tags": "^1.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@vue/babel-sugar-v-model/node_modules/camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@vue/babel-sugar-v-model/node_modules/html-tags": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/html-tags/-/html-tags-2.0.0.tgz",
+ "integrity": "sha512-+Il6N8cCo2wB/Vd3gqy/8TZhTD3QvcVeQLCnZiGkGCH3JP28IgGAY41giccp2W4R3jfyJPAP318FQTa1yU7K7g==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@vue/babel-sugar-v-on": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmmirror.com/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.4.0.tgz",
+ "integrity": "sha512-m+zud4wKLzSKgQrWwhqRObWzmTuyzl6vOP7024lrpeJM4x2UhQtRDLgYjXAw9xBXjCwS0pP9kXjg91F9ZNo9JA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/plugin-syntax-jsx": "^7.2.0",
+ "@vue/babel-plugin-transform-vue-jsx": "^1.4.0",
+ "camelcase": "^5.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@vue/babel-sugar-v-on/node_modules/camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@vue/cli-overlay": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmmirror.com/@vue/cli-overlay/-/cli-overlay-5.0.8.tgz",
+ "integrity": "sha512-KmtievE/B4kcXp6SuM2gzsnSd8WebkQpg3XaB6GmFh1BJGRqa1UiW9up7L/Q67uOdTigHxr5Ar2lZms4RcDjwQ==",
+ "dev": true
+ },
+ "node_modules/@vue/cli-plugin-babel": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmmirror.com/@vue/cli-plugin-babel/-/cli-plugin-babel-5.0.8.tgz",
+ "integrity": "sha512-a4qqkml3FAJ3auqB2kN2EMPocb/iu0ykeELwed+9B1c1nQ1HKgslKMHMPavYx3Cd/QAx2mBD4hwKBqZXEI/CsQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "^7.12.16",
+ "@vue/babel-preset-app": "^5.0.8",
+ "@vue/cli-shared-utils": "^5.0.8",
+ "babel-loader": "^8.2.2",
+ "thread-loader": "^3.0.0",
+ "webpack": "^5.54.0"
+ },
+ "peerDependencies": {
+ "@vue/cli-service": "^3.0.0 || ^4.0.0 || ^5.0.0-0"
+ }
+ },
+ "node_modules/@vue/cli-plugin-eslint": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmmirror.com/@vue/cli-plugin-eslint/-/cli-plugin-eslint-5.0.8.tgz",
+ "integrity": "sha512-d11+I5ONYaAPW1KyZj9GlrV/E6HZePq5L5eAF5GgoVdu6sxr6bDgEoxzhcS1Pk2eh8rn1MxG/FyyR+eCBj/CNg==",
+ "dev": true,
+ "dependencies": {
+ "@vue/cli-shared-utils": "^5.0.8",
+ "eslint-webpack-plugin": "^3.1.0",
+ "globby": "^11.0.2",
+ "webpack": "^5.54.0",
+ "yorkie": "^2.0.0"
+ },
+ "peerDependencies": {
+ "@vue/cli-service": "^3.0.0 || ^4.0.0 || ^5.0.0-0",
+ "eslint": ">=7.5.0"
+ }
+ },
+ "node_modules/@vue/cli-plugin-router": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmmirror.com/@vue/cli-plugin-router/-/cli-plugin-router-5.0.8.tgz",
+ "integrity": "sha512-Gmv4dsGdAsWPqVijz3Ux2OS2HkMrWi1ENj2cYL75nUeL+Xj5HEstSqdtfZ0b1q9NCce+BFB6QnHfTBXc/fCvMg==",
+ "dev": true,
+ "dependencies": {
+ "@vue/cli-shared-utils": "^5.0.8"
+ },
+ "peerDependencies": {
+ "@vue/cli-service": "^3.0.0 || ^4.0.0 || ^5.0.0-0"
+ }
+ },
+ "node_modules/@vue/cli-plugin-vuex": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmmirror.com/@vue/cli-plugin-vuex/-/cli-plugin-vuex-5.0.8.tgz",
+ "integrity": "sha512-HSYWPqrunRE5ZZs8kVwiY6oWcn95qf/OQabwLfprhdpFWAGtLStShjsGED2aDpSSeGAskQETrtR/5h7VqgIlBA==",
+ "dev": true,
+ "peerDependencies": {
+ "@vue/cli-service": "^3.0.0 || ^4.0.0 || ^5.0.0-0"
+ }
+ },
+ "node_modules/@vue/cli-service": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmmirror.com/@vue/cli-service/-/cli-service-5.0.8.tgz",
+ "integrity": "sha512-nV7tYQLe7YsTtzFrfOMIHc5N2hp5lHG2rpYr0aNja9rNljdgcPZLyQRb2YRivTHqTv7lI962UXFURcpStHgyFw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.12.16",
+ "@soda/friendly-errors-webpack-plugin": "^1.8.0",
+ "@soda/get-current-script": "^1.0.2",
+ "@types/minimist": "^1.2.0",
+ "@vue/cli-overlay": "^5.0.8",
+ "@vue/cli-plugin-router": "^5.0.8",
+ "@vue/cli-plugin-vuex": "^5.0.8",
+ "@vue/cli-shared-utils": "^5.0.8",
+ "@vue/component-compiler-utils": "^3.3.0",
+ "@vue/vue-loader-v15": "npm:vue-loader@^15.9.7",
+ "@vue/web-component-wrapper": "^1.3.0",
+ "acorn": "^8.0.5",
+ "acorn-walk": "^8.0.2",
+ "address": "^1.1.2",
+ "autoprefixer": "^10.2.4",
+ "browserslist": "^4.16.3",
+ "case-sensitive-paths-webpack-plugin": "^2.3.0",
+ "cli-highlight": "^2.1.10",
+ "clipboardy": "^2.3.0",
+ "cliui": "^7.0.4",
+ "copy-webpack-plugin": "^9.0.1",
+ "css-loader": "^6.5.0",
+ "css-minimizer-webpack-plugin": "^3.0.2",
+ "cssnano": "^5.0.0",
+ "debug": "^4.1.1",
+ "default-gateway": "^6.0.3",
+ "dotenv": "^10.0.0",
+ "dotenv-expand": "^5.1.0",
+ "fs-extra": "^9.1.0",
+ "globby": "^11.0.2",
+ "hash-sum": "^2.0.0",
+ "html-webpack-plugin": "^5.1.0",
+ "is-file-esm": "^1.0.0",
+ "launch-editor-middleware": "^2.2.1",
+ "lodash.defaultsdeep": "^4.6.1",
+ "lodash.mapvalues": "^4.6.0",
+ "mini-css-extract-plugin": "^2.5.3",
+ "minimist": "^1.2.5",
+ "module-alias": "^2.2.2",
+ "portfinder": "^1.0.26",
+ "postcss": "^8.2.6",
+ "postcss-loader": "^6.1.1",
+ "progress-webpack-plugin": "^1.0.12",
+ "ssri": "^8.0.1",
+ "terser-webpack-plugin": "^5.1.1",
+ "thread-loader": "^3.0.0",
+ "vue-loader": "^17.0.0",
+ "vue-style-loader": "^4.1.3",
+ "webpack": "^5.54.0",
+ "webpack-bundle-analyzer": "^4.4.0",
+ "webpack-chain": "^6.5.1",
+ "webpack-dev-server": "^4.7.3",
+ "webpack-merge": "^5.7.3",
+ "webpack-virtual-modules": "^0.4.2",
+ "whatwg-fetch": "^3.6.2"
+ },
+ "bin": {
+ "vue-cli-service": "bin/vue-cli-service.js"
+ },
+ "engines": {
+ "node": "^12.0.0 || >= 14.0.0"
+ },
+ "peerDependencies": {
+ "vue-template-compiler": "^2.0.0",
+ "webpack-sources": "*"
+ },
+ "peerDependenciesMeta": {
+ "cache-loader": {
+ "optional": true
+ },
+ "less-loader": {
+ "optional": true
+ },
+ "pug-plain-loader": {
+ "optional": true
+ },
+ "raw-loader": {
+ "optional": true
+ },
+ "sass-loader": {
+ "optional": true
+ },
+ "stylus-loader": {
+ "optional": true
+ },
+ "vue-template-compiler": {
+ "optional": true
+ },
+ "webpack-sources": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@vue/cli-shared-utils": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmmirror.com/@vue/cli-shared-utils/-/cli-shared-utils-5.0.8.tgz",
+ "integrity": "sha512-uK2YB7bBVuQhjOJF+O52P9yFMXeJVj7ozqJkwYE9PlMHL1LMHjtCYm4cSdOebuPzyP+/9p0BimM/OqxsevIopQ==",
+ "dev": true,
+ "dependencies": {
+ "@achrinza/node-ipc": "^9.2.5",
+ "chalk": "^4.1.2",
+ "execa": "^1.0.0",
+ "joi": "^17.4.0",
+ "launch-editor": "^2.2.1",
+ "lru-cache": "^6.0.0",
+ "node-fetch": "^2.6.7",
+ "open": "^8.0.2",
+ "ora": "^5.3.0",
+ "read-pkg": "^5.1.1",
+ "semver": "^7.3.4",
+ "strip-ansi": "^6.0.0"
+ }
+ },
+ "node_modules/@vue/cli-shared-utils/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@vue/cli-shared-utils/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@vue/cli-shared-utils/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/@vue/cli-shared-utils/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/@vue/cli-shared-utils/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@vue/cli-shared-utils/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@vue/cli-shared-utils/node_modules/semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@vue/cli-shared-utils/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@vue/cli-shared-utils/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
+ "node_modules/@vue/compiler-core": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.3.4.tgz",
+ "integrity": "sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==",
+ "dependencies": {
+ "@babel/parser": "^7.21.3",
+ "@vue/shared": "3.3.4",
+ "estree-walker": "^2.0.2",
+ "source-map-js": "^1.0.2"
+ }
+ },
+ "node_modules/@vue/compiler-dom": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz",
+ "integrity": "sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==",
+ "dependencies": {
+ "@vue/compiler-core": "3.3.4",
+ "@vue/shared": "3.3.4"
+ }
+ },
+ "node_modules/@vue/compiler-sfc": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.3.4.tgz",
+ "integrity": "sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==",
+ "dependencies": {
+ "@babel/parser": "^7.20.15",
+ "@vue/compiler-core": "3.3.4",
+ "@vue/compiler-dom": "3.3.4",
+ "@vue/compiler-ssr": "3.3.4",
+ "@vue/reactivity-transform": "3.3.4",
+ "@vue/shared": "3.3.4",
+ "estree-walker": "^2.0.2",
+ "magic-string": "^0.30.0",
+ "postcss": "^8.1.10",
+ "source-map-js": "^1.0.2"
+ }
+ },
+ "node_modules/@vue/compiler-ssr": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.3.4.tgz",
+ "integrity": "sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==",
+ "dependencies": {
+ "@vue/compiler-dom": "3.3.4",
+ "@vue/shared": "3.3.4"
+ }
+ },
+ "node_modules/@vue/component-compiler-utils": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmmirror.com/@vue/component-compiler-utils/-/component-compiler-utils-3.3.0.tgz",
+ "integrity": "sha512-97sfH2mYNU+2PzGrmK2haqffDpVASuib9/w2/noxiFi31Z54hW+q3izKQXXQZSNhtiUpAI36uSuYepeBe4wpHQ==",
+ "dev": true,
+ "dependencies": {
+ "consolidate": "^0.15.1",
+ "hash-sum": "^1.0.2",
+ "lru-cache": "^4.1.2",
+ "merge-source-map": "^1.1.0",
+ "postcss": "^7.0.36",
+ "postcss-selector-parser": "^6.0.2",
+ "source-map": "~0.6.1",
+ "vue-template-es2015-compiler": "^1.9.0"
+ },
+ "optionalDependencies": {
+ "prettier": "^1.18.2 || ^2.0.0"
+ }
+ },
+ "node_modules/@vue/component-compiler-utils/node_modules/hash-sum": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/hash-sum/-/hash-sum-1.0.2.tgz",
+ "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==",
+ "dev": true
+ },
+ "node_modules/@vue/component-compiler-utils/node_modules/lru-cache": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-4.1.5.tgz",
+ "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
+ "dev": true,
+ "dependencies": {
+ "pseudomap": "^1.0.2",
+ "yallist": "^2.1.2"
+ }
+ },
+ "node_modules/@vue/component-compiler-utils/node_modules/picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "node_modules/@vue/component-compiler-utils/node_modules/postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "dependencies": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@vue/component-compiler-utils/node_modules/yallist": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmmirror.com/yallist/-/yallist-2.1.2.tgz",
+ "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==",
+ "dev": true
+ },
+ "node_modules/@vue/devtools-api": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.5.0.tgz",
+ "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q=="
+ },
+ "node_modules/@vue/reactivity": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.3.4.tgz",
+ "integrity": "sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==",
+ "dependencies": {
+ "@vue/shared": "3.3.4"
+ }
+ },
+ "node_modules/@vue/reactivity-transform": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmmirror.com/@vue/reactivity-transform/-/reactivity-transform-3.3.4.tgz",
+ "integrity": "sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==",
+ "dependencies": {
+ "@babel/parser": "^7.20.15",
+ "@vue/compiler-core": "3.3.4",
+ "@vue/shared": "3.3.4",
+ "estree-walker": "^2.0.2",
+ "magic-string": "^0.30.0"
+ }
+ },
+ "node_modules/@vue/runtime-core": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.3.4.tgz",
+ "integrity": "sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==",
+ "dependencies": {
+ "@vue/reactivity": "3.3.4",
+ "@vue/shared": "3.3.4"
+ }
+ },
+ "node_modules/@vue/runtime-dom": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.3.4.tgz",
+ "integrity": "sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==",
+ "dependencies": {
+ "@vue/runtime-core": "3.3.4",
+ "@vue/shared": "3.3.4",
+ "csstype": "^3.1.1"
+ }
+ },
+ "node_modules/@vue/server-renderer": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.3.4.tgz",
+ "integrity": "sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==",
+ "dependencies": {
+ "@vue/compiler-ssr": "3.3.4",
+ "@vue/shared": "3.3.4"
+ },
+ "peerDependencies": {
+ "vue": "3.3.4"
+ }
+ },
+ "node_modules/@vue/shared": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.3.4.tgz",
+ "integrity": "sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ=="
+ },
+ "node_modules/@vue/vue-loader-v15": {
+ "name": "vue-loader",
+ "version": "15.10.2",
+ "resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-15.10.2.tgz",
+ "integrity": "sha512-ndeSe/8KQc/nlA7TJ+OBhv2qalmj1s+uBs7yHDRFaAXscFTApBzY9F1jES3bautmgWjDlDct0fw8rPuySDLwxw==",
+ "dev": true,
+ "dependencies": {
+ "@vue/component-compiler-utils": "^3.1.0",
+ "hash-sum": "^1.0.2",
+ "loader-utils": "^1.1.0",
+ "vue-hot-reload-api": "^2.3.0",
+ "vue-style-loader": "^4.1.0"
+ },
+ "peerDependencies": {
+ "css-loader": "*",
+ "webpack": "^3.0.0 || ^4.1.0 || ^5.0.0-0"
+ },
+ "peerDependenciesMeta": {
+ "cache-loader": {
+ "optional": true
+ },
+ "prettier": {
+ "optional": true
+ },
+ "vue-template-compiler": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@vue/vue-loader-v15/node_modules/hash-sum": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/hash-sum/-/hash-sum-1.0.2.tgz",
+ "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==",
+ "dev": true
+ },
+ "node_modules/@vue/web-component-wrapper": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmmirror.com/@vue/web-component-wrapper/-/web-component-wrapper-1.3.0.tgz",
+ "integrity": "sha512-Iu8Tbg3f+emIIMmI2ycSI8QcEuAUgPTgHwesDU1eKMLE4YC/c/sFbGc70QgMq31ijRftV0R7vCm9co6rldCeOA==",
+ "dev": true
+ },
+ "node_modules/@webassemblyjs/ast": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/ast/-/ast-1.11.6.tgz",
+ "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==",
+ "dependencies": {
+ "@webassemblyjs/helper-numbers": "1.11.6",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.6"
+ }
+ },
+ "node_modules/@webassemblyjs/floating-point-hex-parser": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz",
+ "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw=="
+ },
+ "node_modules/@webassemblyjs/helper-api-error": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz",
+ "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q=="
+ },
+ "node_modules/@webassemblyjs/helper-buffer": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz",
+ "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA=="
+ },
+ "node_modules/@webassemblyjs/helper-numbers": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz",
+ "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==",
+ "dependencies": {
+ "@webassemblyjs/floating-point-hex-parser": "1.11.6",
+ "@webassemblyjs/helper-api-error": "1.11.6",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webassemblyjs/helper-wasm-bytecode": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz",
+ "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA=="
+ },
+ "node_modules/@webassemblyjs/helper-wasm-section": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz",
+ "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.11.6",
+ "@webassemblyjs/helper-buffer": "1.11.6",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+ "@webassemblyjs/wasm-gen": "1.11.6"
+ }
+ },
+ "node_modules/@webassemblyjs/ieee754": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz",
+ "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==",
+ "dependencies": {
+ "@xtuc/ieee754": "^1.2.0"
+ }
+ },
+ "node_modules/@webassemblyjs/leb128": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz",
+ "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==",
+ "dependencies": {
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webassemblyjs/utf8": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz",
+ "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA=="
+ },
+ "node_modules/@webassemblyjs/wasm-edit": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz",
+ "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.11.6",
+ "@webassemblyjs/helper-buffer": "1.11.6",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+ "@webassemblyjs/helper-wasm-section": "1.11.6",
+ "@webassemblyjs/wasm-gen": "1.11.6",
+ "@webassemblyjs/wasm-opt": "1.11.6",
+ "@webassemblyjs/wasm-parser": "1.11.6",
+ "@webassemblyjs/wast-printer": "1.11.6"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-gen": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz",
+ "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.11.6",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+ "@webassemblyjs/ieee754": "1.11.6",
+ "@webassemblyjs/leb128": "1.11.6",
+ "@webassemblyjs/utf8": "1.11.6"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-opt": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz",
+ "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.11.6",
+ "@webassemblyjs/helper-buffer": "1.11.6",
+ "@webassemblyjs/wasm-gen": "1.11.6",
+ "@webassemblyjs/wasm-parser": "1.11.6"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-parser": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz",
+ "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.11.6",
+ "@webassemblyjs/helper-api-error": "1.11.6",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+ "@webassemblyjs/ieee754": "1.11.6",
+ "@webassemblyjs/leb128": "1.11.6",
+ "@webassemblyjs/utf8": "1.11.6"
+ }
+ },
+ "node_modules/@webassemblyjs/wast-printer": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz",
+ "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.11.6",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@xtuc/ieee754": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+ "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA=="
+ },
+ "node_modules/@xtuc/long": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmmirror.com/@xtuc/long/-/long-4.2.2.tgz",
+ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="
+ },
+ "node_modules/accepts": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmmirror.com/accepts/-/accepts-1.3.8.tgz",
+ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
+ "dev": true,
+ "dependencies": {
+ "mime-types": "~2.1.34",
+ "negotiator": "0.6.3"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.10.0",
+ "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.10.0.tgz",
+ "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-import-assertions": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmmirror.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz",
+ "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==",
+ "peerDependencies": {
+ "acorn": "^8"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/acorn-walk": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.2.0.tgz",
+ "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/address": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmmirror.com/address/-/address-1.2.2.tgz",
+ "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/admin-lte": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/admin-lte/-/admin-lte-2.3.2.tgz",
+ "integrity": "sha512-ps/lwrgMGqWMMepBx26taUUzp0cHSAC34qsbTtKq3RIcV4B0Mo4w+tEMy4B6Ts5z/UZPiHkOle6MjelYuNu/kw=="
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "node_modules/ajv-formats": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/ajv-formats/-/ajv-formats-2.1.1.tgz",
+ "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "ajv": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/ajv-formats/node_modules/ajv": {
+ "version": "8.12.0",
+ "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.12.0.tgz",
+ "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "node_modules/ajv-formats/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true
+ },
+ "node_modules/ajv-keywords": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+ "peerDependencies": {
+ "ajv": "^6.9.1"
+ }
+ },
+ "node_modules/ansi-colors": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmmirror.com/ansi-colors/-/ansi-colors-4.1.3.tgz",
+ "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ansi-escapes": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
+ "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ansi-html-community": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmmirror.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz",
+ "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==",
+ "dev": true,
+ "engines": [
+ "node >= 0.8.0"
+ ],
+ "bin": {
+ "ansi-html": "bin/ansi-html"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/any-promise": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmmirror.com/any-promise/-/any-promise-1.3.0.tgz",
+ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
+ "dev": true
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dev": true,
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/arch": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmmirror.com/arch/-/arch-2.2.0.tgz",
+ "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==",
+ "dev": true
+ },
+ "node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/array-flatten": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmmirror.com/array-flatten/-/array-flatten-2.1.2.tgz",
+ "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==",
+ "dev": true
+ },
+ "node_modules/array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/astral-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/astral-regex/-/astral-regex-2.0.0.tgz",
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/async": {
+ "version": "2.6.4",
+ "resolved": "https://registry.npmmirror.com/async/-/async-2.6.4.tgz",
+ "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==",
+ "dev": true,
+ "dependencies": {
+ "lodash": "^4.17.14"
+ }
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+ },
+ "node_modules/at-least-node": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/at-least-node/-/at-least-node-1.0.0.tgz",
+ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/autoprefixer": {
+ "version": "10.4.16",
+ "resolved": "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-10.4.16.tgz",
+ "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==",
+ "dev": true,
+ "dependencies": {
+ "browserslist": "^4.21.10",
+ "caniuse-lite": "^1.0.30001538",
+ "fraction.js": "^4.3.6",
+ "normalize-range": "^0.1.2",
+ "picocolors": "^1.0.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "bin": {
+ "autoprefixer": "bin/autoprefixer"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/axios": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.1.tgz",
+ "integrity": "sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==",
+ "dependencies": {
+ "follow-redirects": "^1.15.0",
+ "form-data": "^4.0.0",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
+ "node_modules/babel-loader": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmmirror.com/babel-loader/-/babel-loader-8.3.0.tgz",
+ "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==",
+ "dev": true,
+ "dependencies": {
+ "find-cache-dir": "^3.3.1",
+ "loader-utils": "^2.0.0",
+ "make-dir": "^3.1.0",
+ "schema-utils": "^2.6.5"
+ },
+ "engines": {
+ "node": ">= 8.9"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0",
+ "webpack": ">=2"
+ }
+ },
+ "node_modules/babel-loader/node_modules/loader-utils": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz",
+ "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
+ "dev": true,
+ "dependencies": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^2.1.2"
+ },
+ "engines": {
+ "node": ">=8.9.0"
+ }
+ },
+ "node_modules/babel-plugin-dynamic-import-node": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmmirror.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz",
+ "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==",
+ "dev": true,
+ "dependencies": {
+ "object.assign": "^4.1.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs2": {
+ "version": "0.4.5",
+ "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz",
+ "integrity": "sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.22.6",
+ "@babel/helper-define-polyfill-provider": "^0.4.2",
+ "semver": "^6.3.1"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs3": {
+ "version": "0.8.4",
+ "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.4.tgz",
+ "integrity": "sha512-9l//BZZsPR+5XjyJMPtZSK4jv0BsTO1zDac2GC6ygx9WLGlcsnRd1Co0B2zT5fF5Ic6BZy+9m3HNZ3QcOeDKfg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.4.2",
+ "core-js-compat": "^3.32.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-regenerator": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz",
+ "integrity": "sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.4.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "dev": true
+ },
+ "node_modules/batch": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmmirror.com/batch/-/batch-0.6.1.tgz",
+ "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==",
+ "dev": true
+ },
+ "node_modules/big.js": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmmirror.com/big.js/-/big.js-5.2.2.tgz",
+ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/bl": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz",
+ "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
+ "dev": true,
+ "dependencies": {
+ "buffer": "^5.5.0",
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.4.0"
+ }
+ },
+ "node_modules/bluebird": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmmirror.com/bluebird/-/bluebird-3.7.2.tgz",
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+ "dev": true
+ },
+ "node_modules/body-parser": {
+ "version": "1.20.1",
+ "resolved": "https://registry.npmmirror.com/body-parser/-/body-parser-1.20.1.tgz",
+ "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
+ "dev": true,
+ "dependencies": {
+ "bytes": "3.1.2",
+ "content-type": "~1.0.4",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "on-finished": "2.4.1",
+ "qs": "6.11.0",
+ "raw-body": "2.5.1",
+ "type-is": "~1.6.18",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/body-parser/node_modules/bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmmirror.com/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/body-parser/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/body-parser/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true
+ },
+ "node_modules/bonjour-service": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/bonjour-service/-/bonjour-service-1.1.1.tgz",
+ "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==",
+ "dev": true,
+ "dependencies": {
+ "array-flatten": "^2.1.2",
+ "dns-equal": "^1.0.0",
+ "fast-deep-equal": "^3.1.3",
+ "multicast-dns": "^7.2.5"
+ }
+ },
+ "node_modules/boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+ "dev": true
+ },
+ "node_modules/bootstrap": {
+ "version": "3.3.5",
+ "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.3.5.tgz",
+ "integrity": "sha512-Px9EFI0UqI/9XEKTN9Oy1k5niss9VlThHsexEFffHtrRMZmcYvsLENa12EHD9HwbdG8bP/OcxQWMrQsAlnACVA==",
+ "engines": {
+ "node": ">=0.10.1"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "dependencies": {
+ "fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.22.0",
+ "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.22.0.tgz",
+ "integrity": "sha512-v+Jcv64L2LbfTC6OnRcaxtqJNJuQAVhZKSJfR/6hn7lhnChUXl4amwVviqN1k411BB+3rRoKMitELRn1CojeRA==",
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001539",
+ "electron-to-chromium": "^1.4.530",
+ "node-releases": "^2.0.13",
+ "update-browserslist-db": "^1.0.13"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "dev": true,
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
+ },
+ "node_modules/bytes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/bytes/-/bytes-3.0.0.tgz",
+ "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.2.tgz",
+ "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.0.2"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camel-case": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmmirror.com/camel-case/-/camel-case-4.1.2.tgz",
+ "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==",
+ "dev": true,
+ "dependencies": {
+ "pascal-case": "^3.1.2",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-6.3.0.tgz",
+ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/caniuse-api": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/caniuse-api/-/caniuse-api-3.0.0.tgz",
+ "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==",
+ "dev": true,
+ "dependencies": {
+ "browserslist": "^4.0.0",
+ "caniuse-lite": "^1.0.0",
+ "lodash.memoize": "^4.1.2",
+ "lodash.uniq": "^4.5.0"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001541",
+ "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001541.tgz",
+ "integrity": "sha512-bLOsqxDgTqUBkzxbNlSBt8annkDpQB9NdzdTbO2ooJ+eC/IQcvDspDc058g84ejCelF7vHUx57KIOjEecOHXaw=="
+ },
+ "node_modules/case-sensitive-paths-webpack-plugin": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmmirror.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz",
+ "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/chokidar/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/chrome-trace-event": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
+ "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==",
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/ci-info": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmmirror.com/ci-info/-/ci-info-1.6.0.tgz",
+ "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==",
+ "dev": true
+ },
+ "node_modules/clean-css": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmmirror.com/clean-css/-/clean-css-5.3.2.tgz",
+ "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==",
+ "dev": true,
+ "dependencies": {
+ "source-map": "~0.6.0"
+ },
+ "engines": {
+ "node": ">= 10.0"
+ }
+ },
+ "node_modules/cli-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-3.1.0.tgz",
+ "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+ "dev": true,
+ "dependencies": {
+ "restore-cursor": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cli-highlight": {
+ "version": "2.1.11",
+ "resolved": "https://registry.npmmirror.com/cli-highlight/-/cli-highlight-2.1.11.tgz",
+ "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "highlight.js": "^10.7.1",
+ "mz": "^2.4.0",
+ "parse5": "^5.1.1",
+ "parse5-htmlparser2-tree-adapter": "^6.0.0",
+ "yargs": "^16.0.0"
+ },
+ "bin": {
+ "highlight": "bin/highlight"
+ },
+ "engines": {
+ "node": ">=8.0.0",
+ "npm": ">=5.0.0"
+ }
+ },
+ "node_modules/cli-highlight/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cli-highlight/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/cli-highlight/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/cli-highlight/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/cli-highlight/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cli-highlight/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cli-spinners": {
+ "version": "2.9.1",
+ "resolved": "https://registry.npmmirror.com/cli-spinners/-/cli-spinners-2.9.1.tgz",
+ "integrity": "sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/clipboardy": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmmirror.com/clipboardy/-/clipboardy-2.3.0.tgz",
+ "integrity": "sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ==",
+ "dev": true,
+ "dependencies": {
+ "arch": "^2.1.1",
+ "execa": "^1.0.0",
+ "is-wsl": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmmirror.com/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "node_modules/clone": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmmirror.com/clone/-/clone-1.0.4.tgz",
+ "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/clone-deep": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmmirror.com/clone-deep/-/clone-deep-4.0.1.tgz",
+ "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
+ "dev": true,
+ "dependencies": {
+ "is-plain-object": "^2.0.4",
+ "kind-of": "^6.0.2",
+ "shallow-clone": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/clone-deep/node_modules/is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dev": true,
+ "dependencies": {
+ "isobject": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "dev": true
+ },
+ "node_modules/colord": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmmirror.com/colord/-/colord-2.9.3.tgz",
+ "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==",
+ "dev": true
+ },
+ "node_modules/colorette": {
+ "version": "2.0.20",
+ "resolved": "https://registry.npmmirror.com/colorette/-/colorette-2.0.20.tgz",
+ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
+ "dev": true
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/commander": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmmirror.com/commander/-/commander-8.3.0.tgz",
+ "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
+ "dev": true,
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/commondir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/commondir/-/commondir-1.0.1.tgz",
+ "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
+ "dev": true
+ },
+ "node_modules/compressible": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmmirror.com/compressible/-/compressible-2.0.18.tgz",
+ "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
+ "dev": true,
+ "dependencies": {
+ "mime-db": ">= 1.43.0 < 2"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/compression": {
+ "version": "1.7.4",
+ "resolved": "https://registry.npmmirror.com/compression/-/compression-1.7.4.tgz",
+ "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
+ "dev": true,
+ "dependencies": {
+ "accepts": "~1.3.5",
+ "bytes": "3.0.0",
+ "compressible": "~2.0.16",
+ "debug": "2.6.9",
+ "on-headers": "~1.0.2",
+ "safe-buffer": "5.1.2",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/compression/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/compression/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true
+ },
+ "node_modules/compression/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "dev": true
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true
+ },
+ "node_modules/connect-history-api-fallback": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz",
+ "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/consolidate": {
+ "version": "0.15.1",
+ "resolved": "https://registry.npmmirror.com/consolidate/-/consolidate-0.15.1.tgz",
+ "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==",
+ "deprecated": "Please upgrade to consolidate v1.0.0+ as it has been modernized with several long-awaited fixes implemented. Maintenance is supported by Forward Email at https://forwardemail.net ; follow/watch https://github.com/ladjs/consolidate for updates and release changelog",
+ "dev": true,
+ "dependencies": {
+ "bluebird": "^3.1.1"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
+ }
+ },
+ "node_modules/content-disposition": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmmirror.com/content-disposition/-/content-disposition-0.5.4.tgz",
+ "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "5.2.1"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/content-type": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmmirror.com/content-type/-/content-type-1.0.5.tgz",
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "dev": true
+ },
+ "node_modules/cookie": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmmirror.com/cookie/-/cookie-0.5.0.tgz",
+ "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookie-signature": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmmirror.com/cookie-signature/-/cookie-signature-1.0.6.tgz",
+ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
+ "dev": true
+ },
+ "node_modules/copy-anything": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz",
+ "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==",
+ "dependencies": {
+ "is-what": "^3.14.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mesqueeb"
+ }
+ },
+ "node_modules/copy-webpack-plugin": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmmirror.com/copy-webpack-plugin/-/copy-webpack-plugin-9.1.0.tgz",
+ "integrity": "sha512-rxnR7PaGigJzhqETHGmAcxKnLZSR5u1Y3/bcIv/1FnqXedcL/E2ewK7ZCNrArJKCiSv8yVXhTqetJh8inDvfsA==",
+ "dev": true,
+ "dependencies": {
+ "fast-glob": "^3.2.7",
+ "glob-parent": "^6.0.1",
+ "globby": "^11.0.3",
+ "normalize-path": "^3.0.0",
+ "schema-utils": "^3.1.1",
+ "serialize-javascript": "^6.0.0"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "peerDependencies": {
+ "webpack": "^5.1.0"
+ }
+ },
+ "node_modules/copy-webpack-plugin/node_modules/schema-utils": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-3.3.0.tgz",
+ "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+ "dev": true,
+ "dependencies": {
+ "@types/json-schema": "^7.0.8",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ }
+ },
+ "node_modules/core-js": {
+ "version": "3.32.2",
+ "resolved": "https://registry.npmmirror.com/core-js/-/core-js-3.32.2.tgz",
+ "integrity": "sha512-pxXSw1mYZPDGvTQqEc5vgIb83jGQKFGYWY76z4a7weZXUolw3G+OvpZqSRcfYOoOVUQJYEPsWeQK8pKEnUtWxQ==",
+ "hasInstallScript": true
+ },
+ "node_modules/core-js-compat": {
+ "version": "3.32.2",
+ "resolved": "https://registry.npmmirror.com/core-js-compat/-/core-js-compat-3.32.2.tgz",
+ "integrity": "sha512-+GjlguTDINOijtVRUxrQOv3kfu9rl+qPNdX2LTbJ/ZyVTuxK+ksVSAGX1nHstu4hrv1En/uPTtWgq2gI5wt4AQ==",
+ "dev": true,
+ "dependencies": {
+ "browserslist": "^4.21.10"
+ }
+ },
+ "node_modules/core-util-is": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz",
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
+ "dev": true
+ },
+ "node_modules/cosmiconfig": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmmirror.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
+ "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
+ "dev": true,
+ "dependencies": {
+ "@types/parse-json": "^4.0.0",
+ "import-fresh": "^3.2.1",
+ "parse-json": "^5.0.0",
+ "path-type": "^4.0.0",
+ "yaml": "^1.10.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "6.0.5",
+ "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-6.0.5.tgz",
+ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+ "dev": true,
+ "dependencies": {
+ "nice-try": "^1.0.4",
+ "path-key": "^2.0.1",
+ "semver": "^5.5.0",
+ "shebang-command": "^1.2.0",
+ "which": "^1.2.9"
+ },
+ "engines": {
+ "node": ">=4.8"
+ }
+ },
+ "node_modules/cross-spawn/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/css-declaration-sorter": {
+ "version": "6.4.1",
+ "resolved": "https://registry.npmmirror.com/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz",
+ "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==",
+ "dev": true,
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.0.9"
+ }
+ },
+ "node_modules/css-loader": {
+ "version": "6.8.1",
+ "resolved": "https://registry.npmmirror.com/css-loader/-/css-loader-6.8.1.tgz",
+ "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==",
+ "dev": true,
+ "dependencies": {
+ "icss-utils": "^5.1.0",
+ "postcss": "^8.4.21",
+ "postcss-modules-extract-imports": "^3.0.0",
+ "postcss-modules-local-by-default": "^4.0.3",
+ "postcss-modules-scope": "^3.0.0",
+ "postcss-modules-values": "^4.0.0",
+ "postcss-value-parser": "^4.2.0",
+ "semver": "^7.3.8"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "peerDependencies": {
+ "webpack": "^5.0.0"
+ }
+ },
+ "node_modules/css-loader/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/css-loader/node_modules/semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/css-loader/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
+ "node_modules/css-minimizer-webpack-plugin": {
+ "version": "3.4.1",
+ "resolved": "https://registry.npmmirror.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz",
+ "integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==",
+ "dev": true,
+ "dependencies": {
+ "cssnano": "^5.0.6",
+ "jest-worker": "^27.0.2",
+ "postcss": "^8.3.5",
+ "schema-utils": "^4.0.0",
+ "serialize-javascript": "^6.0.0",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "peerDependencies": {
+ "webpack": "^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@parcel/css": {
+ "optional": true
+ },
+ "clean-css": {
+ "optional": true
+ },
+ "csso": {
+ "optional": true
+ },
+ "esbuild": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/css-minimizer-webpack-plugin/node_modules/ajv": {
+ "version": "8.12.0",
+ "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.12.0.tgz",
+ "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "node_modules/css-minimizer-webpack-plugin/node_modules/ajv-keywords": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+ "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3"
+ },
+ "peerDependencies": {
+ "ajv": "^8.8.2"
+ }
+ },
+ "node_modules/css-minimizer-webpack-plugin/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true
+ },
+ "node_modules/css-minimizer-webpack-plugin/node_modules/schema-utils": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-4.2.0.tgz",
+ "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==",
+ "dev": true,
+ "dependencies": {
+ "@types/json-schema": "^7.0.9",
+ "ajv": "^8.9.0",
+ "ajv-formats": "^2.1.1",
+ "ajv-keywords": "^5.1.0"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ }
+ },
+ "node_modules/css-select": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/css-select/-/css-select-4.3.0.tgz",
+ "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==",
+ "dev": true,
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-what": "^6.0.1",
+ "domhandler": "^4.3.1",
+ "domutils": "^2.8.0",
+ "nth-check": "^2.0.1"
+ }
+ },
+ "node_modules/css-tree": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmmirror.com/css-tree/-/css-tree-1.1.3.tgz",
+ "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
+ "dev": true,
+ "dependencies": {
+ "mdn-data": "2.0.14",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/css-what": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmmirror.com/css-what/-/css-what-6.1.0.tgz",
+ "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "dev": true,
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/cssnano": {
+ "version": "5.1.15",
+ "resolved": "https://registry.npmmirror.com/cssnano/-/cssnano-5.1.15.tgz",
+ "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==",
+ "dev": true,
+ "dependencies": {
+ "cssnano-preset-default": "^5.2.14",
+ "lilconfig": "^2.0.3",
+ "yaml": "^1.10.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/cssnano-preset-default": {
+ "version": "5.2.14",
+ "resolved": "https://registry.npmmirror.com/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz",
+ "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==",
+ "dev": true,
+ "dependencies": {
+ "css-declaration-sorter": "^6.3.1",
+ "cssnano-utils": "^3.1.0",
+ "postcss-calc": "^8.2.3",
+ "postcss-colormin": "^5.3.1",
+ "postcss-convert-values": "^5.1.3",
+ "postcss-discard-comments": "^5.1.2",
+ "postcss-discard-duplicates": "^5.1.0",
+ "postcss-discard-empty": "^5.1.1",
+ "postcss-discard-overridden": "^5.1.0",
+ "postcss-merge-longhand": "^5.1.7",
+ "postcss-merge-rules": "^5.1.4",
+ "postcss-minify-font-values": "^5.1.0",
+ "postcss-minify-gradients": "^5.1.1",
+ "postcss-minify-params": "^5.1.4",
+ "postcss-minify-selectors": "^5.2.1",
+ "postcss-normalize-charset": "^5.1.0",
+ "postcss-normalize-display-values": "^5.1.0",
+ "postcss-normalize-positions": "^5.1.1",
+ "postcss-normalize-repeat-style": "^5.1.1",
+ "postcss-normalize-string": "^5.1.0",
+ "postcss-normalize-timing-functions": "^5.1.0",
+ "postcss-normalize-unicode": "^5.1.1",
+ "postcss-normalize-url": "^5.1.0",
+ "postcss-normalize-whitespace": "^5.1.1",
+ "postcss-ordered-values": "^5.1.3",
+ "postcss-reduce-initial": "^5.1.2",
+ "postcss-reduce-transforms": "^5.1.0",
+ "postcss-svgo": "^5.1.0",
+ "postcss-unique-selectors": "^5.1.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/cssnano-utils": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/cssnano-utils/-/cssnano-utils-3.1.0.tgz",
+ "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==",
+ "dev": true,
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/csso": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmmirror.com/csso/-/csso-4.2.0.tgz",
+ "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==",
+ "dev": true,
+ "dependencies": {
+ "css-tree": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.2.tgz",
+ "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ=="
+ },
+ "node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true
+ },
+ "node_modules/deepmerge": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmmirror.com/deepmerge/-/deepmerge-1.5.2.tgz",
+ "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/default-gateway": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmmirror.com/default-gateway/-/default-gateway-6.0.3.tgz",
+ "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==",
+ "dev": true,
+ "dependencies": {
+ "execa": "^5.0.0"
+ },
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/default-gateway/node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/default-gateway/node_modules/execa": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmmirror.com/execa/-/execa-5.1.1.tgz",
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.0",
+ "human-signals": "^2.1.0",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.1",
+ "onetime": "^5.1.2",
+ "signal-exit": "^3.0.3",
+ "strip-final-newline": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/default-gateway/node_modules/get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/default-gateway/node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/default-gateway/node_modules/npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/default-gateway/node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/default-gateway/node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/default-gateway/node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/default-gateway/node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/defaults": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmmirror.com/defaults/-/defaults-1.0.4.tgz",
+ "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==",
+ "dev": true,
+ "dependencies": {
+ "clone": "^1.0.2"
+ }
+ },
+ "node_modules/define-data-property": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.0.tgz",
+ "integrity": "sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g==",
+ "dev": true,
+ "dependencies": {
+ "get-intrinsic": "^1.2.1",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/define-lazy-prop": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
+ "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/define-properties": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.1.tgz",
+ "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
+ "dev": true,
+ "dependencies": {
+ "define-data-property": "^1.0.1",
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/destroy": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/destroy/-/destroy-1.2.0.tgz",
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/detect-node": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/detect-node/-/detect-node-2.1.0.tgz",
+ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
+ "dev": true
+ },
+ "node_modules/dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "dependencies": {
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/dns-equal": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/dns-equal/-/dns-equal-1.0.0.tgz",
+ "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==",
+ "dev": true
+ },
+ "node_modules/dns-packet": {
+ "version": "5.6.1",
+ "resolved": "https://registry.npmmirror.com/dns-packet/-/dns-packet-5.6.1.tgz",
+ "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==",
+ "dev": true,
+ "dependencies": {
+ "@leichtgewicht/ip-codec": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/dom-converter": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmmirror.com/dom-converter/-/dom-converter-0.2.0.tgz",
+ "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==",
+ "dev": true,
+ "dependencies": {
+ "utila": "~0.4"
+ }
+ },
+ "node_modules/dom-serializer": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-1.4.1.tgz",
+ "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
+ "dev": true,
+ "dependencies": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.2.0",
+ "entities": "^2.0.0"
+ }
+ },
+ "node_modules/domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "dev": true
+ },
+ "node_modules/domhandler": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-4.3.1.tgz",
+ "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
+ "dev": true,
+ "dependencies": {
+ "domelementtype": "^2.2.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/domutils": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmmirror.com/domutils/-/domutils-2.8.0.tgz",
+ "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
+ "dev": true,
+ "dependencies": {
+ "dom-serializer": "^1.0.1",
+ "domelementtype": "^2.2.0",
+ "domhandler": "^4.2.0"
+ }
+ },
+ "node_modules/dot-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmmirror.com/dot-case/-/dot-case-3.0.4.tgz",
+ "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
+ "dev": true,
+ "dependencies": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/dotenv": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmmirror.com/dotenv/-/dotenv-10.0.0.tgz",
+ "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/dotenv-expand": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmmirror.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz",
+ "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==",
+ "dev": true
+ },
+ "node_modules/duplexer": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmmirror.com/duplexer/-/duplexer-0.1.2.tgz",
+ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==",
+ "dev": true
+ },
+ "node_modules/easy-stack": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/easy-stack/-/easy-stack-1.0.1.tgz",
+ "integrity": "sha512-wK2sCs4feiiJeFXn3zvY0p41mdU5VUgbgs1rNsc/y5ngFUijdWd+iIN8eoyuZHKB8xN6BL4PdWmzqFmxNg6V2w==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
+ "dev": true
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.4.532",
+ "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.532.tgz",
+ "integrity": "sha512-piIR0QFdIGKmOJTSNg5AwxZRNWQSXlRYycqDB9Srstx4lip8KpcmRxVP6zuFWExWziHYZpJ0acX7TxqX95KBpg=="
+ },
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "node_modules/emojis-list": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/emojis-list/-/emojis-list-3.0.0.tgz",
+ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/end-of-stream": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz",
+ "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+ "dev": true,
+ "dependencies": {
+ "once": "^1.4.0"
+ }
+ },
+ "node_modules/enhanced-resolve": {
+ "version": "5.15.0",
+ "resolved": "https://registry.npmmirror.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz",
+ "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==",
+ "dependencies": {
+ "graceful-fs": "^4.2.4",
+ "tapable": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/enquirer": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmmirror.com/enquirer/-/enquirer-2.4.1.tgz",
+ "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-colors": "^4.1.1",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/entities": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmmirror.com/entities/-/entities-2.2.0.tgz",
+ "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
+ "dev": true
+ },
+ "node_modules/errno": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
+ "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
+ "optional": true,
+ "dependencies": {
+ "prr": "~1.0.1"
+ },
+ "bin": {
+ "errno": "cli.js"
+ }
+ },
+ "node_modules/error-ex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmmirror.com/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "dev": true,
+ "dependencies": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "node_modules/error-stack-parser": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmmirror.com/error-stack-parser/-/error-stack-parser-2.1.4.tgz",
+ "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==",
+ "dev": true,
+ "dependencies": {
+ "stackframe": "^1.3.4"
+ }
+ },
+ "node_modules/es-module-lexer": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-1.3.1.tgz",
+ "integrity": "sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q=="
+ },
+ "node_modules/escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
+ "dev": true
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "7.32.0",
+ "resolved": "https://registry.npmmirror.com/eslint/-/eslint-7.32.0.tgz",
+ "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "7.12.11",
+ "@eslint/eslintrc": "^0.4.3",
+ "@humanwhocodes/config-array": "^0.5.0",
+ "ajv": "^6.10.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.0.1",
+ "doctrine": "^3.0.0",
+ "enquirer": "^2.3.5",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^5.1.1",
+ "eslint-utils": "^2.1.0",
+ "eslint-visitor-keys": "^2.0.0",
+ "espree": "^7.3.1",
+ "esquery": "^1.4.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "functional-red-black-tree": "^1.0.1",
+ "glob-parent": "^5.1.2",
+ "globals": "^13.6.0",
+ "ignore": "^4.0.6",
+ "import-fresh": "^3.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "js-yaml": "^3.13.1",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.0.4",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.1",
+ "progress": "^2.0.0",
+ "regexpp": "^3.1.0",
+ "semver": "^7.2.1",
+ "strip-ansi": "^6.0.0",
+ "strip-json-comments": "^3.1.0",
+ "table": "^6.0.9",
+ "text-table": "^0.2.0",
+ "v8-compile-cache": "^2.0.3"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-vue": {
+ "version": "8.7.1",
+ "resolved": "https://registry.npmmirror.com/eslint-plugin-vue/-/eslint-plugin-vue-8.7.1.tgz",
+ "integrity": "sha512-28sbtm4l4cOzoO1LtzQPxfxhQABararUb1JtqusQqObJpWX2e/gmVyeYVfepizPFne0Q5cILkYGiBoV36L12Wg==",
+ "dev": true,
+ "dependencies": {
+ "eslint-utils": "^3.0.0",
+ "natural-compare": "^1.4.0",
+ "nth-check": "^2.0.1",
+ "postcss-selector-parser": "^6.0.9",
+ "semver": "^7.3.5",
+ "vue-eslint-parser": "^8.0.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-vue/node_modules/eslint-utils": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/eslint-utils/-/eslint-utils-3.0.0.tgz",
+ "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^2.0.0"
+ },
+ "engines": {
+ "node": "^10.0.0 || ^12.0.0 || >= 14.0.0"
+ },
+ "peerDependencies": {
+ "eslint": ">=5"
+ }
+ },
+ "node_modules/eslint-plugin-vue/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint-plugin-vue/node_modules/semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint-plugin-vue/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
+ "node_modules/eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/eslint-utils": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/eslint-utils/-/eslint-utils-2.1.0.tgz",
+ "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint-webpack-plugin": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmmirror.com/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz",
+ "integrity": "sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==",
+ "dev": true,
+ "dependencies": {
+ "@types/eslint": "^7.29.0 || ^8.4.1",
+ "jest-worker": "^28.0.2",
+ "micromatch": "^4.0.5",
+ "normalize-path": "^3.0.0",
+ "schema-utils": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0",
+ "webpack": "^5.0.0"
+ }
+ },
+ "node_modules/eslint-webpack-plugin/node_modules/ajv": {
+ "version": "8.12.0",
+ "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.12.0.tgz",
+ "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "node_modules/eslint-webpack-plugin/node_modules/ajv-keywords": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+ "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3"
+ },
+ "peerDependencies": {
+ "ajv": "^8.8.2"
+ }
+ },
+ "node_modules/eslint-webpack-plugin/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint-webpack-plugin/node_modules/jest-worker": {
+ "version": "28.1.3",
+ "resolved": "https://registry.npmmirror.com/jest-worker/-/jest-worker-28.1.3.tgz",
+ "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^8.0.0"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
+ }
+ },
+ "node_modules/eslint-webpack-plugin/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true
+ },
+ "node_modules/eslint-webpack-plugin/node_modules/schema-utils": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-4.2.0.tgz",
+ "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==",
+ "dev": true,
+ "dependencies": {
+ "@types/json-schema": "^7.0.9",
+ "ajv": "^8.9.0",
+ "ajv-formats": "^2.1.1",
+ "ajv-keywords": "^5.1.0"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ }
+ },
+ "node_modules/eslint-webpack-plugin/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint/node_modules/@babel/code-frame": {
+ "version": "7.12.11",
+ "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.12.11.tgz",
+ "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/highlight": "^7.10.4"
+ }
+ },
+ "node_modules/eslint/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/eslint/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/eslint/node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/eslint/node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/eslint/node_modules/globals": {
+ "version": "13.22.0",
+ "resolved": "https://registry.npmmirror.com/globals/-/globals-13.22.0.tgz",
+ "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint/node_modules/ignore": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmmirror.com/ignore/-/ignore-4.0.6.tgz",
+ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/eslint/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint/node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint/node_modules/semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint/node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint/node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint/node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint/node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/eslint/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
+ "node_modules/espree": {
+ "version": "7.3.1",
+ "resolved": "https://registry.npmmirror.com/espree/-/espree-7.3.1.tgz",
+ "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^7.4.0",
+ "acorn-jsx": "^5.3.1",
+ "eslint-visitor-keys": "^1.3.0"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/espree/node_modules/acorn": {
+ "version": "7.4.1",
+ "resolved": "https://registry.npmmirror.com/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/espree/node_modules/eslint-visitor-keys": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true,
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmmirror.com/esquery/-/esquery-1.5.0.tgz",
+ "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esquery/node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esrecurse/node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/event-pubsub": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/event-pubsub/-/event-pubsub-4.3.0.tgz",
+ "integrity": "sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/eventemitter3": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-4.0.7.tgz",
+ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
+ "dev": true
+ },
+ "node_modules/events": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmmirror.com/events/-/events-3.3.0.tgz",
+ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+ "engines": {
+ "node": ">=0.8.x"
+ }
+ },
+ "node_modules/execa": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/execa/-/execa-1.0.0.tgz",
+ "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^6.0.0",
+ "get-stream": "^4.0.0",
+ "is-stream": "^1.1.0",
+ "npm-run-path": "^2.0.0",
+ "p-finally": "^1.0.0",
+ "signal-exit": "^3.0.0",
+ "strip-eof": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/express": {
+ "version": "4.18.2",
+ "resolved": "https://registry.npmmirror.com/express/-/express-4.18.2.tgz",
+ "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
+ "dev": true,
+ "dependencies": {
+ "accepts": "~1.3.8",
+ "array-flatten": "1.1.1",
+ "body-parser": "1.20.1",
+ "content-disposition": "0.5.4",
+ "content-type": "~1.0.4",
+ "cookie": "0.5.0",
+ "cookie-signature": "1.0.6",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "finalhandler": "1.2.0",
+ "fresh": "0.5.2",
+ "http-errors": "2.0.0",
+ "merge-descriptors": "1.0.1",
+ "methods": "~1.1.2",
+ "on-finished": "2.4.1",
+ "parseurl": "~1.3.3",
+ "path-to-regexp": "0.1.7",
+ "proxy-addr": "~2.0.7",
+ "qs": "6.11.0",
+ "range-parser": "~1.2.1",
+ "safe-buffer": "5.2.1",
+ "send": "0.18.0",
+ "serve-static": "1.15.0",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "type-is": "~1.6.18",
+ "utils-merge": "1.0.1",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
+ }
+ },
+ "node_modules/express/node_modules/array-flatten": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/array-flatten/-/array-flatten-1.1.1.tgz",
+ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
+ "dev": true
+ },
+ "node_modules/express/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/express/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.1.tgz",
+ "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true
+ },
+ "node_modules/fastq": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.15.0.tgz",
+ "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
+ "dev": true,
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/faye-websocket": {
+ "version": "0.11.4",
+ "resolved": "https://registry.npmmirror.com/faye-websocket/-/faye-websocket-0.11.4.tgz",
+ "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==",
+ "dev": true,
+ "dependencies": {
+ "websocket-driver": ">=0.5.1"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/figures": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/figures/-/figures-2.0.0.tgz",
+ "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==",
+ "dev": true,
+ "dependencies": {
+ "escape-string-regexp": "^1.0.5"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dev": true,
+ "dependencies": {
+ "flat-cache": "^3.0.4"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/finalhandler": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.2.0.tgz",
+ "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
+ "dev": true,
+ "dependencies": {
+ "debug": "2.6.9",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "on-finished": "2.4.1",
+ "parseurl": "~1.3.3",
+ "statuses": "2.0.1",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/finalhandler/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/finalhandler/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true
+ },
+ "node_modules/find-cache-dir": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmmirror.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz",
+ "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==",
+ "dev": true,
+ "dependencies": {
+ "commondir": "^1.0.1",
+ "make-dir": "^3.0.2",
+ "pkg-dir": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/flat-cache/-/flat-cache-3.1.0.tgz",
+ "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==",
+ "dev": true,
+ "dependencies": {
+ "flatted": "^3.2.7",
+ "keyv": "^4.5.3",
+ "rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.2.9",
+ "resolved": "https://registry.npmmirror.com/flatted/-/flatted-3.2.9.tgz",
+ "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==",
+ "dev": true
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.15.3",
+ "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.3.tgz",
+ "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==",
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/font-awesome": {
+ "version": "4.6.3",
+ "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.6.3.tgz",
+ "integrity": "sha512-I5rWuHv7MI5uYDGFT1SJohxdkTfks41QQ9fvMEzvBnWppsehXnoj8LNuW4MGtawSrHvApYVhCZSC7rk5wDycyw==",
+ "engines": {
+ "node": ">=0.10.3"
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+ "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/forwarded": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz",
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fraction.js": {
+ "version": "4.3.6",
+ "resolved": "https://registry.npmmirror.com/fraction.js/-/fraction.js-4.3.6.tgz",
+ "integrity": "sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmmirror.com/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fs-extra": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "dev": true,
+ "dependencies": {
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/fs-monkey": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmmirror.com/fs-monkey/-/fs-monkey-1.0.5.tgz",
+ "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==",
+ "dev": true
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "dev": true
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+ "dev": true
+ },
+ "node_modules/functional-red-black-tree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+ "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==",
+ "dev": true
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true,
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz",
+ "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3"
+ }
+ },
+ "node_modules/get-stream": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-4.1.0.tgz",
+ "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
+ "dev": true,
+ "dependencies": {
+ "pump": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/glob-to-regexp": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmmirror.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
+ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="
+ },
+ "node_modules/globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmmirror.com/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
+ "dependencies": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.0.1.tgz",
+ "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+ "dev": true,
+ "dependencies": {
+ "get-intrinsic": "^1.1.3"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
+ },
+ "node_modules/gzip-size": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmmirror.com/gzip-size/-/gzip-size-6.0.0.tgz",
+ "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==",
+ "dev": true,
+ "dependencies": {
+ "duplexer": "^0.1.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/handle-thing": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/handle-thing/-/handle-thing-2.0.1.tgz",
+ "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==",
+ "dev": true
+ },
+ "node_modules/has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
+ "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
+ "dev": true,
+ "dependencies": {
+ "get-intrinsic": "^1.1.1"
+ }
+ },
+ "node_modules/has-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/has-proto/-/has-proto-1.0.1.tgz",
+ "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz",
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/hash-sum": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/hash-sum/-/hash-sum-2.0.0.tgz",
+ "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==",
+ "dev": true
+ },
+ "node_modules/he": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/he/-/he-1.2.0.tgz",
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+ "dev": true,
+ "bin": {
+ "he": "bin/he"
+ }
+ },
+ "node_modules/highlight.js": {
+ "version": "10.7.3",
+ "resolved": "https://registry.npmmirror.com/highlight.js/-/highlight.js-10.7.3.tgz",
+ "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/hosted-git-info": {
+ "version": "2.8.9",
+ "resolved": "https://registry.npmmirror.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+ "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
+ "dev": true
+ },
+ "node_modules/hpack.js": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmmirror.com/hpack.js/-/hpack.js-2.1.6.tgz",
+ "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "obuf": "^1.0.0",
+ "readable-stream": "^2.0.1",
+ "wbuf": "^1.1.0"
+ }
+ },
+ "node_modules/hpack.js/node_modules/readable-stream": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz",
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+ "dev": true,
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/hpack.js/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "dev": true
+ },
+ "node_modules/hpack.js/node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "node_modules/html-entities": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmmirror.com/html-entities/-/html-entities-2.4.0.tgz",
+ "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==",
+ "dev": true
+ },
+ "node_modules/html-minifier-terser": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmmirror.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz",
+ "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==",
+ "dev": true,
+ "dependencies": {
+ "camel-case": "^4.1.2",
+ "clean-css": "^5.2.2",
+ "commander": "^8.3.0",
+ "he": "^1.2.0",
+ "param-case": "^3.0.4",
+ "relateurl": "^0.2.7",
+ "terser": "^5.10.0"
+ },
+ "bin": {
+ "html-minifier-terser": "cli.js"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/html-tags": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmmirror.com/html-tags/-/html-tags-3.3.1.tgz",
+ "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/html-webpack-plugin": {
+ "version": "5.5.3",
+ "resolved": "https://registry.npmmirror.com/html-webpack-plugin/-/html-webpack-plugin-5.5.3.tgz",
+ "integrity": "sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg==",
+ "dev": true,
+ "dependencies": {
+ "@types/html-minifier-terser": "^6.0.0",
+ "html-minifier-terser": "^6.0.2",
+ "lodash": "^4.17.21",
+ "pretty-error": "^4.0.0",
+ "tapable": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "peerDependencies": {
+ "webpack": "^5.20.0"
+ }
+ },
+ "node_modules/htmlparser2": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-6.1.0.tgz",
+ "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==",
+ "dev": true,
+ "dependencies": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.0.0",
+ "domutils": "^2.5.2",
+ "entities": "^2.0.0"
+ }
+ },
+ "node_modules/http-deceiver": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmmirror.com/http-deceiver/-/http-deceiver-1.2.7.tgz",
+ "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==",
+ "dev": true
+ },
+ "node_modules/http-errors": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.0.tgz",
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
+ "dev": true,
+ "dependencies": {
+ "depd": "2.0.0",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "toidentifier": "1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/http-parser-js": {
+ "version": "0.5.8",
+ "resolved": "https://registry.npmmirror.com/http-parser-js/-/http-parser-js-0.5.8.tgz",
+ "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==",
+ "dev": true
+ },
+ "node_modules/http-proxy": {
+ "version": "1.18.1",
+ "resolved": "https://registry.npmmirror.com/http-proxy/-/http-proxy-1.18.1.tgz",
+ "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
+ "dev": true,
+ "dependencies": {
+ "eventemitter3": "^4.0.0",
+ "follow-redirects": "^1.0.0",
+ "requires-port": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/http-proxy-middleware": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmmirror.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz",
+ "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==",
+ "dev": true,
+ "dependencies": {
+ "@types/http-proxy": "^1.17.8",
+ "http-proxy": "^1.18.1",
+ "is-glob": "^4.0.1",
+ "is-plain-obj": "^3.0.0",
+ "micromatch": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "@types/express": "^4.17.13"
+ },
+ "peerDependenciesMeta": {
+ "@types/express": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/human-signals": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/human-signals/-/human-signals-2.1.0.tgz",
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.17.0"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "dev": true,
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/icss-utils": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmmirror.com/icss-utils/-/icss-utils-5.1.0.tgz",
+ "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
+ "dev": true,
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "dev": true
+ },
+ "node_modules/ignore": {
+ "version": "5.2.4",
+ "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.2.4.tgz",
+ "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/image-size": {
+ "version": "0.5.5",
+ "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz",
+ "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==",
+ "optional": true,
+ "bin": {
+ "image-size": "bin/image-size.js"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/immutable": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmmirror.com/immutable/-/immutable-4.3.4.tgz",
+ "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==",
+ "dev": true
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "dev": true,
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "dev": true,
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "node_modules/ionicons": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-2.0.1.tgz",
+ "integrity": "sha512-ySWjaL3PxB4JFMvr7/02sByWM7TQv1mrvRYFvUwFcVEEHEK/RKEP6MFhcnTmKhoPM6Ih6s5wH003fkVk1wiXLQ=="
+ },
+ "node_modules/ipaddr.js": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-2.1.0.tgz",
+ "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
+ "dev": true
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-ci": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmmirror.com/is-ci/-/is-ci-1.2.1.tgz",
+ "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==",
+ "dev": true,
+ "dependencies": {
+ "ci-info": "^1.5.0"
+ },
+ "bin": {
+ "is-ci": "bin.js"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.13.0",
+ "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.13.0.tgz",
+ "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==",
+ "dev": true,
+ "dependencies": {
+ "has": "^1.0.3"
+ }
+ },
+ "node_modules/is-docker": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmmirror.com/is-docker/-/is-docker-2.2.1.tgz",
+ "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
+ "dev": true,
+ "bin": {
+ "is-docker": "cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-file-esm": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/is-file-esm/-/is-file-esm-1.0.0.tgz",
+ "integrity": "sha512-rZlaNKb4Mr8WlRu2A9XdeoKgnO5aA53XdPHgCKVyCrQ/rWi89RET1+bq37Ru46obaQXeiX4vmFIm1vks41hoSA==",
+ "dev": true,
+ "dependencies": {
+ "read-pkg-up": "^7.0.1"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-interactive": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/is-interactive/-/is-interactive-1.0.0.tgz",
+ "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-plain-obj": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz",
+ "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/is-plain-object": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-5.0.0.tgz",
+ "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-stream": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-1.1.0.tgz",
+ "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-unicode-supported": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmmirror.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/is-what": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz",
+ "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA=="
+ },
+ "node_modules/is-wsl": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmmirror.com/is-wsl/-/is-wsl-2.2.0.tgz",
+ "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+ "dev": true,
+ "dependencies": {
+ "is-docker": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+ "dev": true
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true
+ },
+ "node_modules/isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/javascript-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/javascript-stringify/-/javascript-stringify-2.1.0.tgz",
+ "integrity": "sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==",
+ "dev": true
+ },
+ "node_modules/jest-worker": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmmirror.com/jest-worker/-/jest-worker-27.5.1.tgz",
+ "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
+ "dependencies": {
+ "@types/node": "*",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^8.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ }
+ },
+ "node_modules/jest-worker/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-worker/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/joi": {
+ "version": "17.10.2",
+ "resolved": "https://registry.npmmirror.com/joi/-/joi-17.10.2.tgz",
+ "integrity": "sha512-hcVhjBxRNW/is3nNLdGLIjkgXetkeGc2wyhydhz8KumG23Aerk4HPjU5zaPAMRqXQFc0xNqXTC7+zQjxr0GlKA==",
+ "dev": true,
+ "dependencies": {
+ "@hapi/hoek": "^9.0.0",
+ "@hapi/topo": "^5.0.0",
+ "@sideway/address": "^4.1.3",
+ "@sideway/formula": "^3.0.1",
+ "@sideway/pinpoint": "^2.0.0"
+ }
+ },
+ "node_modules/jquery": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/jquery/-/jquery-2.2.0.tgz",
+ "integrity": "sha512-bQLMb56JzEBBs2CMzy8llOL0J1xm/JkDma6+UnF2cSPYJmvQHS9yZ+YGny/1YydkdZm8j0Ny8peiaeoWEwy9Zg=="
+ },
+ "node_modules/jquery.md5": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/jquery.md5/-/jquery.md5-1.0.0.tgz",
+ "integrity": "sha512-AB2L4HKKBmS1DihNztGvPZQv/gxM6JCdFC89QJASrcsktAlPeblWSeQ0iSVdWsxQXVZcmPtm8CLhFzi1UXtemg=="
+ },
+ "node_modules/js-message": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmmirror.com/js-message/-/js-message-1.0.7.tgz",
+ "integrity": "sha512-efJLHhLjIyKRewNS9EGZ4UpI8NguuL6fKkhRxVuMmrGV2xN/0APGdQYwLFky5w9naebSZ0OwAGp0G6/2Cg90rA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.6.0"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "node_modules/js-yaml": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsesc": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz",
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+ "dev": true,
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "dev": true
+ },
+ "node_modules/json-parse-better-errors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
+ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
+ "dev": true
+ },
+ "node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true,
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "dev": true,
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/keyv": {
+ "version": "4.5.3",
+ "resolved": "https://registry.npmmirror.com/keyv/-/keyv-4.5.3.tgz",
+ "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==",
+ "dev": true,
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/klona": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmmirror.com/klona/-/klona-2.0.6.tgz",
+ "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/knockout": {
+ "version": "3.5.1",
+ "resolved": "https://registry.npmjs.org/knockout/-/knockout-3.5.1.tgz",
+ "integrity": "sha512-wRJ9I4az0QcsH7A4v4l0enUpkS++MBx0BnL/68KaLzJg7x1qmbjSlwEoCNol7KTYZ+pmtI7Eh2J0Nu6/2Z5J/Q=="
+ },
+ "node_modules/launch-editor": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmmirror.com/launch-editor/-/launch-editor-2.6.0.tgz",
+ "integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==",
+ "dev": true,
+ "dependencies": {
+ "picocolors": "^1.0.0",
+ "shell-quote": "^1.7.3"
+ }
+ },
+ "node_modules/launch-editor-middleware": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmmirror.com/launch-editor-middleware/-/launch-editor-middleware-2.6.0.tgz",
+ "integrity": "sha512-K2yxgljj5TdCeRN1lBtO3/J26+AIDDDw+04y6VAiZbWcTdBwsYN6RrZBnW5DN/QiSIdKNjKdATLUUluWWFYTIA==",
+ "dev": true,
+ "dependencies": {
+ "launch-editor": "^2.6.0"
+ }
+ },
+ "node_modules/less": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz",
+ "integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==",
+ "dependencies": {
+ "copy-anything": "^2.0.1",
+ "parse-node-version": "^1.0.1",
+ "tslib": "^2.3.0"
+ },
+ "bin": {
+ "lessc": "bin/lessc"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "optionalDependencies": {
+ "errno": "^0.1.1",
+ "graceful-fs": "^4.1.2",
+ "image-size": "~0.5.0",
+ "make-dir": "^2.1.0",
+ "mime": "^1.4.1",
+ "needle": "^3.1.0",
+ "source-map": "~0.6.0"
+ }
+ },
+ "node_modules/less-loader": {
+ "version": "11.1.3",
+ "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.3.tgz",
+ "integrity": "sha512-A5b7O8dH9xpxvkosNrP0dFp2i/dISOJa9WwGF3WJflfqIERE2ybxh1BFDj5CovC2+jCE4M354mk90hN6ziXlVw==",
+ "engines": {
+ "node": ">= 14.15.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "less": "^3.5.0 || ^4.0.0",
+ "webpack": "^5.0.0"
+ }
+ },
+ "node_modules/less/node_modules/make-dir": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
+ "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
+ "optional": true,
+ "dependencies": {
+ "pify": "^4.0.1",
+ "semver": "^5.6.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/less/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "optional": true,
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/lilconfig": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/lilconfig/-/lilconfig-2.1.0.tgz",
+ "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "dev": true
+ },
+ "node_modules/loader-runner": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/loader-runner/-/loader-runner-4.3.0.tgz",
+ "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
+ "engines": {
+ "node": ">=6.11.5"
+ }
+ },
+ "node_modules/loader-utils": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-1.4.2.tgz",
+ "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
+ "dev": true,
+ "dependencies": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/loader-utils/node_modules/json5": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/json5/-/json5-1.0.2.tgz",
+ "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+ "dev": true,
+ "dependencies": {
+ "minimist": "^1.2.0"
+ },
+ "bin": {
+ "json5": "lib/cli.js"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true
+ },
+ "node_modules/lodash.debounce": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
+ "dev": true
+ },
+ "node_modules/lodash.defaultsdeep": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmmirror.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz",
+ "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==",
+ "dev": true
+ },
+ "node_modules/lodash.escape": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmmirror.com/lodash.escape/-/lodash.escape-4.0.1.tgz",
+ "integrity": "sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw==",
+ "dev": true
+ },
+ "node_modules/lodash.flatten": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmmirror.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz",
+ "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==",
+ "dev": true
+ },
+ "node_modules/lodash.invokemap": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmmirror.com/lodash.invokemap/-/lodash.invokemap-4.6.0.tgz",
+ "integrity": "sha512-CfkycNtMqgUlfjfdh2BhKO/ZXrP8ePOX5lEU/g0R3ItJcnuxWDwokMGKx1hWcfOikmyOVx6X9IwWnDGlgKl61w==",
+ "dev": true
+ },
+ "node_modules/lodash.kebabcase": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmmirror.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz",
+ "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==",
+ "dev": true
+ },
+ "node_modules/lodash.mapvalues": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmmirror.com/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz",
+ "integrity": "sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ==",
+ "dev": true
+ },
+ "node_modules/lodash.memoize": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmmirror.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
+ "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==",
+ "dev": true
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true
+ },
+ "node_modules/lodash.pullall": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmmirror.com/lodash.pullall/-/lodash.pullall-4.2.0.tgz",
+ "integrity": "sha512-VhqxBKH0ZxPpLhiu68YD1KnHmbhQJQctcipvmFnqIBDYzcIHzf3Zpu0tpeOKtR4x76p9yohc506eGdOjTmyIBg==",
+ "dev": true
+ },
+ "node_modules/lodash.truncate": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmmirror.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
+ "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==",
+ "dev": true
+ },
+ "node_modules/lodash.uniq": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmmirror.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
+ "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==",
+ "dev": true
+ },
+ "node_modules/lodash.uniqby": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmmirror.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz",
+ "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==",
+ "dev": true
+ },
+ "node_modules/log-symbols": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmmirror.com/log-symbols/-/log-symbols-4.1.0.tgz",
+ "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^4.1.0",
+ "is-unicode-supported": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/log-symbols/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/log-symbols/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/log-symbols/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/log-symbols/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/log-symbols/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/log-symbols/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/log-update": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmmirror.com/log-update/-/log-update-2.3.0.tgz",
+ "integrity": "sha512-vlP11XfFGyeNQlmEn9tJ66rEW1coA/79m5z6BCkudjbAGE83uhAcGYrBFwfs3AdLiLzGRusRPAbSPK9xZteCmg==",
+ "dev": true,
+ "dependencies": {
+ "ansi-escapes": "^3.0.0",
+ "cli-cursor": "^2.0.0",
+ "wrap-ansi": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/log-update/node_modules/ansi-regex": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-3.0.1.tgz",
+ "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/log-update/node_modules/cli-cursor": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-2.1.0.tgz",
+ "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==",
+ "dev": true,
+ "dependencies": {
+ "restore-cursor": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/log-update/node_modules/is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/log-update/node_modules/mimic-fn": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-1.2.0.tgz",
+ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/log-update/node_modules/onetime": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/onetime/-/onetime-2.0.1.tgz",
+ "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==",
+ "dev": true,
+ "dependencies": {
+ "mimic-fn": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/log-update/node_modules/restore-cursor": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-2.0.0.tgz",
+ "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==",
+ "dev": true,
+ "dependencies": {
+ "onetime": "^2.0.0",
+ "signal-exit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/log-update/node_modules/string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "dev": true,
+ "dependencies": {
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/log-update/node_modules/strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/log-update/node_modules/wrap-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-3.0.1.tgz",
+ "integrity": "sha512-iXR3tDXpbnTpzjKSylUJRkLuOrEC7hwEB221cgn6wtF8wpmz28puFXAEfPT5zrjM3wahygB//VuWEr1vTkDcNQ==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^2.1.1",
+ "strip-ansi": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/lower-case": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/lower-case/-/lower-case-2.0.2.tgz",
+ "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.3",
+ "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.3.tgz",
+ "integrity": "sha512-B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw==",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.4.15"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/make-dir": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/make-dir/-/make-dir-3.1.0.tgz",
+ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "dev": true,
+ "dependencies": {
+ "semver": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/mdn-data": {
+ "version": "2.0.14",
+ "resolved": "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.0.14.tgz",
+ "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
+ "dev": true
+ },
+ "node_modules/media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmmirror.com/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/memfs": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmmirror.com/memfs/-/memfs-3.5.3.tgz",
+ "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==",
+ "dev": true,
+ "dependencies": {
+ "fs-monkey": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/merge-descriptors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+ "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==",
+ "dev": true
+ },
+ "node_modules/merge-source-map": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/merge-source-map/-/merge-source-map-1.1.0.tgz",
+ "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==",
+ "dev": true,
+ "dependencies": {
+ "source-map": "^0.6.1"
+ }
+ },
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz",
+ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+ "dev": true,
+ "dependencies": {
+ "braces": "^3.0.2",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "devOptional": true,
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/mini-css-extract-plugin": {
+ "version": "2.7.6",
+ "resolved": "https://registry.npmmirror.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz",
+ "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==",
+ "dev": true,
+ "dependencies": {
+ "schema-utils": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "peerDependencies": {
+ "webpack": "^5.0.0"
+ }
+ },
+ "node_modules/mini-css-extract-plugin/node_modules/ajv": {
+ "version": "8.12.0",
+ "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.12.0.tgz",
+ "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+ "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3"
+ },
+ "peerDependencies": {
+ "ajv": "^8.8.2"
+ }
+ },
+ "node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true
+ },
+ "node_modules/mini-css-extract-plugin/node_modules/schema-utils": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-4.2.0.tgz",
+ "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==",
+ "dev": true,
+ "dependencies": {
+ "@types/json-schema": "^7.0.9",
+ "ajv": "^8.9.0",
+ "ajv-formats": "^2.1.1",
+ "ajv-keywords": "^5.1.0"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ }
+ },
+ "node_modules/minimalistic-assert": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
+ "dev": true
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "dev": true
+ },
+ "node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmmirror.com/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/minipass/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
+ "node_modules/mkdirp": {
+ "version": "0.5.6",
+ "resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz",
+ "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+ "dev": true,
+ "dependencies": {
+ "minimist": "^1.2.6"
+ },
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ }
+ },
+ "node_modules/module-alias": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmmirror.com/module-alias/-/module-alias-2.2.3.tgz",
+ "integrity": "sha512-23g5BFj4zdQL/b6tor7Ji+QY4pEfNH784BMslY9Qb0UnJWRAt+lQGLYmRaM0KDBwIG23ffEBELhZDP2rhi9f/Q==",
+ "dev": true
+ },
+ "node_modules/mrmime": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/mrmime/-/mrmime-1.0.1.tgz",
+ "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "devOptional": true
+ },
+ "node_modules/multicast-dns": {
+ "version": "7.2.5",
+ "resolved": "https://registry.npmmirror.com/multicast-dns/-/multicast-dns-7.2.5.tgz",
+ "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==",
+ "dev": true,
+ "dependencies": {
+ "dns-packet": "^5.2.2",
+ "thunky": "^1.0.2"
+ },
+ "bin": {
+ "multicast-dns": "cli.js"
+ }
+ },
+ "node_modules/mz": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmmirror.com/mz/-/mz-2.7.0.tgz",
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+ "dev": true,
+ "dependencies": {
+ "any-promise": "^1.0.0",
+ "object-assign": "^4.0.1",
+ "thenify-all": "^1.0.0"
+ }
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.6.tgz",
+ "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true
+ },
+ "node_modules/needle": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/needle/-/needle-3.2.0.tgz",
+ "integrity": "sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==",
+ "optional": true,
+ "dependencies": {
+ "debug": "^3.2.6",
+ "iconv-lite": "^0.6.3",
+ "sax": "^1.2.4"
+ },
+ "bin": {
+ "needle": "bin/needle"
+ },
+ "engines": {
+ "node": ">= 4.4.x"
+ }
+ },
+ "node_modules/needle/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "optional": true,
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/needle/node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "optional": true,
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/negotiator": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz",
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/neo-async": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmmirror.com/neo-async/-/neo-async-2.6.2.tgz",
+ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
+ },
+ "node_modules/nice-try": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmmirror.com/nice-try/-/nice-try-1.0.5.tgz",
+ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
+ "dev": true
+ },
+ "node_modules/no-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmmirror.com/no-case/-/no-case-3.0.4.tgz",
+ "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
+ "dev": true,
+ "dependencies": {
+ "lower-case": "^2.0.2",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/node-fetch": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmmirror.com/node-fetch/-/node-fetch-2.7.0.tgz",
+ "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
+ "dev": true,
+ "dependencies": {
+ "whatwg-url": "^5.0.0"
+ },
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ },
+ "peerDependencies": {
+ "encoding": "^0.1.0"
+ },
+ "peerDependenciesMeta": {
+ "encoding": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/node-forge": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmmirror.com/node-forge/-/node-forge-1.3.1.tgz",
+ "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6.13.0"
+ }
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.13",
+ "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.13.tgz",
+ "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ=="
+ },
+ "node_modules/normalize-package-data": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmmirror.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+ "dev": true,
+ "dependencies": {
+ "hosted-git-info": "^2.1.4",
+ "resolve": "^1.10.0",
+ "semver": "2 || 3 || 4 || 5",
+ "validate-npm-package-license": "^3.0.1"
+ }
+ },
+ "node_modules/normalize-package-data/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/normalize-range": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmmirror.com/normalize-range/-/normalize-range-0.1.2.tgz",
+ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/normalize-url": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmmirror.com/normalize-url/-/normalize-url-6.1.0.tgz",
+ "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/npm-run-path": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-2.0.2.tgz",
+ "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/nth-check": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz",
+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+ "dev": true,
+ "dependencies": {
+ "boolbase": "^1.0.0"
+ }
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.12.3",
+ "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.12.3.tgz",
+ "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==",
+ "dev": true
+ },
+ "node_modules/object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.assign": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmmirror.com/object.assign/-/object.assign-4.1.4.tgz",
+ "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "has-symbols": "^1.0.3",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/obuf": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/obuf/-/obuf-1.1.2.tgz",
+ "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
+ "dev": true
+ },
+ "node_modules/on-finished": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz",
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "dev": true,
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/on-headers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/on-headers/-/on-headers-1.0.2.tgz",
+ "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dev": true,
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
+ "dependencies": {
+ "mimic-fn": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/open": {
+ "version": "8.4.2",
+ "resolved": "https://registry.npmmirror.com/open/-/open-8.4.2.tgz",
+ "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==",
+ "dev": true,
+ "dependencies": {
+ "define-lazy-prop": "^2.0.0",
+ "is-docker": "^2.1.1",
+ "is-wsl": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/opener": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmmirror.com/opener/-/opener-1.5.2.tgz",
+ "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==",
+ "dev": true,
+ "bin": {
+ "opener": "bin/opener-bin.js"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.3",
+ "resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.9.3.tgz",
+ "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
+ "dev": true,
+ "dependencies": {
+ "@aashutoshrathi/word-wrap": "^1.2.3",
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/ora": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmmirror.com/ora/-/ora-5.4.1.tgz",
+ "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==",
+ "dev": true,
+ "dependencies": {
+ "bl": "^4.1.0",
+ "chalk": "^4.1.0",
+ "cli-cursor": "^3.1.0",
+ "cli-spinners": "^2.5.0",
+ "is-interactive": "^1.0.0",
+ "is-unicode-supported": "^0.1.0",
+ "log-symbols": "^4.1.0",
+ "strip-ansi": "^6.0.0",
+ "wcwidth": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/ora/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ora/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/ora/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/ora/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/ora/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ora/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/p-finally": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/p-finally/-/p-finally-1.0.0.tgz",
+ "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/p-retry": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmmirror.com/p-retry/-/p-retry-4.6.2.tgz",
+ "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/retry": "0.12.0",
+ "retry": "^0.13.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/param-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmmirror.com/param-case/-/param-case-3.0.4.tgz",
+ "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==",
+ "dev": true,
+ "dependencies": {
+ "dot-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parse-json": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmmirror.com/parse-json/-/parse-json-5.2.0.tgz",
+ "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "lines-and-columns": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/parse-node-version": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz",
+ "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/parse5": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmmirror.com/parse5/-/parse5-5.1.1.tgz",
+ "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==",
+ "dev": true
+ },
+ "node_modules/parse5-htmlparser2-tree-adapter": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmmirror.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz",
+ "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==",
+ "dev": true,
+ "dependencies": {
+ "parse5": "^6.0.1"
+ }
+ },
+ "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmmirror.com/parse5/-/parse5-6.0.1.tgz",
+ "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==",
+ "dev": true
+ },
+ "node_modules/parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/pascal-case": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmmirror.com/pascal-case/-/pascal-case-3.1.2.tgz",
+ "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==",
+ "dev": true,
+ "dependencies": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/path-key/-/path-key-2.0.1.tgz",
+ "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true
+ },
+ "node_modules/path-to-regexp": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+ "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==",
+ "dev": true
+ },
+ "node_modules/path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz",
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/pify": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+ "optional": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pkg-dir": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-4.2.0.tgz",
+ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "dev": true,
+ "dependencies": {
+ "find-up": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/popper.js": {
+ "version": "1.16.1",
+ "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz",
+ "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==",
+ "deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/popperjs"
+ }
+ },
+ "node_modules/portfinder": {
+ "version": "1.0.32",
+ "resolved": "https://registry.npmmirror.com/portfinder/-/portfinder-1.0.32.tgz",
+ "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==",
+ "dev": true,
+ "dependencies": {
+ "async": "^2.6.4",
+ "debug": "^3.2.7",
+ "mkdirp": "^0.5.6"
+ },
+ "engines": {
+ "node": ">= 0.12.0"
+ }
+ },
+ "node_modules/portfinder/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.4.30",
+ "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.30.tgz",
+ "integrity": "sha512-7ZEao1g4kd68l97aWG/etQKPKq07us0ieSZ2TnFDk11i0ZfDW2AwKHYU8qv4MZKqN2fdBfg+7q0ES06UA73C1g==",
+ "dependencies": {
+ "nanoid": "^3.3.6",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-calc": {
+ "version": "8.2.4",
+ "resolved": "https://registry.npmmirror.com/postcss-calc/-/postcss-calc-8.2.4.tgz",
+ "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==",
+ "dev": true,
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.9",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.2"
+ }
+ },
+ "node_modules/postcss-colormin": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmmirror.com/postcss-colormin/-/postcss-colormin-5.3.1.tgz",
+ "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==",
+ "dev": true,
+ "dependencies": {
+ "browserslist": "^4.21.4",
+ "caniuse-api": "^3.0.0",
+ "colord": "^2.9.1",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-convert-values": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmmirror.com/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz",
+ "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==",
+ "dev": true,
+ "dependencies": {
+ "browserslist": "^4.21.4",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-discard-comments": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmmirror.com/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz",
+ "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==",
+ "dev": true,
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-discard-duplicates": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmmirror.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz",
+ "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==",
+ "dev": true,
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-discard-empty": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmmirror.com/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz",
+ "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==",
+ "dev": true,
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-discard-overridden": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmmirror.com/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz",
+ "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==",
+ "dev": true,
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-loader": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmmirror.com/postcss-loader/-/postcss-loader-6.2.1.tgz",
+ "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==",
+ "dev": true,
+ "dependencies": {
+ "cosmiconfig": "^7.0.0",
+ "klona": "^2.0.5",
+ "semver": "^7.3.5"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "peerDependencies": {
+ "postcss": "^7.0.0 || ^8.0.1",
+ "webpack": "^5.0.0"
+ }
+ },
+ "node_modules/postcss-loader/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/postcss-loader/node_modules/semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/postcss-loader/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
+ "node_modules/postcss-merge-longhand": {
+ "version": "5.1.7",
+ "resolved": "https://registry.npmmirror.com/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz",
+ "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==",
+ "dev": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0",
+ "stylehacks": "^5.1.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-merge-rules": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmmirror.com/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz",
+ "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==",
+ "dev": true,
+ "dependencies": {
+ "browserslist": "^4.21.4",
+ "caniuse-api": "^3.0.0",
+ "cssnano-utils": "^3.1.0",
+ "postcss-selector-parser": "^6.0.5"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-minify-font-values": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmmirror.com/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz",
+ "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==",
+ "dev": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-minify-gradients": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmmirror.com/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz",
+ "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==",
+ "dev": true,
+ "dependencies": {
+ "colord": "^2.9.1",
+ "cssnano-utils": "^3.1.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-minify-params": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmmirror.com/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz",
+ "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==",
+ "dev": true,
+ "dependencies": {
+ "browserslist": "^4.21.4",
+ "cssnano-utils": "^3.1.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-minify-selectors": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmmirror.com/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz",
+ "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==",
+ "dev": true,
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.5"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-modules-extract-imports": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz",
+ "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==",
+ "dev": true,
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-modules-local-by-default": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmmirror.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz",
+ "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==",
+ "dev": true,
+ "dependencies": {
+ "icss-utils": "^5.0.0",
+ "postcss-selector-parser": "^6.0.2",
+ "postcss-value-parser": "^4.1.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-modules-scope": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz",
+ "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==",
+ "dev": true,
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.4"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-modules-values": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz",
+ "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==",
+ "dev": true,
+ "dependencies": {
+ "icss-utils": "^5.0.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-normalize-charset": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmmirror.com/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz",
+ "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==",
+ "dev": true,
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-normalize-display-values": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmmirror.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz",
+ "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==",
+ "dev": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-normalize-positions": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmmirror.com/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz",
+ "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==",
+ "dev": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-normalize-repeat-style": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmmirror.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz",
+ "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==",
+ "dev": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-normalize-string": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmmirror.com/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz",
+ "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==",
+ "dev": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-normalize-timing-functions": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmmirror.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz",
+ "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==",
+ "dev": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-normalize-unicode": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmmirror.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz",
+ "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==",
+ "dev": true,
+ "dependencies": {
+ "browserslist": "^4.21.4",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-normalize-url": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmmirror.com/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz",
+ "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==",
+ "dev": true,
+ "dependencies": {
+ "normalize-url": "^6.0.1",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-normalize-whitespace": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmmirror.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz",
+ "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==",
+ "dev": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-ordered-values": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmmirror.com/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz",
+ "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==",
+ "dev": true,
+ "dependencies": {
+ "cssnano-utils": "^3.1.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-reduce-initial": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmmirror.com/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz",
+ "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==",
+ "dev": true,
+ "dependencies": {
+ "browserslist": "^4.21.4",
+ "caniuse-api": "^3.0.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-reduce-transforms": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmmirror.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz",
+ "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==",
+ "dev": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-selector-parser": {
+ "version": "6.0.13",
+ "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz",
+ "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==",
+ "dev": true,
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-svgo": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmmirror.com/postcss-svgo/-/postcss-svgo-5.1.0.tgz",
+ "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==",
+ "dev": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0",
+ "svgo": "^2.7.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-unique-selectors": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmmirror.com/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz",
+ "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==",
+ "dev": true,
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.5"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+ "dev": true
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/prettier": {
+ "version": "2.8.8",
+ "resolved": "https://registry.npmmirror.com/prettier/-/prettier-2.8.8.tgz",
+ "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
+ "dev": true,
+ "optional": true,
+ "bin": {
+ "prettier": "bin-prettier.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/pretty-error": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/pretty-error/-/pretty-error-4.0.0.tgz",
+ "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==",
+ "dev": true,
+ "dependencies": {
+ "lodash": "^4.17.20",
+ "renderkid": "^3.0.0"
+ }
+ },
+ "node_modules/process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+ "dev": true
+ },
+ "node_modules/progress": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmmirror.com/progress/-/progress-2.0.3.tgz",
+ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/progress-webpack-plugin": {
+ "version": "1.0.16",
+ "resolved": "https://registry.npmmirror.com/progress-webpack-plugin/-/progress-webpack-plugin-1.0.16.tgz",
+ "integrity": "sha512-sdiHuuKOzELcBANHfrupYo+r99iPRyOnw15qX+rNlVUqXGfjXdH4IgxriKwG1kNJwVswKQHMdj1hYZMcb9jFaA==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.1.0",
+ "figures": "^2.0.0",
+ "log-update": "^2.3.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "peerDependencies": {
+ "webpack": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0"
+ }
+ },
+ "node_modules/proxy-addr": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmmirror.com/proxy-addr/-/proxy-addr-2.0.7.tgz",
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+ "dev": true,
+ "dependencies": {
+ "forwarded": "0.2.0",
+ "ipaddr.js": "1.9.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/proxy-addr/node_modules/ipaddr.js": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
+ },
+ "node_modules/prr": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
+ "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==",
+ "optional": true
+ },
+ "node_modules/pseudomap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/pseudomap/-/pseudomap-1.0.2.tgz",
+ "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==",
+ "dev": true
+ },
+ "node_modules/pump": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/pump/-/pump-3.0.0.tgz",
+ "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+ "dev": true,
+ "dependencies": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.0.tgz",
+ "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/qs": {
+ "version": "6.11.0",
+ "resolved": "https://registry.npmmirror.com/qs/-/qs-6.11.0.tgz",
+ "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
+ "dev": true,
+ "dependencies": {
+ "side-channel": "^1.0.4"
+ },
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true
+ },
+ "node_modules/randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "dependencies": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "node_modules/range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/raw-body": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmmirror.com/raw-body/-/raw-body-2.5.1.tgz",
+ "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
+ "dev": true,
+ "dependencies": {
+ "bytes": "3.1.2",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/raw-body/node_modules/bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmmirror.com/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/read-pkg": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmmirror.com/read-pkg/-/read-pkg-5.2.0.tgz",
+ "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
+ "dev": true,
+ "dependencies": {
+ "@types/normalize-package-data": "^2.4.0",
+ "normalize-package-data": "^2.5.0",
+ "parse-json": "^5.0.0",
+ "type-fest": "^0.6.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/read-pkg-up": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmmirror.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
+ "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
+ "dev": true,
+ "dependencies": {
+ "find-up": "^4.1.0",
+ "read-pkg": "^5.2.0",
+ "type-fest": "^0.8.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/read-pkg-up/node_modules/type-fest": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.8.1.tgz",
+ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/readable-stream": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/regenerate": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmmirror.com/regenerate/-/regenerate-1.4.2.tgz",
+ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
+ "dev": true
+ },
+ "node_modules/regenerate-unicode-properties": {
+ "version": "10.1.1",
+ "resolved": "https://registry.npmmirror.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz",
+ "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==",
+ "dev": true,
+ "dependencies": {
+ "regenerate": "^1.4.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/regenerator-runtime": {
+ "version": "0.14.0",
+ "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz",
+ "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==",
+ "dev": true
+ },
+ "node_modules/regenerator-transform": {
+ "version": "0.15.2",
+ "resolved": "https://registry.npmmirror.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz",
+ "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/runtime": "^7.8.4"
+ }
+ },
+ "node_modules/regexpp": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmmirror.com/regexpp/-/regexpp-3.2.0.tgz",
+ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/regexpu-core": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmmirror.com/regexpu-core/-/regexpu-core-5.3.2.tgz",
+ "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/regjsgen": "^0.8.0",
+ "regenerate": "^1.4.2",
+ "regenerate-unicode-properties": "^10.1.0",
+ "regjsparser": "^0.9.1",
+ "unicode-match-property-ecmascript": "^2.0.0",
+ "unicode-match-property-value-ecmascript": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/regjsparser": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmmirror.com/regjsparser/-/regjsparser-0.9.1.tgz",
+ "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==",
+ "dev": true,
+ "dependencies": {
+ "jsesc": "~0.5.0"
+ },
+ "bin": {
+ "regjsparser": "bin/parser"
+ }
+ },
+ "node_modules/regjsparser/node_modules/jsesc": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-0.5.0.tgz",
+ "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==",
+ "dev": true,
+ "bin": {
+ "jsesc": "bin/jsesc"
+ }
+ },
+ "node_modules/relateurl": {
+ "version": "0.2.7",
+ "resolved": "https://registry.npmmirror.com/relateurl/-/relateurl-0.2.7.tgz",
+ "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/renderkid": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/renderkid/-/renderkid-3.0.0.tgz",
+ "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==",
+ "dev": true,
+ "dependencies": {
+ "css-select": "^4.1.3",
+ "dom-converter": "^0.2.0",
+ "htmlparser2": "^6.1.0",
+ "lodash": "^4.17.21",
+ "strip-ansi": "^6.0.1"
+ }
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/requires-port": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/requires-port/-/requires-port-1.0.0.tgz",
+ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
+ "dev": true
+ },
+ "node_modules/resolve": {
+ "version": "1.22.6",
+ "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.6.tgz",
+ "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==",
+ "dev": true,
+ "dependencies": {
+ "is-core-module": "^2.13.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/restore-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-3.1.0.tgz",
+ "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
+ "dev": true,
+ "dependencies": {
+ "onetime": "^5.1.0",
+ "signal-exit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/retry": {
+ "version": "0.13.1",
+ "resolved": "https://registry.npmmirror.com/retry/-/retry-0.13.1.tgz",
+ "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "dev": true,
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "devOptional": true
+ },
+ "node_modules/sass": {
+ "version": "1.68.0",
+ "resolved": "https://registry.npmmirror.com/sass/-/sass-1.68.0.tgz",
+ "integrity": "sha512-Lmj9lM/fef0nQswm1J2HJcEsBUba4wgNx2fea6yJHODREoMFnwRpZydBnX/RjyXw2REIwdkbqE4hrTo4qfDBUA==",
+ "dev": true,
+ "dependencies": {
+ "chokidar": ">=3.0.0 <4.0.0",
+ "immutable": "^4.0.0",
+ "source-map-js": ">=0.6.2 <2.0.0"
+ },
+ "bin": {
+ "sass": "sass.js"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/sass-loader": {
+ "version": "12.6.0",
+ "resolved": "https://registry.npmmirror.com/sass-loader/-/sass-loader-12.6.0.tgz",
+ "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==",
+ "dev": true,
+ "dependencies": {
+ "klona": "^2.0.4",
+ "neo-async": "^2.6.2"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "peerDependencies": {
+ "fibers": ">= 3.1.0",
+ "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0",
+ "sass": "^1.3.0",
+ "sass-embedded": "*",
+ "webpack": "^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "fibers": {
+ "optional": true
+ },
+ "node-sass": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/sax": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz",
+ "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==",
+ "optional": true
+ },
+ "node_modules/schema-utils": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-2.7.1.tgz",
+ "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==",
+ "dev": true,
+ "dependencies": {
+ "@types/json-schema": "^7.0.5",
+ "ajv": "^6.12.4",
+ "ajv-keywords": "^3.5.2"
+ },
+ "engines": {
+ "node": ">= 8.9.0"
+ }
+ },
+ "node_modules/select-hose": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/select-hose/-/select-hose-2.0.0.tgz",
+ "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==",
+ "dev": true
+ },
+ "node_modules/selfsigned": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/selfsigned/-/selfsigned-2.1.1.tgz",
+ "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==",
+ "dev": true,
+ "dependencies": {
+ "node-forge": "^1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/send": {
+ "version": "0.18.0",
+ "resolved": "https://registry.npmmirror.com/send/-/send-0.18.0.tgz",
+ "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
+ "dev": true,
+ "dependencies": {
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "2.0.0",
+ "mime": "1.6.0",
+ "ms": "2.1.3",
+ "on-finished": "2.4.1",
+ "range-parser": "~1.2.1",
+ "statuses": "2.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/send/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/send/node_modules/debug/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true
+ },
+ "node_modules/send/node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true
+ },
+ "node_modules/serialize-javascript": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz",
+ "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "node_modules/serve-index": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmmirror.com/serve-index/-/serve-index-1.9.1.tgz",
+ "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==",
+ "dev": true,
+ "dependencies": {
+ "accepts": "~1.3.4",
+ "batch": "0.6.1",
+ "debug": "2.6.9",
+ "escape-html": "~1.0.3",
+ "http-errors": "~1.6.2",
+ "mime-types": "~2.1.17",
+ "parseurl": "~1.3.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/serve-index/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/serve-index/node_modules/depd": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/depd/-/depd-1.1.2.tgz",
+ "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/serve-index/node_modules/http-errors": {
+ "version": "1.6.3",
+ "resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-1.6.3.tgz",
+ "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==",
+ "dev": true,
+ "dependencies": {
+ "depd": "~1.1.2",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.1.0",
+ "statuses": ">= 1.4.0 < 2"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/serve-index/node_modules/inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==",
+ "dev": true
+ },
+ "node_modules/serve-index/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true
+ },
+ "node_modules/serve-index/node_modules/setprototypeof": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.1.0.tgz",
+ "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
+ "dev": true
+ },
+ "node_modules/serve-index/node_modules/statuses": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmmirror.com/statuses/-/statuses-1.5.0.tgz",
+ "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/serve-static": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmmirror.com/serve-static/-/serve-static-1.15.0.tgz",
+ "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
+ "dev": true,
+ "dependencies": {
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.3",
+ "send": "0.18.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/setprototypeof": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
+ "dev": true
+ },
+ "node_modules/shallow-clone": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/shallow-clone/-/shallow-clone-3.0.1.tgz",
+ "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
+ "dev": true,
+ "dependencies": {
+ "kind-of": "^6.0.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-1.2.0.tgz",
+ "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-1.0.0.tgz",
+ "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/shell-quote": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmmirror.com/shell-quote/-/shell-quote-1.8.1.tgz",
+ "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==",
+ "dev": true
+ },
+ "node_modules/side-channel": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.4.tgz",
+ "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.0",
+ "get-intrinsic": "^1.0.2",
+ "object-inspect": "^1.9.0"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true
+ },
+ "node_modules/sirv": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmmirror.com/sirv/-/sirv-2.0.3.tgz",
+ "integrity": "sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==",
+ "dev": true,
+ "dependencies": {
+ "@polka/url": "^1.0.0-next.20",
+ "mrmime": "^1.0.0",
+ "totalist": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/slice-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-4.0.0.tgz",
+ "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/slice-ansi/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/slice-ansi/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/slice-ansi/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/sockjs": {
+ "version": "0.3.24",
+ "resolved": "https://registry.npmmirror.com/sockjs/-/sockjs-0.3.24.tgz",
+ "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==",
+ "dev": true,
+ "dependencies": {
+ "faye-websocket": "^0.11.3",
+ "uuid": "^8.3.2",
+ "websocket-driver": "^0.7.4"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz",
+ "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/spdx-correct": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmmirror.com/spdx-correct/-/spdx-correct-3.2.0.tgz",
+ "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==",
+ "dev": true,
+ "dependencies": {
+ "spdx-expression-parse": "^3.0.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/spdx-exceptions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmmirror.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
+ "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
+ "dev": true
+ },
+ "node_modules/spdx-expression-parse": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+ "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+ "dev": true,
+ "dependencies": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/spdx-license-ids": {
+ "version": "3.0.15",
+ "resolved": "https://registry.npmmirror.com/spdx-license-ids/-/spdx-license-ids-3.0.15.tgz",
+ "integrity": "sha512-lpT8hSQp9jAKp9mhtBU4Xjon8LPGBvLIuBiSVhMEtmLecTh2mO0tlqrAMp47tBXzMr13NJMQ2lf7RpQGLJ3HsQ==",
+ "dev": true
+ },
+ "node_modules/spdy": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmmirror.com/spdy/-/spdy-4.0.2.tgz",
+ "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.1.0",
+ "handle-thing": "^2.0.0",
+ "http-deceiver": "^1.2.7",
+ "select-hose": "^2.0.0",
+ "spdy-transport": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/spdy-transport": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/spdy-transport/-/spdy-transport-3.0.0.tgz",
+ "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.1.0",
+ "detect-node": "^2.0.4",
+ "hpack.js": "^2.1.6",
+ "obuf": "^1.1.2",
+ "readable-stream": "^3.0.6",
+ "wbuf": "^1.7.3"
+ }
+ },
+ "node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
+ "dev": true
+ },
+ "node_modules/ssri": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmmirror.com/ssri/-/ssri-8.0.1.tgz",
+ "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==",
+ "dev": true,
+ "dependencies": {
+ "minipass": "^3.1.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/stable": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmmirror.com/stable/-/stable-0.1.8.tgz",
+ "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
+ "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility",
+ "dev": true
+ },
+ "node_modules/stackframe": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmmirror.com/stackframe/-/stackframe-1.3.4.tgz",
+ "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==",
+ "dev": true
+ },
+ "node_modules/statuses": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/statuses/-/statuses-2.0.1.tgz",
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-eof": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/strip-eof/-/strip-eof-1.0.0.tgz",
+ "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/stylehacks": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmmirror.com/stylehacks/-/stylehacks-5.1.1.tgz",
+ "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==",
+ "dev": true,
+ "dependencies": {
+ "browserslist": "^4.21.4",
+ "postcss-selector-parser": "^6.0.4"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/svg-tags": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/svg-tags/-/svg-tags-1.0.0.tgz",
+ "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==",
+ "dev": true
+ },
+ "node_modules/svgo": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmmirror.com/svgo/-/svgo-2.8.0.tgz",
+ "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==",
+ "dev": true,
+ "dependencies": {
+ "@trysound/sax": "0.2.0",
+ "commander": "^7.2.0",
+ "css-select": "^4.1.3",
+ "css-tree": "^1.1.3",
+ "csso": "^4.2.0",
+ "picocolors": "^1.0.0",
+ "stable": "^0.1.8"
+ },
+ "bin": {
+ "svgo": "bin/svgo"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/svgo/node_modules/commander": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmmirror.com/commander/-/commander-7.2.0.tgz",
+ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/table": {
+ "version": "6.8.1",
+ "resolved": "https://registry.npmmirror.com/table/-/table-6.8.1.tgz",
+ "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^8.0.1",
+ "lodash.truncate": "^4.4.2",
+ "slice-ansi": "^4.0.0",
+ "string-width": "^4.2.3",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/table/node_modules/ajv": {
+ "version": "8.12.0",
+ "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.12.0.tgz",
+ "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "node_modules/table/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true
+ },
+ "node_modules/tapable": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmmirror.com/tapable/-/tapable-2.2.1.tgz",
+ "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/terser": {
+ "version": "5.20.0",
+ "resolved": "https://registry.npmmirror.com/terser/-/terser-5.20.0.tgz",
+ "integrity": "sha512-e56ETryaQDyebBwJIWYB2TT6f2EZ0fL0sW/JRXNMN26zZdKi2u/E/5my5lG6jNxym6qsrVXfFRmOdV42zlAgLQ==",
+ "dependencies": {
+ "@jridgewell/source-map": "^0.3.3",
+ "acorn": "^8.8.2",
+ "commander": "^2.20.0",
+ "source-map-support": "~0.5.20"
+ },
+ "bin": {
+ "terser": "bin/terser"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/terser-webpack-plugin": {
+ "version": "5.3.9",
+ "resolved": "https://registry.npmmirror.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz",
+ "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==",
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.17",
+ "jest-worker": "^27.4.5",
+ "schema-utils": "^3.1.1",
+ "serialize-javascript": "^6.0.1",
+ "terser": "^5.16.8"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "peerDependencies": {
+ "webpack": "^5.1.0"
+ },
+ "peerDependenciesMeta": {
+ "@swc/core": {
+ "optional": true
+ },
+ "esbuild": {
+ "optional": true
+ },
+ "uglify-js": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/terser-webpack-plugin/node_modules/schema-utils": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-3.3.0.tgz",
+ "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+ "dependencies": {
+ "@types/json-schema": "^7.0.8",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ }
+ },
+ "node_modules/terser/node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
+ },
+ "node_modules/text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+ "dev": true
+ },
+ "node_modules/thenify": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmmirror.com/thenify/-/thenify-3.3.1.tgz",
+ "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
+ "dev": true,
+ "dependencies": {
+ "any-promise": "^1.0.0"
+ }
+ },
+ "node_modules/thenify-all": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmmirror.com/thenify-all/-/thenify-all-1.6.0.tgz",
+ "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
+ "dev": true,
+ "dependencies": {
+ "thenify": ">= 3.1.0 < 4"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/thread-loader": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmmirror.com/thread-loader/-/thread-loader-3.0.4.tgz",
+ "integrity": "sha512-ByaL2TPb+m6yArpqQUZvP+5S1mZtXsEP7nWKKlAUTm7fCml8kB5s1uI3+eHRP2bk5mVYfRSBI7FFf+tWEyLZwA==",
+ "dev": true,
+ "dependencies": {
+ "json-parse-better-errors": "^1.0.2",
+ "loader-runner": "^4.1.0",
+ "loader-utils": "^2.0.0",
+ "neo-async": "^2.6.2",
+ "schema-utils": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "peerDependencies": {
+ "webpack": "^4.27.0 || ^5.0.0"
+ }
+ },
+ "node_modules/thread-loader/node_modules/loader-utils": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz",
+ "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
+ "dev": true,
+ "dependencies": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^2.1.2"
+ },
+ "engines": {
+ "node": ">=8.9.0"
+ }
+ },
+ "node_modules/thread-loader/node_modules/schema-utils": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-3.3.0.tgz",
+ "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+ "dev": true,
+ "dependencies": {
+ "@types/json-schema": "^7.0.8",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ }
+ },
+ "node_modules/thunky": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/thunky/-/thunky-1.1.0.tgz",
+ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==",
+ "dev": true
+ },
+ "node_modules/to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/toidentifier": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.1.tgz",
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/totalist": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/totalist/-/totalist-3.0.1.tgz",
+ "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/tr46": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmmirror.com/tr46/-/tr46-0.0.3.tgz",
+ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
+ "dev": true
+ },
+ "node_modules/tslib": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.6.2.tgz",
+ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.6.0.tgz",
+ "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/type-is": {
+ "version": "1.6.18",
+ "resolved": "https://registry.npmmirror.com/type-is/-/type-is-1.6.18.tgz",
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+ "dev": true,
+ "dependencies": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/unicode-canonical-property-names-ecmascript": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
+ "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-ecmascript": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
+ "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
+ "dev": true,
+ "dependencies": {
+ "unicode-canonical-property-names-ecmascript": "^2.0.0",
+ "unicode-property-aliases-ecmascript": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-value-ecmascript": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz",
+ "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-property-aliases-ecmascript": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz",
+ "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/universalify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.0.tgz",
+ "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.0.13",
+ "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
+ "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
+ "dependencies": {
+ "escalade": "^3.1.1",
+ "picocolors": "^1.0.0"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "dev": true
+ },
+ "node_modules/utila": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmmirror.com/utila/-/utila-0.4.0.tgz",
+ "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==",
+ "dev": true
+ },
+ "node_modules/utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "dev": true,
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/v8-compile-cache": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmmirror.com/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz",
+ "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==",
+ "dev": true
+ },
+ "node_modules/validate-npm-package-license": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmmirror.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+ "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+ "dev": true,
+ "dependencies": {
+ "spdx-correct": "^3.0.0",
+ "spdx-expression-parse": "^3.0.0"
+ }
+ },
+ "node_modules/vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/vue": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmmirror.com/vue/-/vue-3.3.4.tgz",
+ "integrity": "sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==",
+ "dependencies": {
+ "@vue/compiler-dom": "3.3.4",
+ "@vue/compiler-sfc": "3.3.4",
+ "@vue/runtime-dom": "3.3.4",
+ "@vue/server-renderer": "3.3.4",
+ "@vue/shared": "3.3.4"
+ }
+ },
+ "node_modules/vue-eslint-parser": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmmirror.com/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz",
+ "integrity": "sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.3.2",
+ "eslint-scope": "^7.0.0",
+ "eslint-visitor-keys": "^3.1.0",
+ "espree": "^9.0.0",
+ "esquery": "^1.4.0",
+ "lodash": "^4.17.21",
+ "semver": "^7.3.5"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "eslint": ">=6.0.0"
+ }
+ },
+ "node_modules/vue-eslint-parser/node_modules/eslint-scope": {
+ "version": "7.2.2",
+ "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.2.2.tgz",
+ "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/vue-eslint-parser/node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/vue-eslint-parser/node_modules/espree": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmmirror.com/espree/-/espree-9.6.1.tgz",
+ "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.9.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/vue-eslint-parser/node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/vue-eslint-parser/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/vue-eslint-parser/node_modules/semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/vue-eslint-parser/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
+ "node_modules/vue-hot-reload-api": {
+ "version": "2.3.4",
+ "resolved": "https://registry.npmmirror.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz",
+ "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==",
+ "dev": true
+ },
+ "node_modules/vue-loader": {
+ "version": "17.2.2",
+ "resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-17.2.2.tgz",
+ "integrity": "sha512-aqNvKJvnz2A/6VWeJZodAo8XLoAlVwBv+2Z6dama+LHsAF+P/xijQ+OfWrxIs0wcGSJduvdzvTuATzXbNKkpiw==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^4.1.0",
+ "hash-sum": "^2.0.0",
+ "watchpack": "^2.4.0"
+ },
+ "peerDependencies": {
+ "webpack": "^4.1.0 || ^5.0.0-0"
+ },
+ "peerDependenciesMeta": {
+ "@vue/compiler-sfc": {
+ "optional": true
+ },
+ "vue": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vue-loader/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/vue-loader/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/vue-loader/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/vue-loader/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/vue-loader/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/vue-loader/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/vue-router": {
+ "version": "4.2.5",
+ "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.2.5.tgz",
+ "integrity": "sha512-DIUpKcyg4+PTQKfFPX88UWhlagBEBEfJ5A8XDXRJLUnZOvcpMF8o/dnL90vpVkGaPbjvXazV/rC1qBKrZlFugw==",
+ "dependencies": {
+ "@vue/devtools-api": "^6.5.0"
+ },
+ "peerDependencies": {
+ "vue": "^3.2.0"
+ }
+ },
+ "node_modules/vue-style-loader": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmmirror.com/vue-style-loader/-/vue-style-loader-4.1.3.tgz",
+ "integrity": "sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg==",
+ "dev": true,
+ "dependencies": {
+ "hash-sum": "^1.0.2",
+ "loader-utils": "^1.0.2"
+ }
+ },
+ "node_modules/vue-style-loader/node_modules/hash-sum": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/hash-sum/-/hash-sum-1.0.2.tgz",
+ "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==",
+ "dev": true
+ },
+ "node_modules/vue-template-es2015-compiler": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmmirror.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz",
+ "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==",
+ "dev": true
+ },
+ "node_modules/vuex": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmmirror.com/vuex/-/vuex-4.1.0.tgz",
+ "integrity": "sha512-hmV6UerDrPcgbSy9ORAtNXDr9M4wlNP4pEFKye4ujJF8oqgFFuxDCdOLS3eNoRTtq5O3hoBDh9Doj1bQMYHRbQ==",
+ "dependencies": {
+ "@vue/devtools-api": "^6.0.0-beta.11"
+ },
+ "peerDependencies": {
+ "vue": "^3.2.0"
+ }
+ },
+ "node_modules/watchpack": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmmirror.com/watchpack/-/watchpack-2.4.0.tgz",
+ "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==",
+ "dependencies": {
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.1.2"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/wbuf": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmmirror.com/wbuf/-/wbuf-1.7.3.tgz",
+ "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
+ "dev": true,
+ "dependencies": {
+ "minimalistic-assert": "^1.0.0"
+ }
+ },
+ "node_modules/wcwidth": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/wcwidth/-/wcwidth-1.0.1.tgz",
+ "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==",
+ "dev": true,
+ "dependencies": {
+ "defaults": "^1.0.3"
+ }
+ },
+ "node_modules/webidl-conversions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
+ "dev": true
+ },
+ "node_modules/webpack": {
+ "version": "5.88.2",
+ "resolved": "https://registry.npmmirror.com/webpack/-/webpack-5.88.2.tgz",
+ "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==",
+ "dependencies": {
+ "@types/eslint-scope": "^3.7.3",
+ "@types/estree": "^1.0.0",
+ "@webassemblyjs/ast": "^1.11.5",
+ "@webassemblyjs/wasm-edit": "^1.11.5",
+ "@webassemblyjs/wasm-parser": "^1.11.5",
+ "acorn": "^8.7.1",
+ "acorn-import-assertions": "^1.9.0",
+ "browserslist": "^4.14.5",
+ "chrome-trace-event": "^1.0.2",
+ "enhanced-resolve": "^5.15.0",
+ "es-module-lexer": "^1.2.1",
+ "eslint-scope": "5.1.1",
+ "events": "^3.2.0",
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.2.9",
+ "json-parse-even-better-errors": "^2.3.1",
+ "loader-runner": "^4.2.0",
+ "mime-types": "^2.1.27",
+ "neo-async": "^2.6.2",
+ "schema-utils": "^3.2.0",
+ "tapable": "^2.1.1",
+ "terser-webpack-plugin": "^5.3.7",
+ "watchpack": "^2.4.0",
+ "webpack-sources": "^3.2.3"
+ },
+ "bin": {
+ "webpack": "bin/webpack.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "peerDependenciesMeta": {
+ "webpack-cli": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack-bundle-analyzer": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.9.1.tgz",
+ "integrity": "sha512-jnd6EoYrf9yMxCyYDPj8eutJvtjQNp8PHmni/e/ulydHBWhT5J3menXt3HEkScsu9YqMAcG4CfFjs3rj5pVU1w==",
+ "dev": true,
+ "dependencies": {
+ "@discoveryjs/json-ext": "0.5.7",
+ "acorn": "^8.0.4",
+ "acorn-walk": "^8.0.0",
+ "commander": "^7.2.0",
+ "escape-string-regexp": "^4.0.0",
+ "gzip-size": "^6.0.0",
+ "is-plain-object": "^5.0.0",
+ "lodash.debounce": "^4.0.8",
+ "lodash.escape": "^4.0.1",
+ "lodash.flatten": "^4.4.0",
+ "lodash.invokemap": "^4.6.0",
+ "lodash.pullall": "^4.2.0",
+ "lodash.uniqby": "^4.7.0",
+ "opener": "^1.5.2",
+ "picocolors": "^1.0.0",
+ "sirv": "^2.0.3",
+ "ws": "^7.3.1"
+ },
+ "bin": {
+ "webpack-bundle-analyzer": "lib/bin/analyzer.js"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ }
+ },
+ "node_modules/webpack-bundle-analyzer/node_modules/commander": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmmirror.com/commander/-/commander-7.2.0.tgz",
+ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/webpack-bundle-analyzer/node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/webpack-chain": {
+ "version": "6.5.1",
+ "resolved": "https://registry.npmmirror.com/webpack-chain/-/webpack-chain-6.5.1.tgz",
+ "integrity": "sha512-7doO/SRtLu8q5WM0s7vPKPWX580qhi0/yBHkOxNkv50f6qB76Zy9o2wRTrrPULqYTvQlVHuvbA8v+G5ayuUDsA==",
+ "dev": true,
+ "dependencies": {
+ "deepmerge": "^1.5.2",
+ "javascript-stringify": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/webpack-dev-middleware": {
+ "version": "5.3.3",
+ "resolved": "https://registry.npmmirror.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz",
+ "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==",
+ "dev": true,
+ "dependencies": {
+ "colorette": "^2.0.10",
+ "memfs": "^3.4.3",
+ "mime-types": "^2.1.31",
+ "range-parser": "^1.2.1",
+ "schema-utils": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "peerDependencies": {
+ "webpack": "^4.0.0 || ^5.0.0"
+ }
+ },
+ "node_modules/webpack-dev-middleware/node_modules/ajv": {
+ "version": "8.12.0",
+ "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.12.0.tgz",
+ "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+ "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3"
+ },
+ "peerDependencies": {
+ "ajv": "^8.8.2"
+ }
+ },
+ "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true
+ },
+ "node_modules/webpack-dev-middleware/node_modules/schema-utils": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-4.2.0.tgz",
+ "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==",
+ "dev": true,
+ "dependencies": {
+ "@types/json-schema": "^7.0.9",
+ "ajv": "^8.9.0",
+ "ajv-formats": "^2.1.1",
+ "ajv-keywords": "^5.1.0"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ }
+ },
+ "node_modules/webpack-dev-server": {
+ "version": "4.15.1",
+ "resolved": "https://registry.npmmirror.com/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz",
+ "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==",
+ "dev": true,
+ "dependencies": {
+ "@types/bonjour": "^3.5.9",
+ "@types/connect-history-api-fallback": "^1.3.5",
+ "@types/express": "^4.17.13",
+ "@types/serve-index": "^1.9.1",
+ "@types/serve-static": "^1.13.10",
+ "@types/sockjs": "^0.3.33",
+ "@types/ws": "^8.5.5",
+ "ansi-html-community": "^0.0.8",
+ "bonjour-service": "^1.0.11",
+ "chokidar": "^3.5.3",
+ "colorette": "^2.0.10",
+ "compression": "^1.7.4",
+ "connect-history-api-fallback": "^2.0.0",
+ "default-gateway": "^6.0.3",
+ "express": "^4.17.3",
+ "graceful-fs": "^4.2.6",
+ "html-entities": "^2.3.2",
+ "http-proxy-middleware": "^2.0.3",
+ "ipaddr.js": "^2.0.1",
+ "launch-editor": "^2.6.0",
+ "open": "^8.0.9",
+ "p-retry": "^4.5.0",
+ "rimraf": "^3.0.2",
+ "schema-utils": "^4.0.0",
+ "selfsigned": "^2.1.1",
+ "serve-index": "^1.9.1",
+ "sockjs": "^0.3.24",
+ "spdy": "^4.0.2",
+ "webpack-dev-middleware": "^5.3.1",
+ "ws": "^8.13.0"
+ },
+ "bin": {
+ "webpack-dev-server": "bin/webpack-dev-server.js"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "peerDependencies": {
+ "webpack": "^4.37.0 || ^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "webpack": {
+ "optional": true
+ },
+ "webpack-cli": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack-dev-server/node_modules/ajv": {
+ "version": "8.12.0",
+ "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.12.0.tgz",
+ "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "node_modules/webpack-dev-server/node_modules/ajv-keywords": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+ "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3"
+ },
+ "peerDependencies": {
+ "ajv": "^8.8.2"
+ }
+ },
+ "node_modules/webpack-dev-server/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true
+ },
+ "node_modules/webpack-dev-server/node_modules/schema-utils": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-4.2.0.tgz",
+ "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==",
+ "dev": true,
+ "dependencies": {
+ "@types/json-schema": "^7.0.9",
+ "ajv": "^8.9.0",
+ "ajv-formats": "^2.1.1",
+ "ajv-keywords": "^5.1.0"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ }
+ },
+ "node_modules/webpack-dev-server/node_modules/ws": {
+ "version": "8.14.2",
+ "resolved": "https://registry.npmmirror.com/ws/-/ws-8.14.2.tgz",
+ "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack-merge": {
+ "version": "5.9.0",
+ "resolved": "https://registry.npmmirror.com/webpack-merge/-/webpack-merge-5.9.0.tgz",
+ "integrity": "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==",
+ "dev": true,
+ "dependencies": {
+ "clone-deep": "^4.0.1",
+ "wildcard": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/webpack-sources": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-3.2.3.tgz",
+ "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/webpack-virtual-modules": {
+ "version": "0.4.6",
+ "resolved": "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.4.6.tgz",
+ "integrity": "sha512-5tyDlKLqPfMqjT3Q9TAqf2YqjwmnUleZwzJi1A5qXnlBCdj2AtOJ6wAWdglTIDOPgOiOrXeBeFcsQ8+aGQ6QbA==",
+ "dev": true
+ },
+ "node_modules/webpack/node_modules/schema-utils": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-3.3.0.tgz",
+ "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+ "dependencies": {
+ "@types/json-schema": "^7.0.8",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ }
+ },
+ "node_modules/websocket-driver": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmmirror.com/websocket-driver/-/websocket-driver-0.7.4.tgz",
+ "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
+ "dev": true,
+ "dependencies": {
+ "http-parser-js": ">=0.5.1",
+ "safe-buffer": ">=5.1.0",
+ "websocket-extensions": ">=0.1.1"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/websocket-extensions": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmmirror.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
+ "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/whatwg-fetch": {
+ "version": "3.6.19",
+ "resolved": "https://registry.npmmirror.com/whatwg-fetch/-/whatwg-fetch-3.6.19.tgz",
+ "integrity": "sha512-d67JP4dHSbm2TrpFj8AbO8DnL1JXL5J9u0Kq2xW6d0TFDbCA3Muhdt8orXC22utleTVj7Prqt82baN6RBvnEgw==",
+ "dev": true
+ },
+ "node_modules/whatwg-url": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-5.0.0.tgz",
+ "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+ "dev": true,
+ "dependencies": {
+ "tr46": "~0.0.3",
+ "webidl-conversions": "^3.0.0"
+ }
+ },
+ "node_modules/which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmmirror.com/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "which": "bin/which"
+ }
+ },
+ "node_modules/wildcard": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/wildcard/-/wildcard-2.0.1.tgz",
+ "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==",
+ "dev": true
+ },
+ "node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "dev": true
+ },
+ "node_modules/ws": {
+ "version": "7.5.9",
+ "resolved": "https://registry.npmmirror.com/ws/-/ws-7.5.9.tgz",
+ "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.3.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": "^5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dev": true
+ },
+ "node_modules/yaml": {
+ "version": "1.10.2",
+ "resolved": "https://registry.npmmirror.com/yaml/-/yaml-1.10.2.tgz",
+ "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/yargs": {
+ "version": "16.2.0",
+ "resolved": "https://registry.npmmirror.com/yargs/-/yargs-16.2.0.tgz",
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "dev": true,
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yorkie": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/yorkie/-/yorkie-2.0.0.tgz",
+ "integrity": "sha512-jcKpkthap6x63MB4TxwCyuIGkV0oYP/YRyuQU5UO0Yz/E/ZAu+653/uov+phdmO54n6BcvFRyyt0RRrWdN2mpw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "dependencies": {
+ "execa": "^0.8.0",
+ "is-ci": "^1.0.10",
+ "normalize-path": "^1.0.0",
+ "strip-indent": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/yorkie/node_modules/cross-spawn": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-5.1.0.tgz",
+ "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^4.0.1",
+ "shebang-command": "^1.2.0",
+ "which": "^1.2.9"
+ }
+ },
+ "node_modules/yorkie/node_modules/execa": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmmirror.com/execa/-/execa-0.8.0.tgz",
+ "integrity": "sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^5.0.1",
+ "get-stream": "^3.0.0",
+ "is-stream": "^1.1.0",
+ "npm-run-path": "^2.0.0",
+ "p-finally": "^1.0.0",
+ "signal-exit": "^3.0.0",
+ "strip-eof": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/yorkie/node_modules/get-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-3.0.0.tgz",
+ "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/yorkie/node_modules/lru-cache": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-4.1.5.tgz",
+ "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
+ "dev": true,
+ "dependencies": {
+ "pseudomap": "^1.0.2",
+ "yallist": "^2.1.2"
+ }
+ },
+ "node_modules/yorkie/node_modules/normalize-path": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-1.0.0.tgz",
+ "integrity": "sha512-7WyT0w8jhpDStXRq5836AMmihQwq2nrUVQrgjvUo/p/NZf9uy/MeJ246lBJVmWuYXMlJuG9BNZHF0hWjfTbQUA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/yorkie/node_modules/yallist": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmmirror.com/yallist/-/yallist-2.1.2.tgz",
+ "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==",
+ "dev": true
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..b0bb6e9
--- /dev/null
+++ b/package.json
@@ -0,0 +1,41 @@
+{
+ "name": "yinmeng-admin-web",
+ "version": "0.1.0",
+ "private": true,
+ "scripts": {
+ "dev": "vue-cli-service serve --mode development --report",
+ "build": "vue-cli-service build --mode production",
+ "lint": "vue-cli-service lint"
+ },
+ "dependencies": {
+ "admin-lte": "^2.3.2",
+ "axios": "^1.5.1",
+ "bootstrap": "^3.3.5",
+ "core-js": "^3.8.3",
+ "font-awesome": "^4.6.3",
+ "ionicons": "^2.0.1",
+ "jquery": "^2.2.0",
+ "jquery.md5": "^1.0.0",
+ "knockout": "^3.5.1",
+ "less": "^4.2.0",
+ "less-loader": "^11.1.3",
+ "popper.js": "^1.16.1",
+ "vue": "^3.2.13",
+ "vue-router": "^4.0.3",
+ "vuex": "^4.0.0"
+ },
+ "devDependencies": {
+ "@babel/core": "^7.12.16",
+ "@babel/eslint-parser": "^7.12.16",
+ "@vue/cli-plugin-babel": "~5.0.0",
+ "@vue/cli-plugin-eslint": "~5.0.0",
+ "@vue/cli-plugin-router": "~5.0.0",
+ "@vue/cli-plugin-vuex": "~5.0.0",
+ "@vue/cli-service": "~5.0.0",
+ "eslint": "^7.32.0",
+ "eslint-plugin-vue": "^8.0.3",
+ "sass": "^1.32.7",
+ "sass-loader": "^12.0.0",
+ "webpack-bundle-analyzer": "^4.9.1"
+ }
+}
diff --git a/public/favicon.ico b/public/favicon.ico
new file mode 100644
index 0000000..3b21872
Binary files /dev/null and b/public/favicon.ico differ
diff --git a/public/index.html b/public/index.html
new file mode 100644
index 0000000..ff2931f
--- /dev/null
+++ b/public/index.html
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ <%= htmlWebpackPlugin.options.title %>
+
+
+
+
+
+ We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled.
+ Please enable it to continue.
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/App.vue b/src/App.vue
new file mode 100644
index 0000000..2002d0c
--- /dev/null
+++ b/src/App.vue
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
diff --git a/src/api/common/menu.js b/src/api/common/menu.js
new file mode 100644
index 0000000..ca1f913
--- /dev/null
+++ b/src/api/common/menu.js
@@ -0,0 +1,8 @@
+import request from "@/utils/request";
+
+export function getMenuAll() {
+ return request({
+ url: '/admin/menu/getall',
+ method: 'get'
+ });
+}
\ No newline at end of file
diff --git a/src/api/common/user.js b/src/api/common/user.js
new file mode 100644
index 0000000..05f3989
--- /dev/null
+++ b/src/api/common/user.js
@@ -0,0 +1,15 @@
+import request from "@/utils/request";
+
+export function getUser(adminId) {
+ return request({
+ url: '/admin/user/getone?uid=' + adminId,
+ method: 'get'
+ });
+}
+
+export function logout() {
+ return request({
+ url: '/login/logout',
+ method: 'get'
+ });
+}
\ No newline at end of file
diff --git a/src/api/system/sysconf.js b/src/api/system/sysconf.js
new file mode 100644
index 0000000..16d2874
--- /dev/null
+++ b/src/api/system/sysconf.js
@@ -0,0 +1,8 @@
+import request from "@/utils/request";
+
+export function getSysConfList() {
+ return request({
+ url: '/admin/sysConf/getList',
+ method: 'get'
+ });
+}
\ No newline at end of file
diff --git a/src/assets/images/backgrounds/Thumbs.db b/src/assets/images/backgrounds/Thumbs.db
new file mode 100644
index 0000000..c5d8e52
Binary files /dev/null and b/src/assets/images/backgrounds/Thumbs.db differ
diff --git a/src/assets/images/backgrounds/b1.jpg b/src/assets/images/backgrounds/b1.jpg
new file mode 100644
index 0000000..b6503ac
Binary files /dev/null and b/src/assets/images/backgrounds/b1.jpg differ
diff --git a/src/assets/images/backgrounds/b2.jpg b/src/assets/images/backgrounds/b2.jpg
new file mode 100644
index 0000000..1627cbf
Binary files /dev/null and b/src/assets/images/backgrounds/b2.jpg differ
diff --git a/src/assets/images/backgrounds/b3.jpg b/src/assets/images/backgrounds/b3.jpg
new file mode 100644
index 0000000..567cd7e
Binary files /dev/null and b/src/assets/images/backgrounds/b3.jpg differ
diff --git a/src/assets/images/backgrounds/b4.jpg b/src/assets/images/backgrounds/b4.jpg
new file mode 100644
index 0000000..a83b892
Binary files /dev/null and b/src/assets/images/backgrounds/b4.jpg differ
diff --git a/src/assets/images/default.png b/src/assets/images/default.png
new file mode 100644
index 0000000..51929f6
Binary files /dev/null and b/src/assets/images/default.png differ
diff --git a/src/assets/images/loading.gif b/src/assets/images/loading.gif
new file mode 100644
index 0000000..915c198
Binary files /dev/null and b/src/assets/images/loading.gif differ
diff --git a/src/assets/images/login_bg.png b/src/assets/images/login_bg.png
new file mode 100644
index 0000000..17d91b8
Binary files /dev/null and b/src/assets/images/login_bg.png differ
diff --git a/src/assets/images/logo.png b/src/assets/images/logo.png
new file mode 100644
index 0000000..164f6cf
Binary files /dev/null and b/src/assets/images/logo.png differ
diff --git a/src/assets/images/woman.jpg b/src/assets/images/woman.jpg
new file mode 100644
index 0000000..2d4b1ca
Binary files /dev/null and b/src/assets/images/woman.jpg differ
diff --git a/src/assets/plugins/bootstrap-combobox/css/bootstrap-combobox.css b/src/assets/plugins/bootstrap-combobox/css/bootstrap-combobox.css
new file mode 100644
index 0000000..c4fd88a
--- /dev/null
+++ b/src/assets/plugins/bootstrap-combobox/css/bootstrap-combobox.css
@@ -0,0 +1,55 @@
+@media (min-width: 768px) {
+
+ .form-search .combobox-container,
+ .form-inline .combobox-container {
+ display: inline-block;
+ margin-bottom: 0;
+ vertical-align: top;
+ }
+
+ .form-search .combobox-container .input-group-addon,
+ .form-inline .combobox-container .input-group-addon {
+ width: auto;
+ }
+}
+
+.combobox-selected .caret {
+ display: none;
+}
+
+/* :not doesn't work in IE8 */
+.combobox-container:not(.combobox-selected) .glyphicon-remove {
+ display: none;
+}
+
+.typeahead-long {
+ max-height: 300px;
+ overflow-y: auto;
+}
+
+.control-group.error .combobox-container .add-on {
+ color: #B94A48;
+ border-color: #B94A48;
+}
+
+.control-group.error .combobox-container .caret {
+ border-top-color: #B94A48;
+}
+
+.control-group.warning .combobox-container .add-on {
+ color: #C09853;
+ border-color: #C09853;
+}
+
+.control-group.warning .combobox-container .caret {
+ border-top-color: #C09853;
+}
+
+.control-group.success .combobox-container .add-on {
+ color: #468847;
+ border-color: #468847;
+}
+
+.control-group.success .combobox-container .caret {
+ border-top-color: #468847;
+}
\ No newline at end of file
diff --git a/src/assets/plugins/bootstrap-combobox/js/bootstrap-combobox-helper.js b/src/assets/plugins/bootstrap-combobox/js/bootstrap-combobox-helper.js
new file mode 100644
index 0000000..a2f4c5c
--- /dev/null
+++ b/src/assets/plugins/bootstrap-combobox/js/bootstrap-combobox-helper.js
@@ -0,0 +1,62 @@
+import $ from 'jquery';
+
+import '@/assets/plugins/bootstrap-combobox/js/bootstrap-combobox';
+
+export default {
+ getSelected: function (idstr) {
+ let value;
+ for (let i = 0, len = $(idstr + ' option').length; i < len; i++) {
+ let $option = $(idstr + ' option:eq(' + i + ')');
+ if ($option.prop('selected')) {
+ value = $option.val();
+ break;
+ }
+ }
+ return value;
+ },
+ // 设置默认值
+ setDef: function (idstr, defval) {
+ if (defval) {
+ for (let i = 0, len = $(idstr + ' option').length; i < len; i++) {
+ let $option = $(idstr + ' option:eq(' + i + ')');
+ if ($option.val() == defval) {
+ $option.prop('selected', true);
+ } else {
+ $option.prop('selected', false);
+ }
+ }
+ $(idstr).btComboBox('parse');
+ }
+ },
+ // 构建下拉组合框
+ build: function (val, idstr, defval) {
+ var _this = this;
+ if (val) {
+ if (Object.prototype.toString.call(val) === '[object Array]') {
+ $(idstr).empty();
+ $.each(val, function (n, obj) {
+ $(idstr).append("" + obj.text + " ");
+ });
+ $(idstr).btComboBox();
+ _this.setDef(idstr, defval);
+ } else {
+ $.ajax({
+ type: 'post',
+ url: val,
+ dataType: 'json',
+ success: function (json) {
+ $(idstr).empty();
+ $.each(json, function (n, value) {
+ $(idstr).append("" + value.otxt + " ");
+ });
+ $(idstr).btComboBox();
+ _this.setDef(idstr, defval);
+ }
+ });
+ }
+ } else {
+ $(idstr).btComboBox();
+ _this.setDef(idstr, defval);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/assets/plugins/bootstrap-combobox/js/bootstrap-combobox.js b/src/assets/plugins/bootstrap-combobox/js/bootstrap-combobox.js
new file mode 100644
index 0000000..e90db94
--- /dev/null
+++ b/src/assets/plugins/bootstrap-combobox/js/bootstrap-combobox.js
@@ -0,0 +1,493 @@
+/* =============================================================
+ * bootstrap-combobox.js v1.1.8
+ * =============================================================
+ * Copyright 2012 Daniel Farrell
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============================================================ */
+
+/*!
+ * Bootstrap-select v1.10.0 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2016 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+
+(function (root, factory) {
+ var define;
+ if (typeof define === 'function' && define.amd) {
+ // AMD. Register as an anonymous module unless amdModuleId is set
+ define(["jquery"], function (a0) {
+ return (factory(a0));
+ });
+ } else if (typeof exports === 'object') {
+ // Node. Does not work with strict CommonJS, but
+ // only CommonJS-like environments that support module.exports,
+ // like Node.
+ module.exports = factory(require("jquery"));
+ } else {
+ factory(jQuery);
+ }
+}(this, function (jQuery) {
+ (function ($) {
+
+ "use strict";
+
+ /* COMBOBOX PUBLIC CLASS DEFINITION
+ * ================================ */
+
+ var Combobox = function (element, options) {
+ this.options = $.extend({}, $.fn.combobox.defaults, options);
+ this.template = this.options.template || this.template
+ this.$source = $(element);
+ this.$container = this.setup();
+ this.$element = this.$container.find('input[type=text]');
+ this.$target = this.$container.find('input[type=hidden]');
+ this.$button = this.$container.find('.dropdown-toggle');
+ this.$menu = $(this.options.menu).appendTo('body');
+ this.matcher = this.options.matcher || this.matcher;
+ this.sorter = this.options.sorter || this.sorter;
+ this.highlighter = this.options.highlighter || this.highlighter;
+ this.shown = false;
+ this.selected = false;
+ this.refresh();
+ this.transferAttributes();
+ this.listen();
+ };
+
+ Combobox.prototype = {
+
+ constructor: Combobox
+
+ , setup: function () {
+ var combobox = $(this.template());
+ this.$source.before(combobox);
+ this.$source.hide();
+ return combobox;
+ }
+
+ , disable: function () {
+ this.$element.prop('disabled', true);
+ this.$button.attr('disabled', true);
+ this.disabled = true;
+ this.$container.addClass('combobox-disabled');
+ }
+
+ , enable: function () {
+ this.$element.prop('disabled', false);
+ this.$button.attr('disabled', false);
+ this.disabled = false;
+ this.$container.removeClass('combobox-disabled');
+ }
+ , parse: function () {
+ var that = this
+ , map = {}
+ , source = []
+ , selected = false
+ , selectedValue = '';
+ this.$source.find('option').each(function () {
+ var option = $(this);
+ if (option.val() === '') {
+ that.options.placeholder = option.text();
+ return;
+ }
+ map[option.text()] = option.val();
+ source.push(option.text());
+ if (option.prop('selected')) {
+ selected = option.text();
+ selectedValue = option.val();
+ }
+ })
+ this.map = map;
+ if (selected) {
+ this.$element.val(selected);
+ this.$target.val(selectedValue);
+ this.$container.addClass('combobox-selected');
+ this.selected = true;
+ }
+ return source;
+ }
+
+ , transferAttributes: function () {
+ this.options.placeholder = this.$source.attr('data-placeholder') || this.options.placeholder
+ if (this.options.appendId !== undefined) {
+ this.$element.attr('id', this.$source.attr('id') + this.options.appendId);
+ }
+ this.$element.attr('placeholder', this.options.placeholder)
+ this.$target.prop('name', this.$source.prop('name'))
+ this.$target.val(this.$source.val())
+ this.$source.removeAttr('name') // Remove from source otherwise form will pass parameter twice.
+ this.$element.attr('required', this.$source.attr('required'))
+ this.$element.attr('rel', this.$source.attr('rel'))
+ this.$element.attr('title', this.$source.attr('title'))
+ this.$element.attr('class', this.$source.attr('class'))
+ this.$element.attr('tabindex', this.$source.attr('tabindex'))
+ this.$source.removeAttr('tabindex')
+ if (this.$source.attr('disabled') !== undefined)
+ this.disable();
+ }
+
+ , select: function () {
+ var val = this.$menu.find('.active').attr('data-value');
+ this.$element.val(this.updater(val)).trigger('change');
+ this.$target.val(this.map[val]).trigger('change');
+ this.$source.val(this.map[val]).trigger('change');
+ this.$container.addClass('combobox-selected');
+ this.selected = true;
+ return this.hide();
+ }
+
+ , updater: function (item) {
+ return item;
+ }
+
+ , show: function () {
+ var pos = $.extend({}, this.$element.position(), {
+ height: this.$element[0].offsetHeight
+ });
+
+ this.$menu
+ .insertAfter(this.$element)
+ .css({
+ top: pos.top + pos.height
+ , left: pos.left
+ })
+ .show();
+
+ $('.dropdown-menu').on('mousedown', $.proxy(this.scrollSafety, this));
+
+ this.shown = true;
+ return this;
+ }
+
+ , hide: function () {
+ this.$menu.hide();
+ $('.dropdown-menu').off('mousedown', $.proxy(this.scrollSafety, this));
+ this.$element.on('blur', $.proxy(this.blur, this));
+ this.shown = false;
+ return this;
+ }
+
+ , lookup: function (event) {
+ this.query = this.$element.val();
+ return this.process(this.source);
+ }
+
+ , process: function (items) {
+ var that = this;
+
+ items = $.grep(items, function (item) {
+ return that.matcher(item);
+ })
+
+ items = this.sorter(items);
+
+ if (!items.length) {
+ return this.shown ? this.hide() : this;
+ }
+
+ return this.render(items.slice(0, this.options.items)).show();
+ }
+
+ , template: function () {
+ if (this.options.bsVersion == '2') {
+ return ''
+ } else {
+ return ''
+ }
+ }
+
+ , matcher: function (item) {
+ return ~item.toLowerCase().indexOf(this.query.toLowerCase());
+ }
+
+ , sorter: function (items) {
+ var beginswith = []
+ , caseSensitive = []
+ , caseInsensitive = []
+ , item;
+ item = items.shift();
+ while (item) {
+ if (!item.toLowerCase().indexOf(this.query.toLowerCase())) { beginswith.push(item); }
+ else if (~item.indexOf(this.query)) { caseSensitive.push(item); }
+ else { caseInsensitive.push(item); }
+ item = items.shift();
+ }
+
+ return beginswith.concat(caseSensitive, caseInsensitive);
+ }
+
+ , highlighter: function (item) {
+ var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&');
+ return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) {
+ return '' + match + ' ';
+ })
+ }
+
+ , render: function (items) {
+ var that = this;
+
+ items = $(items).map(function (i, item) {
+ i = $(that.options.item).attr('data-value', item);
+ i.find('a').html(that.highlighter(item));
+ return i[0];
+ })
+
+ items.first().addClass('active');
+ this.$menu.html(items);
+ return this;
+ }
+
+ , next: function (event) {
+ var active = this.$menu.find('.active').removeClass('active')
+ , next = active.next();
+
+ if (!next.length) {
+ next = $(this.$menu.find('li')[0]);
+ }
+
+ next.addClass('active');
+ }
+
+ , prev: function (event) {
+ var active = this.$menu.find('.active').removeClass('active')
+ , prev = active.prev();
+
+ if (!prev.length) {
+ prev = this.$menu.find('li').last();
+ }
+
+ prev.addClass('active');
+ }
+
+ , toggle: function () {
+ if (!this.disabled) {
+ if (this.$container.hasClass('combobox-selected')) {
+ this.clearTarget();
+ this.triggerChange();
+ this.clearElement();
+ } else {
+ if (this.shown) {
+ this.hide();
+ } else {
+ this.clearElement();
+ this.lookup();
+ }
+ }
+ }
+ }
+
+ , scrollSafety: function (e) {
+ if (e.target.tagName == 'UL') {
+ this.$element.off('blur');
+ }
+ }
+ , clearElement: function () {
+ this.$element.val('').focus();
+ }
+
+ , clearTarget: function () {
+ this.$source.val('');
+ this.$target.val('');
+ this.$container.removeClass('combobox-selected');
+ this.selected = false;
+ }
+
+ , triggerChange: function () {
+ this.$source.trigger('change');
+ }
+
+ , refresh: function () {
+ this.source = this.parse();
+ this.options.items = this.source.length;
+ }
+
+ , listen: function () {
+ this.$element
+ .on('focus', $.proxy(this.focus, this))
+ .on('blur', $.proxy(this.blur, this))
+ .on('keypress', $.proxy(this.keypress, this))
+ .on('keyup', $.proxy(this.keyup, this));
+
+ if (this.eventSupported('keydown')) {
+ this.$element.on('keydown', $.proxy(this.keydown, this));
+ }
+
+ this.$menu
+ .on('click', $.proxy(this.click, this))
+ .on('mouseenter', 'li', $.proxy(this.mouseenter, this))
+ .on('mouseleave', 'li', $.proxy(this.mouseleave, this));
+
+ this.$button
+ .on('click', $.proxy(this.toggle, this));
+ }
+
+ , eventSupported: function (eventName) {
+ var isSupported = eventName in this.$element;
+ if (!isSupported) {
+ this.$element.setAttribute(eventName, 'return;');
+ isSupported = typeof this.$element[eventName] === 'function';
+ }
+ return isSupported;
+ }
+
+ , move: function (e) {
+ if (!this.shown) { return; }
+
+ switch (e.keyCode) {
+ case 9: // tab
+ case 13: // enter
+ case 27: // escape
+ e.preventDefault();
+ break;
+
+ case 38: // up arrow
+ e.preventDefault();
+ this.prev();
+ this.fixMenuScroll();
+ break;
+
+ case 40: // down arrow
+ e.preventDefault();
+ this.next();
+ this.fixMenuScroll();
+ break;
+ }
+
+ e.stopPropagation();
+ }
+
+ , fixMenuScroll: function () {
+ var active = this.$menu.find('.active');
+ if (active.length) {
+ var top = active.position().top;
+ var bottom = top + active.height();
+ var scrollTop = this.$menu.scrollTop();
+ var menuHeight = this.$menu.height();
+ if (bottom > menuHeight) {
+ this.$menu.scrollTop(scrollTop + bottom - menuHeight);
+ } else if (top < 0) {
+ this.$menu.scrollTop(scrollTop + top);
+ }
+ }
+ }
+
+ , keydown: function (e) {
+ this.suppressKeyPressRepeat = ~$.inArray(e.keyCode, [40, 38, 9, 13, 27]);
+ this.move(e);
+ }
+
+ , keypress: function (e) {
+ if (this.suppressKeyPressRepeat) { return; }
+ this.move(e);
+ }
+
+ , keyup: function (e) {
+ switch (e.keyCode) {
+ case 40: // down arrow
+ if (!this.shown) {
+ this.toggle();
+ }
+ break;
+ case 39: // right arrow
+ case 38: // up arrow
+ case 37: // left arrow
+ case 36: // home
+ case 35: // end
+ case 16: // shift
+ case 17: // ctrl
+ case 18: // alt
+ break;
+
+ case 9: // tab
+ case 13: // enter
+ if (!this.shown) { return; }
+ this.select();
+ break;
+
+ case 27: // escape
+ if (!this.shown) { return; }
+ this.hide();
+ break;
+
+ default:
+ this.clearTarget();
+ this.lookup();
+ }
+
+ e.stopPropagation();
+ e.preventDefault();
+ }
+
+ , focus: function (e) {
+ this.focused = true;
+ }
+
+ , blur: function (e) {
+ var that = this;
+ this.focused = false;
+ var val = this.$element.val();
+ if (!this.selected && val !== '') {
+ this.$element.val('');
+ this.$source.val('').trigger('change');
+ this.$target.val('').trigger('change');
+ }
+ if (!this.mousedover && this.shown) { setTimeout(function () { that.hide(); }, 200); }
+ }
+
+ , click: function (e) {
+ e.stopPropagation();
+ e.preventDefault();
+ this.select();
+ this.$element.focus();
+ }
+
+ , mouseenter: function (e) {
+ this.mousedover = true;
+ this.$menu.find('.active').removeClass('active');
+ $(e.currentTarget).addClass('active');
+ }
+
+ , mouseleave: function (e) {
+ this.mousedover = false;
+ }
+ };
+
+ /* COMBOBOX PLUGIN DEFINITION
+ * =========================== */
+ $.fn.combobox = function (option) {
+ return this.each(function () {
+ var $this = $(this)
+ , data = $this.data('combobox')
+ , options = typeof option == 'object' && option;
+ if (!data) { $this.data('combobox', (data = new Combobox(this, options))); }
+ if (typeof option == 'string') { data[option](); }
+ });
+ };
+
+ $.fn.combobox.defaults = {
+ bsVersion: '4'
+ , menu: ''
+ , item: ' '
+ };
+
+ $.fn.combobox.Constructor = Combobox;
+
+ $.fn.btComboBox = $.fn.combobox;
+ $.fn.btComboBox.defaults = $.fn.combobox.defaults;
+ $.fn.btComboBox.Constructor = Combobox;
+
+ }(jQuery));
+}));
+
+
diff --git a/src/assets/plugins/bootstrap-datepicker/css/datepicker3.css b/src/assets/plugins/bootstrap-datepicker/css/datepicker3.css
new file mode 100644
index 0000000..d21cebd
--- /dev/null
+++ b/src/assets/plugins/bootstrap-datepicker/css/datepicker3.css
@@ -0,0 +1,853 @@
+/*!
+ * Datepicker for Bootstrap
+ *
+ * Copyright 2012 Stefan Petre
+ * Improvements by Andrew Rowls
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ */
+.datepicker {
+ padding: 4px;
+ border-radius: 4px;
+ direction: ltr;
+ /*.dow {
+ border-top: 1px solid #ddd !important;
+ }*/
+}
+
+.datepicker-inline {
+ width: 100%;
+}
+
+.datepicker.datepicker-rtl {
+ direction: rtl;
+}
+
+.datepicker.datepicker-rtl table tr td span {
+ float: right;
+}
+
+.datepicker-dropdown {
+ top: 0;
+ left: 0;
+}
+
+.datepicker-dropdown:before {
+ content: '';
+ display: inline-block;
+ border-left: 7px solid transparent;
+ border-right: 7px solid transparent;
+ border-bottom: 7px solid #ccc;
+ border-top: 0;
+ border-bottom-color: rgba(0, 0, 0, 0.2);
+ position: absolute;
+}
+
+.datepicker-dropdown:after {
+ content: '';
+ display: inline-block;
+ border-left: 6px solid transparent;
+ border-right: 6px solid transparent;
+ border-bottom: 6px solid #fff;
+ border-top: 0;
+ position: absolute;
+}
+
+.datepicker-dropdown.datepicker-orient-left:before {
+ left: 6px;
+}
+
+.datepicker-dropdown.datepicker-orient-left:after {
+ left: 7px;
+}
+
+.datepicker-dropdown.datepicker-orient-right:before {
+ right: 6px;
+}
+
+.datepicker-dropdown.datepicker-orient-right:after {
+ right: 7px;
+}
+
+.datepicker-dropdown.datepicker-orient-top:before {
+ top: -7px;
+}
+
+.datepicker-dropdown.datepicker-orient-top:after {
+ top: -6px;
+}
+
+.datepicker-dropdown.datepicker-orient-bottom:before {
+ bottom: -7px;
+ border-bottom: 0;
+ border-top: 7px solid #999;
+}
+
+.datepicker-dropdown.datepicker-orient-bottom:after {
+ bottom: -6px;
+ border-bottom: 0;
+ border-top: 6px solid #fff;
+}
+
+.datepicker>div {
+ display: none;
+}
+
+.datepicker.days div.datepicker-days {
+ display: block;
+}
+
+.datepicker.months div.datepicker-months {
+ display: block;
+}
+
+.datepicker.years div.datepicker-years {
+ display: block;
+}
+
+.datepicker table {
+ margin: 0;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+.datepicker table tr td,
+.datepicker table tr th {
+ text-align: center;
+ width: 30px;
+ height: 30px;
+ border-radius: 4px;
+ border: none;
+}
+
+.table-striped .datepicker table tr td,
+.table-striped .datepicker table tr th {
+ background-color: transparent;
+}
+
+.datepicker table tr td.day:hover,
+.datepicker table tr td.day.focused {
+ background: rgba(0, 0, 0, 0.2);
+ cursor: pointer;
+}
+
+.datepicker table tr td.old,
+.datepicker table tr td.new {
+ color: #777;
+}
+
+.datepicker table tr td.disabled,
+.datepicker table tr td.disabled:hover {
+ background: none;
+ color: #444;
+ cursor: default;
+}
+
+.datepicker table tr td.today,
+.datepicker table tr td.today:hover,
+.datepicker table tr td.today.disabled,
+.datepicker table tr td.today.disabled:hover {
+ color: #000000;
+ background: rgba(0, 0, 0, 0.2);
+ border-color: #ffb733;
+}
+
+.datepicker table tr td.today:hover,
+.datepicker table tr td.today:hover:hover,
+.datepicker table tr td.today.disabled:hover,
+.datepicker table tr td.today.disabled:hover:hover,
+.datepicker table tr td.today:focus,
+.datepicker table tr td.today:hover:focus,
+.datepicker table tr td.today.disabled:focus,
+.datepicker table tr td.today.disabled:hover:focus,
+.datepicker table tr td.today:active,
+.datepicker table tr td.today:hover:active,
+.datepicker table tr td.today.disabled:active,
+.datepicker table tr td.today.disabled:hover:active,
+.datepicker table tr td.today.active,
+.datepicker table tr td.today:hover.active,
+.datepicker table tr td.today.disabled.active,
+.datepicker table tr td.today.disabled:hover.active,
+.open .dropdown-toggle.datepicker table tr td.today,
+.open .dropdown-toggle.datepicker table tr td.today:hover,
+.open .dropdown-toggle.datepicker table tr td.today.disabled,
+.open .dropdown-toggle.datepicker table tr td.today.disabled:hover {
+ color: #000000;
+ background: rgba(0, 0, 0, 0.2);
+ border-color: #f59e00;
+}
+
+.datepicker table tr td.today:active,
+.datepicker table tr td.today:hover:active,
+.datepicker table tr td.today.disabled:active,
+.datepicker table tr td.today.disabled:hover:active,
+.datepicker table tr td.today.active,
+.datepicker table tr td.today:hover.active,
+.datepicker table tr td.today.disabled.active,
+.datepicker table tr td.today.disabled:hover.active,
+.open .dropdown-toggle.datepicker table tr td.today,
+.open .dropdown-toggle.datepicker table tr td.today:hover,
+.open .dropdown-toggle.datepicker table tr td.today.disabled,
+.open .dropdown-toggle.datepicker table tr td.today.disabled:hover {
+ background-image: none;
+}
+
+.datepicker table tr td.today.disabled,
+.datepicker table tr td.today:hover.disabled,
+.datepicker table tr td.today.disabled.disabled,
+.datepicker table tr td.today.disabled:hover.disabled,
+.datepicker table tr td.today[disabled],
+.datepicker table tr td.today:hover[disabled],
+.datepicker table tr td.today.disabled[disabled],
+.datepicker table tr td.today.disabled:hover[disabled],
+fieldset[disabled] .datepicker table tr td.today,
+fieldset[disabled] .datepicker table tr td.today:hover,
+fieldset[disabled] .datepicker table tr td.today.disabled,
+fieldset[disabled] .datepicker table tr td.today.disabled:hover,
+.datepicker table tr td.today.disabled:hover,
+.datepicker table tr td.today:hover.disabled:hover,
+.datepicker table tr td.today.disabled.disabled:hover,
+.datepicker table tr td.today.disabled:hover.disabled:hover,
+.datepicker table tr td.today[disabled]:hover,
+.datepicker table tr td.today:hover[disabled]:hover,
+.datepicker table tr td.today.disabled[disabled]:hover,
+.datepicker table tr td.today.disabled:hover[disabled]:hover,
+fieldset[disabled] .datepicker table tr td.today:hover,
+fieldset[disabled] .datepicker table tr td.today:hover:hover,
+fieldset[disabled] .datepicker table tr td.today.disabled:hover,
+fieldset[disabled] .datepicker table tr td.today.disabled:hover:hover,
+.datepicker table tr td.today.disabled:focus,
+.datepicker table tr td.today:hover.disabled:focus,
+.datepicker table tr td.today.disabled.disabled:focus,
+.datepicker table tr td.today.disabled:hover.disabled:focus,
+.datepicker table tr td.today[disabled]:focus,
+.datepicker table tr td.today:hover[disabled]:focus,
+.datepicker table tr td.today.disabled[disabled]:focus,
+.datepicker table tr td.today.disabled:hover[disabled]:focus,
+fieldset[disabled] .datepicker table tr td.today:focus,
+fieldset[disabled] .datepicker table tr td.today:hover:focus,
+fieldset[disabled] .datepicker table tr td.today.disabled:focus,
+fieldset[disabled] .datepicker table tr td.today.disabled:hover:focus,
+.datepicker table tr td.today.disabled:active,
+.datepicker table tr td.today:hover.disabled:active,
+.datepicker table tr td.today.disabled.disabled:active,
+.datepicker table tr td.today.disabled:hover.disabled:active,
+.datepicker table tr td.today[disabled]:active,
+.datepicker table tr td.today:hover[disabled]:active,
+.datepicker table tr td.today.disabled[disabled]:active,
+.datepicker table tr td.today.disabled:hover[disabled]:active,
+fieldset[disabled] .datepicker table tr td.today:active,
+fieldset[disabled] .datepicker table tr td.today:hover:active,
+fieldset[disabled] .datepicker table tr td.today.disabled:active,
+fieldset[disabled] .datepicker table tr td.today.disabled:hover:active,
+.datepicker table tr td.today.disabled.active,
+.datepicker table tr td.today:hover.disabled.active,
+.datepicker table tr td.today.disabled.disabled.active,
+.datepicker table tr td.today.disabled:hover.disabled.active,
+.datepicker table tr td.today[disabled].active,
+.datepicker table tr td.today:hover[disabled].active,
+.datepicker table tr td.today.disabled[disabled].active,
+.datepicker table tr td.today.disabled:hover[disabled].active,
+fieldset[disabled] .datepicker table tr td.today.active,
+fieldset[disabled] .datepicker table tr td.today:hover.active,
+fieldset[disabled] .datepicker table tr td.today.disabled.active,
+fieldset[disabled] .datepicker table tr td.today.disabled:hover.active {
+ background: rgba(0, 0, 0, 0.2);
+ border-color: #ffb733;
+}
+
+.datepicker table tr td.today:hover:hover {
+ color: #000;
+}
+
+.datepicker table tr td.today.active:hover {
+ color: #fff;
+}
+
+.datepicker table tr td.range,
+.datepicker table tr td.range:hover,
+.datepicker table tr td.range.disabled,
+.datepicker table tr td.range.disabled:hover {
+ background: rgba(0, 0, 0, 0.2);
+ border-radius: 0;
+}
+
+.datepicker table tr td.range.today,
+.datepicker table tr td.range.today:hover,
+.datepicker table tr td.range.today.disabled,
+.datepicker table tr td.range.today.disabled:hover {
+ color: #000000;
+ background: rgba(0, 0, 0, 0.2);
+ border-color: #f1a417;
+ border-radius: 0;
+}
+
+.datepicker table tr td.range.today:hover,
+.datepicker table tr td.range.today:hover:hover,
+.datepicker table tr td.range.today.disabled:hover,
+.datepicker table tr td.range.today.disabled:hover:hover,
+.datepicker table tr td.range.today:focus,
+.datepicker table tr td.range.today:hover:focus,
+.datepicker table tr td.range.today.disabled:focus,
+.datepicker table tr td.range.today.disabled:hover:focus,
+.datepicker table tr td.range.today:active,
+.datepicker table tr td.range.today:hover:active,
+.datepicker table tr td.range.today.disabled:active,
+.datepicker table tr td.range.today.disabled:hover:active,
+.datepicker table tr td.range.today.active,
+.datepicker table tr td.range.today:hover.active,
+.datepicker table tr td.range.today.disabled.active,
+.datepicker table tr td.range.today.disabled:hover.active,
+.open .dropdown-toggle.datepicker table tr td.range.today,
+.open .dropdown-toggle.datepicker table tr td.range.today:hover,
+.open .dropdown-toggle.datepicker table tr td.range.today.disabled,
+.open .dropdown-toggle.datepicker table tr td.range.today.disabled:hover {
+ color: #000000;
+ background: rgba(0, 0, 0, 0.2);
+ border-color: #bf800c;
+}
+
+.datepicker table tr td.range.today:active,
+.datepicker table tr td.range.today:hover:active,
+.datepicker table tr td.range.today.disabled:active,
+.datepicker table tr td.range.today.disabled:hover:active,
+.datepicker table tr td.range.today.active,
+.datepicker table tr td.range.today:hover.active,
+.datepicker table tr td.range.today.disabled.active,
+.datepicker table tr td.range.today.disabled:hover.active,
+.open .dropdown-toggle.datepicker table tr td.range.today,
+.open .dropdown-toggle.datepicker table tr td.range.today:hover,
+.open .dropdown-toggle.datepicker table tr td.range.today.disabled,
+.open .dropdown-toggle.datepicker table tr td.range.today.disabled:hover {
+ background-image: none;
+}
+
+.datepicker table tr td.range.today.disabled,
+.datepicker table tr td.range.today:hover.disabled,
+.datepicker table tr td.range.today.disabled.disabled,
+.datepicker table tr td.range.today.disabled:hover.disabled,
+.datepicker table tr td.range.today[disabled],
+.datepicker table tr td.range.today:hover[disabled],
+.datepicker table tr td.range.today.disabled[disabled],
+.datepicker table tr td.range.today.disabled:hover[disabled],
+fieldset[disabled] .datepicker table tr td.range.today,
+fieldset[disabled] .datepicker table tr td.range.today:hover,
+fieldset[disabled] .datepicker table tr td.range.today.disabled,
+fieldset[disabled] .datepicker table tr td.range.today.disabled:hover,
+.datepicker table tr td.range.today.disabled:hover,
+.datepicker table tr td.range.today:hover.disabled:hover,
+.datepicker table tr td.range.today.disabled.disabled:hover,
+.datepicker table tr td.range.today.disabled:hover.disabled:hover,
+.datepicker table tr td.range.today[disabled]:hover,
+.datepicker table tr td.range.today:hover[disabled]:hover,
+.datepicker table tr td.range.today.disabled[disabled]:hover,
+.datepicker table tr td.range.today.disabled:hover[disabled]:hover,
+fieldset[disabled] .datepicker table tr td.range.today:hover,
+fieldset[disabled] .datepicker table tr td.range.today:hover:hover,
+fieldset[disabled] .datepicker table tr td.range.today.disabled:hover,
+fieldset[disabled] .datepicker table tr td.range.today.disabled:hover:hover,
+.datepicker table tr td.range.today.disabled:focus,
+.datepicker table tr td.range.today:hover.disabled:focus,
+.datepicker table tr td.range.today.disabled.disabled:focus,
+.datepicker table tr td.range.today.disabled:hover.disabled:focus,
+.datepicker table tr td.range.today[disabled]:focus,
+.datepicker table tr td.range.today:hover[disabled]:focus,
+.datepicker table tr td.range.today.disabled[disabled]:focus,
+.datepicker table tr td.range.today.disabled:hover[disabled]:focus,
+fieldset[disabled] .datepicker table tr td.range.today:focus,
+fieldset[disabled] .datepicker table tr td.range.today:hover:focus,
+fieldset[disabled] .datepicker table tr td.range.today.disabled:focus,
+fieldset[disabled] .datepicker table tr td.range.today.disabled:hover:focus,
+.datepicker table tr td.range.today.disabled:active,
+.datepicker table tr td.range.today:hover.disabled:active,
+.datepicker table tr td.range.today.disabled.disabled:active,
+.datepicker table tr td.range.today.disabled:hover.disabled:active,
+.datepicker table tr td.range.today[disabled]:active,
+.datepicker table tr td.range.today:hover[disabled]:active,
+.datepicker table tr td.range.today.disabled[disabled]:active,
+.datepicker table tr td.range.today.disabled:hover[disabled]:active,
+fieldset[disabled] .datepicker table tr td.range.today:active,
+fieldset[disabled] .datepicker table tr td.range.today:hover:active,
+fieldset[disabled] .datepicker table tr td.range.today.disabled:active,
+fieldset[disabled] .datepicker table tr td.range.today.disabled:hover:active,
+.datepicker table tr td.range.today.disabled.active,
+.datepicker table tr td.range.today:hover.disabled.active,
+.datepicker table tr td.range.today.disabled.disabled.active,
+.datepicker table tr td.range.today.disabled:hover.disabled.active,
+.datepicker table tr td.range.today[disabled].active,
+.datepicker table tr td.range.today:hover[disabled].active,
+.datepicker table tr td.range.today.disabled[disabled].active,
+.datepicker table tr td.range.today.disabled:hover[disabled].active,
+fieldset[disabled] .datepicker table tr td.range.today.active,
+fieldset[disabled] .datepicker table tr td.range.today:hover.active,
+fieldset[disabled] .datepicker table tr td.range.today.disabled.active,
+fieldset[disabled] .datepicker table tr td.range.today.disabled:hover.active {
+ background: rgba(0, 0, 0, 0.2);
+ border-color: #f1a417;
+}
+
+.datepicker table tr td.selected,
+.datepicker table tr td.selected:hover,
+.datepicker table tr td.selected.disabled,
+.datepicker table tr td.selected.disabled:hover {
+ color: #ffffff;
+ background: rgba(0, 0, 0, 0.2);
+ border-color: #555555;
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+
+.datepicker table tr td.selected:hover,
+.datepicker table tr td.selected:hover:hover,
+.datepicker table tr td.selected.disabled:hover,
+.datepicker table tr td.selected.disabled:hover:hover,
+.datepicker table tr td.selected:focus,
+.datepicker table tr td.selected:hover:focus,
+.datepicker table tr td.selected.disabled:focus,
+.datepicker table tr td.selected.disabled:hover:focus,
+.datepicker table tr td.selected:active,
+.datepicker table tr td.selected:hover:active,
+.datepicker table tr td.selected.disabled:active,
+.datepicker table tr td.selected.disabled:hover:active,
+.datepicker table tr td.selected.active,
+.datepicker table tr td.selected:hover.active,
+.datepicker table tr td.selected.disabled.active,
+.datepicker table tr td.selected.disabled:hover.active,
+.open .dropdown-toggle.datepicker table tr td.selected,
+.open .dropdown-toggle.datepicker table tr td.selected:hover,
+.open .dropdown-toggle.datepicker table tr td.selected.disabled,
+.open .dropdown-toggle.datepicker table tr td.selected.disabled:hover {
+ color: #ffffff;
+ background: rgba(0, 0, 0, 0.2);
+ border-color: #373737;
+}
+
+.datepicker table tr td.selected:active,
+.datepicker table tr td.selected:hover:active,
+.datepicker table tr td.selected.disabled:active,
+.datepicker table tr td.selected.disabled:hover:active,
+.datepicker table tr td.selected.active,
+.datepicker table tr td.selected:hover.active,
+.datepicker table tr td.selected.disabled.active,
+.datepicker table tr td.selected.disabled:hover.active,
+.open .dropdown-toggle.datepicker table tr td.selected,
+.open .dropdown-toggle.datepicker table tr td.selected:hover,
+.open .dropdown-toggle.datepicker table tr td.selected.disabled,
+.open .dropdown-toggle.datepicker table tr td.selected.disabled:hover {
+ background-image: none;
+}
+
+.datepicker table tr td.selected.disabled,
+.datepicker table tr td.selected:hover.disabled,
+.datepicker table tr td.selected.disabled.disabled,
+.datepicker table tr td.selected.disabled:hover.disabled,
+.datepicker table tr td.selected[disabled],
+.datepicker table tr td.selected:hover[disabled],
+.datepicker table tr td.selected.disabled[disabled],
+.datepicker table tr td.selected.disabled:hover[disabled],
+fieldset[disabled] .datepicker table tr td.selected,
+fieldset[disabled] .datepicker table tr td.selected:hover,
+fieldset[disabled] .datepicker table tr td.selected.disabled,
+fieldset[disabled] .datepicker table tr td.selected.disabled:hover,
+.datepicker table tr td.selected.disabled:hover,
+.datepicker table tr td.selected:hover.disabled:hover,
+.datepicker table tr td.selected.disabled.disabled:hover,
+.datepicker table tr td.selected.disabled:hover.disabled:hover,
+.datepicker table tr td.selected[disabled]:hover,
+.datepicker table tr td.selected:hover[disabled]:hover,
+.datepicker table tr td.selected.disabled[disabled]:hover,
+.datepicker table tr td.selected.disabled:hover[disabled]:hover,
+fieldset[disabled] .datepicker table tr td.selected:hover,
+fieldset[disabled] .datepicker table tr td.selected:hover:hover,
+fieldset[disabled] .datepicker table tr td.selected.disabled:hover,
+fieldset[disabled] .datepicker table tr td.selected.disabled:hover:hover,
+.datepicker table tr td.selected.disabled:focus,
+.datepicker table tr td.selected:hover.disabled:focus,
+.datepicker table tr td.selected.disabled.disabled:focus,
+.datepicker table tr td.selected.disabled:hover.disabled:focus,
+.datepicker table tr td.selected[disabled]:focus,
+.datepicker table tr td.selected:hover[disabled]:focus,
+.datepicker table tr td.selected.disabled[disabled]:focus,
+.datepicker table tr td.selected.disabled:hover[disabled]:focus,
+fieldset[disabled] .datepicker table tr td.selected:focus,
+fieldset[disabled] .datepicker table tr td.selected:hover:focus,
+fieldset[disabled] .datepicker table tr td.selected.disabled:focus,
+fieldset[disabled] .datepicker table tr td.selected.disabled:hover:focus,
+.datepicker table tr td.selected.disabled:active,
+.datepicker table tr td.selected:hover.disabled:active,
+.datepicker table tr td.selected.disabled.disabled:active,
+.datepicker table tr td.selected.disabled:hover.disabled:active,
+.datepicker table tr td.selected[disabled]:active,
+.datepicker table tr td.selected:hover[disabled]:active,
+.datepicker table tr td.selected.disabled[disabled]:active,
+.datepicker table tr td.selected.disabled:hover[disabled]:active,
+fieldset[disabled] .datepicker table tr td.selected:active,
+fieldset[disabled] .datepicker table tr td.selected:hover:active,
+fieldset[disabled] .datepicker table tr td.selected.disabled:active,
+fieldset[disabled] .datepicker table tr td.selected.disabled:hover:active,
+.datepicker table tr td.selected.disabled.active,
+.datepicker table tr td.selected:hover.disabled.active,
+.datepicker table tr td.selected.disabled.disabled.active,
+.datepicker table tr td.selected.disabled:hover.disabled.active,
+.datepicker table tr td.selected[disabled].active,
+.datepicker table tr td.selected:hover[disabled].active,
+.datepicker table tr td.selected.disabled[disabled].active,
+.datepicker table tr td.selected.disabled:hover[disabled].active,
+fieldset[disabled] .datepicker table tr td.selected.active,
+fieldset[disabled] .datepicker table tr td.selected:hover.active,
+fieldset[disabled] .datepicker table tr td.selected.disabled.active,
+fieldset[disabled] .datepicker table tr td.selected.disabled:hover.active {
+ background: rgba(0, 0, 0, 0.2);
+ border-color: #555555;
+}
+
+.datepicker table tr td.active,
+.datepicker table tr td.active:hover,
+.datepicker table tr td.active.disabled,
+.datepicker table tr td.active.disabled:hover {
+ color: #ffffff;
+ background: rgba(0, 0, 0, 0.2);
+ border-color: #357ebd;
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+
+.datepicker table tr td.active:hover,
+.datepicker table tr td.active:hover:hover,
+.datepicker table tr td.active.disabled:hover,
+.datepicker table tr td.active.disabled:hover:hover,
+.datepicker table tr td.active:focus,
+.datepicker table tr td.active:hover:focus,
+.datepicker table tr td.active.disabled:focus,
+.datepicker table tr td.active.disabled:hover:focus,
+.datepicker table tr td.active:active,
+.datepicker table tr td.active:hover:active,
+.datepicker table tr td.active.disabled:active,
+.datepicker table tr td.active.disabled:hover:active,
+.datepicker table tr td.active.active,
+.datepicker table tr td.active:hover.active,
+.datepicker table tr td.active.disabled.active,
+.datepicker table tr td.active.disabled:hover.active,
+.open .dropdown-toggle.datepicker table tr td.active,
+.open .dropdown-toggle.datepicker table tr td.active:hover,
+.open .dropdown-toggle.datepicker table tr td.active.disabled,
+.open .dropdown-toggle.datepicker table tr td.active.disabled:hover {
+ color: #ffffff;
+ background: rgba(0, 0, 0, 0.5);
+ border-color: #285e8e;
+}
+
+.datepicker table tr td.active:active,
+.datepicker table tr td.active:hover:active,
+.datepicker table tr td.active.disabled:active,
+.datepicker table tr td.active.disabled:hover:active,
+.datepicker table tr td.active.active,
+.datepicker table tr td.active:hover.active,
+.datepicker table tr td.active.disabled.active,
+.datepicker table tr td.active.disabled:hover.active,
+.open .dropdown-toggle.datepicker table tr td.active,
+.open .dropdown-toggle.datepicker table tr td.active:hover,
+.open .dropdown-toggle.datepicker table tr td.active.disabled,
+.open .dropdown-toggle.datepicker table tr td.active.disabled:hover {
+ background-image: none;
+}
+
+.datepicker table tr td.active.disabled,
+.datepicker table tr td.active:hover.disabled,
+.datepicker table tr td.active.disabled.disabled,
+.datepicker table tr td.active.disabled:hover.disabled,
+.datepicker table tr td.active[disabled],
+.datepicker table tr td.active:hover[disabled],
+.datepicker table tr td.active.disabled[disabled],
+.datepicker table tr td.active.disabled:hover[disabled],
+fieldset[disabled] .datepicker table tr td.active,
+fieldset[disabled] .datepicker table tr td.active:hover,
+fieldset[disabled] .datepicker table tr td.active.disabled,
+fieldset[disabled] .datepicker table tr td.active.disabled:hover,
+.datepicker table tr td.active.disabled:hover,
+.datepicker table tr td.active:hover.disabled:hover,
+.datepicker table tr td.active.disabled.disabled:hover,
+.datepicker table tr td.active.disabled:hover.disabled:hover,
+.datepicker table tr td.active[disabled]:hover,
+.datepicker table tr td.active:hover[disabled]:hover,
+.datepicker table tr td.active.disabled[disabled]:hover,
+.datepicker table tr td.active.disabled:hover[disabled]:hover,
+fieldset[disabled] .datepicker table tr td.active:hover,
+fieldset[disabled] .datepicker table tr td.active:hover:hover,
+fieldset[disabled] .datepicker table tr td.active.disabled:hover,
+fieldset[disabled] .datepicker table tr td.active.disabled:hover:hover,
+.datepicker table tr td.active.disabled:focus,
+.datepicker table tr td.active:hover.disabled:focus,
+.datepicker table tr td.active.disabled.disabled:focus,
+.datepicker table tr td.active.disabled:hover.disabled:focus,
+.datepicker table tr td.active[disabled]:focus,
+.datepicker table tr td.active:hover[disabled]:focus,
+.datepicker table tr td.active.disabled[disabled]:focus,
+.datepicker table tr td.active.disabled:hover[disabled]:focus,
+fieldset[disabled] .datepicker table tr td.active:focus,
+fieldset[disabled] .datepicker table tr td.active:hover:focus,
+fieldset[disabled] .datepicker table tr td.active.disabled:focus,
+fieldset[disabled] .datepicker table tr td.active.disabled:hover:focus,
+.datepicker table tr td.active.disabled:active,
+.datepicker table tr td.active:hover.disabled:active,
+.datepicker table tr td.active.disabled.disabled:active,
+.datepicker table tr td.active.disabled:hover.disabled:active,
+.datepicker table tr td.active[disabled]:active,
+.datepicker table tr td.active:hover[disabled]:active,
+.datepicker table tr td.active.disabled[disabled]:active,
+.datepicker table tr td.active.disabled:hover[disabled]:active,
+fieldset[disabled] .datepicker table tr td.active:active,
+fieldset[disabled] .datepicker table tr td.active:hover:active,
+fieldset[disabled] .datepicker table tr td.active.disabled:active,
+fieldset[disabled] .datepicker table tr td.active.disabled:hover:active,
+.datepicker table tr td.active.disabled.active,
+.datepicker table tr td.active:hover.disabled.active,
+.datepicker table tr td.active.disabled.disabled.active,
+.datepicker table tr td.active.disabled:hover.disabled.active,
+.datepicker table tr td.active[disabled].active,
+.datepicker table tr td.active:hover[disabled].active,
+.datepicker table tr td.active.disabled[disabled].active,
+.datepicker table tr td.active.disabled:hover[disabled].active,
+fieldset[disabled] .datepicker table tr td.active.active,
+fieldset[disabled] .datepicker table tr td.active:hover.active,
+fieldset[disabled] .datepicker table tr td.active.disabled.active,
+fieldset[disabled] .datepicker table tr td.active.disabled:hover.active {
+ background-color: #428bca;
+ border-color: #357ebd;
+}
+
+.datepicker table tr td span {
+ display: block;
+ width: 23%;
+ height: 54px;
+ line-height: 54px;
+ float: left;
+ margin: 1%;
+ cursor: pointer;
+ border-radius: 4px;
+}
+
+.datepicker table tr td span:hover {
+ background: rgba(0, 0, 0, 0.2);
+}
+
+.datepicker table tr td span.disabled,
+.datepicker table tr td span.disabled:hover {
+ background: none;
+ color: #444;
+ cursor: default;
+}
+
+.datepicker table tr td span.active,
+.datepicker table tr td span.active:hover,
+.datepicker table tr td span.active.disabled,
+.datepicker table tr td span.active.disabled:hover {
+ color: #ffffff;
+ background-color: #428bca;
+ border-color: #357ebd;
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+
+.datepicker table tr td span.active:hover,
+.datepicker table tr td span.active:hover:hover,
+.datepicker table tr td span.active.disabled:hover,
+.datepicker table tr td span.active.disabled:hover:hover,
+.datepicker table tr td span.active:focus,
+.datepicker table tr td span.active:hover:focus,
+.datepicker table tr td span.active.disabled:focus,
+.datepicker table tr td span.active.disabled:hover:focus,
+.datepicker table tr td span.active:active,
+.datepicker table tr td span.active:hover:active,
+.datepicker table tr td span.active.disabled:active,
+.datepicker table tr td span.active.disabled:hover:active,
+.datepicker table tr td span.active.active,
+.datepicker table tr td span.active:hover.active,
+.datepicker table tr td span.active.disabled.active,
+.datepicker table tr td span.active.disabled:hover.active,
+.open .dropdown-toggle.datepicker table tr td span.active,
+.open .dropdown-toggle.datepicker table tr td span.active:hover,
+.open .dropdown-toggle.datepicker table tr td span.active.disabled,
+.open .dropdown-toggle.datepicker table tr td span.active.disabled:hover {
+ color: #ffffff;
+ background-color: #3276b1;
+ border-color: #285e8e;
+}
+
+.datepicker table tr td span.active:active,
+.datepicker table tr td span.active:hover:active,
+.datepicker table tr td span.active.disabled:active,
+.datepicker table tr td span.active.disabled:hover:active,
+.datepicker table tr td span.active.active,
+.datepicker table tr td span.active:hover.active,
+.datepicker table tr td span.active.disabled.active,
+.datepicker table tr td span.active.disabled:hover.active,
+.open .dropdown-toggle.datepicker table tr td span.active,
+.open .dropdown-toggle.datepicker table tr td span.active:hover,
+.open .dropdown-toggle.datepicker table tr td span.active.disabled,
+.open .dropdown-toggle.datepicker table tr td span.active.disabled:hover {
+ background-image: none;
+}
+
+.datepicker table tr td span.active.disabled,
+.datepicker table tr td span.active:hover.disabled,
+.datepicker table tr td span.active.disabled.disabled,
+.datepicker table tr td span.active.disabled:hover.disabled,
+.datepicker table tr td span.active[disabled],
+.datepicker table tr td span.active:hover[disabled],
+.datepicker table tr td span.active.disabled[disabled],
+.datepicker table tr td span.active.disabled:hover[disabled],
+fieldset[disabled] .datepicker table tr td span.active,
+fieldset[disabled] .datepicker table tr td span.active:hover,
+fieldset[disabled] .datepicker table tr td span.active.disabled,
+fieldset[disabled] .datepicker table tr td span.active.disabled:hover,
+.datepicker table tr td span.active.disabled:hover,
+.datepicker table tr td span.active:hover.disabled:hover,
+.datepicker table tr td span.active.disabled.disabled:hover,
+.datepicker table tr td span.active.disabled:hover.disabled:hover,
+.datepicker table tr td span.active[disabled]:hover,
+.datepicker table tr td span.active:hover[disabled]:hover,
+.datepicker table tr td span.active.disabled[disabled]:hover,
+.datepicker table tr td span.active.disabled:hover[disabled]:hover,
+fieldset[disabled] .datepicker table tr td span.active:hover,
+fieldset[disabled] .datepicker table tr td span.active:hover:hover,
+fieldset[disabled] .datepicker table tr td span.active.disabled:hover,
+fieldset[disabled] .datepicker table tr td span.active.disabled:hover:hover,
+.datepicker table tr td span.active.disabled:focus,
+.datepicker table tr td span.active:hover.disabled:focus,
+.datepicker table tr td span.active.disabled.disabled:focus,
+.datepicker table tr td span.active.disabled:hover.disabled:focus,
+.datepicker table tr td span.active[disabled]:focus,
+.datepicker table tr td span.active:hover[disabled]:focus,
+.datepicker table tr td span.active.disabled[disabled]:focus,
+.datepicker table tr td span.active.disabled:hover[disabled]:focus,
+fieldset[disabled] .datepicker table tr td span.active:focus,
+fieldset[disabled] .datepicker table tr td span.active:hover:focus,
+fieldset[disabled] .datepicker table tr td span.active.disabled:focus,
+fieldset[disabled] .datepicker table tr td span.active.disabled:hover:focus,
+.datepicker table tr td span.active.disabled:active,
+.datepicker table tr td span.active:hover.disabled:active,
+.datepicker table tr td span.active.disabled.disabled:active,
+.datepicker table tr td span.active.disabled:hover.disabled:active,
+.datepicker table tr td span.active[disabled]:active,
+.datepicker table tr td span.active:hover[disabled]:active,
+.datepicker table tr td span.active.disabled[disabled]:active,
+.datepicker table tr td span.active.disabled:hover[disabled]:active,
+fieldset[disabled] .datepicker table tr td span.active:active,
+fieldset[disabled] .datepicker table tr td span.active:hover:active,
+fieldset[disabled] .datepicker table tr td span.active.disabled:active,
+fieldset[disabled] .datepicker table tr td span.active.disabled:hover:active,
+.datepicker table tr td span.active.disabled.active,
+.datepicker table tr td span.active:hover.disabled.active,
+.datepicker table tr td span.active.disabled.disabled.active,
+.datepicker table tr td span.active.disabled:hover.disabled.active,
+.datepicker table tr td span.active[disabled].active,
+.datepicker table tr td span.active:hover[disabled].active,
+.datepicker table tr td span.active.disabled[disabled].active,
+.datepicker table tr td span.active.disabled:hover[disabled].active,
+fieldset[disabled] .datepicker table tr td span.active.active,
+fieldset[disabled] .datepicker table tr td span.active:hover.active,
+fieldset[disabled] .datepicker table tr td span.active.disabled.active,
+fieldset[disabled] .datepicker table tr td span.active.disabled:hover.active {
+ background-color: #428bca;
+ border-color: #357ebd;
+}
+
+.datepicker table tr td span.old,
+.datepicker table tr td span.new {
+ color: #444;
+}
+
+.datepicker th.datepicker-switch {
+ width: 145px;
+}
+
+.datepicker thead tr:first-child th,
+.datepicker tfoot tr th {
+ cursor: pointer;
+}
+
+.datepicker thead tr:first-child th:hover,
+.datepicker tfoot tr th:hover {
+ background: rgba(0, 0, 0, 0.2);
+}
+
+.datepicker .cw {
+ font-size: 10px;
+ width: 12px;
+ padding: 0 2px 0 5px;
+ vertical-align: middle;
+}
+
+.datepicker thead tr:first-child th.cw {
+ cursor: default;
+ background-color: transparent;
+}
+
+.input-group.date .input-group-addon i {
+ cursor: pointer;
+ width: 16px;
+ height: 16px;
+}
+
+.input-daterange input {
+ text-align: center;
+}
+
+.input-daterange input:first-child {
+ border-radius: 3px 0 0 3px;
+}
+
+.input-daterange input:last-child {
+ border-radius: 0 3px 3px 0;
+}
+
+.input-daterange .input-group-addon {
+ width: auto;
+ min-width: 16px;
+ padding: 4px 5px;
+ font-weight: normal;
+ line-height: 1.428571429;
+ text-align: center;
+ text-shadow: 0 1px 0 #fff;
+ vertical-align: middle;
+ background-color: #eeeeee;
+ border: solid #cccccc;
+ border-width: 1px 0;
+ margin-left: -5px;
+ margin-right: -5px;
+}
+
+.datepicker.dropdown-menu {
+ position: absolute;
+ top: 100%;
+ left: 0;
+ z-index: 1000;
+ float: left;
+ display: none;
+ min-width: 160px;
+ list-style: none;
+ background-color: #ffffff;
+ border: 1px solid #ccc;
+ border: 1px solid rgba(0, 0, 0, 0.2);
+ border-radius: 5px;
+ -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+ -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+ box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+ -webkit-background-clip: padding-box;
+ -moz-background-clip: padding;
+ background-clip: padding-box;
+ *border-right-width: 2px;
+ *border-bottom-width: 2px;
+ color: #333333;
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ font-size: 13px;
+ line-height: 1.428571429;
+}
+
+.datepicker.dropdown-menu th,
+.datepicker.dropdown-menu td {
+ padding: 4px 5px;
+}
\ No newline at end of file
diff --git a/src/assets/plugins/bootstrap-datepicker/js/bootstrap-datepicker.js b/src/assets/plugins/bootstrap-datepicker/js/bootstrap-datepicker.js
new file mode 100644
index 0000000..541ab17
--- /dev/null
+++ b/src/assets/plugins/bootstrap-datepicker/js/bootstrap-datepicker.js
@@ -0,0 +1,2046 @@
+/*!
+ * Datepicker for Bootstrap v1.10.0 (https://github.com/uxsolutions/bootstrap-datepicker)
+ *
+ * Licensed under the Apache License v2.0 (https://www.apache.org/licenses/LICENSE-2.0)
+ */
+
+(function (factory) {
+ var define;
+ if (typeof define === 'function' && define.amd) {
+ define(['jquery'], factory);
+ } else if (typeof exports === 'object') {
+ factory(require('jquery'));
+ } else {
+ factory(jQuery);
+ }
+}(function ($, obj = undefined) {
+ function UTCDate() {
+ return new Date(Date.UTC.apply(Date, arguments));
+ }
+ function UTCToday() {
+ var today = new Date();
+ return UTCDate(today.getFullYear(), today.getMonth(), today.getDate());
+ }
+ function isUTCEquals(date1, date2) {
+ return (
+ date1.getUTCFullYear() === date2.getUTCFullYear() &&
+ date1.getUTCMonth() === date2.getUTCMonth() &&
+ date1.getUTCDate() === date2.getUTCDate()
+ );
+ }
+ function alias(method, deprecationMsg) {
+ return function () {
+ if (deprecationMsg !== undefined) {
+ $.fn.datepicker.deprecated(deprecationMsg);
+ }
+
+ return this[method].apply(this, arguments);
+ };
+ }
+ function isValidDate(d) {
+ return d && !isNaN(d.getTime());
+ }
+
+ var DateArray = (function () {
+ var extras = {
+ get: function (i) {
+ return this.slice(i)[0];
+ },
+ contains: function (d) {
+ // Array.indexOf is not cross-browser;
+ // $.inArray doesn't work with Dates
+ var val = d && d.valueOf();
+ for (var i = 0, l = this.length; i < l; i++)
+ // Use date arithmetic to allow dates with different times to match
+ if (0 <= this[i].valueOf() - val && this[i].valueOf() - val < 1000 * 60 * 60 * 24)
+ return i;
+ return -1;
+ },
+ remove: function (i) {
+ this.splice(i, 1);
+ },
+ replace: function (new_array) {
+ if (!new_array)
+ return;
+ if (!Array.isArray(new_array))
+ new_array = [new_array];
+ this.clear();
+ this.push.apply(this, new_array);
+ },
+ clear: function () {
+ this.length = 0;
+ },
+ copy: function () {
+ var a = new DateArray();
+ a.replace(this);
+ return a;
+ }
+ };
+
+ return function () {
+ var a = [];
+ a.push.apply(a, arguments);
+ $.extend(a, extras);
+ return a;
+ };
+ })();
+
+
+ // Picker object
+
+ var Datepicker = function (element, options) {
+ $.data(element, 'datepicker', this);
+
+ this._events = [];
+ this._secondaryEvents = [];
+
+ this._process_options(options);
+
+ this.dates = new DateArray();
+ this.viewDate = this.o.defaultViewDate;
+ this.focusDate = null;
+
+ this.element = $(element);
+ this.isInput = this.element.is('input');
+ this.inputField = this.isInput ? this.element : this.element.find('input');
+ this.component = this.element.hasClass('date') ? this.element.find('.add-on, .input-group-addon, .input-group-append, .input-group-prepend, .btn') : false;
+ if (this.component && this.component.length === 0) {
+ this.component = false;
+ }
+
+ if (this.o.isInline === null) {
+ this.isInline = !this.component && !this.isInput;
+ } else {
+ this.isInline = this.o.isInline;
+ }
+
+ this.picker = $(DPGlobal.template);
+
+ // Checking templates and inserting
+ if (this._check_template(this.o.templates.leftArrow)) {
+ this.picker.find('.prev').html(this.o.templates.leftArrow);
+ }
+
+ if (this._check_template(this.o.templates.rightArrow)) {
+ this.picker.find('.next').html(this.o.templates.rightArrow);
+ }
+
+ this._buildEvents();
+ this._attachEvents();
+
+ if (this.isInline) {
+ this.picker.addClass('datepicker-inline').appendTo(this.element);
+ }
+ else {
+ this.picker.addClass('datepicker-dropdown dropdown-menu');
+ }
+
+ if (this.o.rtl) {
+ this.picker.addClass('datepicker-rtl');
+ }
+
+ if (this.o.calendarWeeks) {
+ this.picker.find('.datepicker-days .datepicker-switch, thead .datepicker-title, tfoot .today, tfoot .clear')
+ .attr('colspan', function (i, val) {
+ return Number(val) + 1;
+ });
+ }
+
+ this._process_options({
+ startDate: this._o.startDate,
+ endDate: this._o.endDate,
+ daysOfWeekDisabled: this.o.daysOfWeekDisabled,
+ daysOfWeekHighlighted: this.o.daysOfWeekHighlighted,
+ datesDisabled: this.o.datesDisabled
+ });
+
+ this._allow_update = false;
+ this.setViewMode(this.o.startView);
+ this._allow_update = true;
+
+ this.fillDow();
+ this.fillMonths();
+
+ this.update();
+
+ if (this.isInline) {
+ this.show();
+ }
+ };
+
+ Datepicker.prototype = {
+ constructor: Datepicker,
+
+ _resolveViewName: function (view) {
+ $.each(DPGlobal.viewModes, function (i, viewMode) {
+ if (view === i || $.inArray(view, viewMode.names) !== -1) {
+ view = i;
+ return false;
+ }
+ });
+
+ return view;
+ },
+
+ _resolveDaysOfWeek: function (daysOfWeek) {
+ if (!Array.isArray(daysOfWeek))
+ daysOfWeek = daysOfWeek.split(/[,\s]*/);
+ return $.map(daysOfWeek, Number);
+ },
+
+ _check_template: function (tmp) {
+ try {
+ // If empty
+ if (tmp === undefined || tmp === "") {
+ return false;
+ }
+ // If no html, everything ok
+ if ((tmp.match(/[<>]/g) || []).length <= 0) {
+ return true;
+ }
+ // Checking if html is fine
+ var jDom = $(tmp);
+ return jDom.length > 0;
+ }
+ catch (ex) {
+ return false;
+ }
+ },
+
+ _process_options: function (opts) {
+ // Store raw options for reference
+ this._o = $.extend({}, this._o, opts);
+ // Processed options
+ var o = this.o = $.extend({}, this._o);
+
+ // Check if "de-DE" style date is available, if not language should
+ // fallback to 2 letter code eg "de"
+ var lang = o.language;
+ if (!dates[lang]) {
+ lang = lang.split('-')[0];
+ if (!dates[lang])
+ lang = defaults.language;
+ }
+ o.language = lang;
+
+ // Retrieve view index from any aliases
+ o.startView = this._resolveViewName(o.startView);
+ o.minViewMode = this._resolveViewName(o.minViewMode);
+ o.maxViewMode = this._resolveViewName(o.maxViewMode);
+
+ // Check view is between min and max
+ o.startView = Math.max(this.o.minViewMode, Math.min(this.o.maxViewMode, o.startView));
+
+ // true, false, or Number > 0
+ if (o.multidate !== true) {
+ o.multidate = Number(o.multidate) || false;
+ if (o.multidate !== false)
+ o.multidate = Math.max(0, o.multidate);
+ }
+ o.multidateSeparator = String(o.multidateSeparator);
+
+ o.weekStart %= 7;
+ o.weekEnd = (o.weekStart + 6) % 7;
+
+ var format = DPGlobal.parseFormat(o.format);
+ if (o.startDate !== -Infinity) {
+ if (!o.startDate) {
+ if (o.startDate instanceof Date)
+ o.startDate = this._local_to_utc(this._zero_time(o.startDate));
+ else
+ o.startDate = DPGlobal.parseDate(o.startDate, format, o.language, o.assumeNearbyYear);
+ }
+ else {
+ o.startDate = -Infinity;
+ }
+ }
+ if (o.endDate !== Infinity) {
+ if (!o.endDate) {
+ if (o.endDate instanceof Date)
+ o.endDate = this._local_to_utc(this._zero_time(o.endDate));
+ else
+ o.endDate = DPGlobal.parseDate(o.endDate, format, o.language, o.assumeNearbyYear);
+ }
+ else {
+ o.endDate = Infinity;
+ }
+ }
+
+ o.daysOfWeekDisabled = this._resolveDaysOfWeek(o.daysOfWeekDisabled || []);
+ o.daysOfWeekHighlighted = this._resolveDaysOfWeek(o.daysOfWeekHighlighted || []);
+
+ o.datesDisabled = o.datesDisabled || [];
+ if (!Array.isArray(o.datesDisabled)) {
+ o.datesDisabled = o.datesDisabled.split(',');
+ }
+ o.datesDisabled = $.map(o.datesDisabled, function (d) {
+ return DPGlobal.parseDate(d, format, o.language, o.assumeNearbyYear);
+ });
+
+ var plc = String(o.orientation).toLowerCase().split(/\s+/g),
+ _plc = o.orientation.toLowerCase();
+ plc = $.grep(plc, function (word) {
+ return /^auto|left|right|top|bottom$/.test(word);
+ });
+ o.orientation = { x: 'auto', y: 'auto' };
+ if (!_plc || _plc === 'auto')
+ ; // no action
+ else if (plc.length === 1) {
+ switch (plc[0]) {
+ case 'top':
+ case 'bottom':
+ o.orientation.y = plc[0];
+ break;
+ case 'left':
+ case 'right':
+ o.orientation.x = plc[0];
+ break;
+ }
+ }
+ else {
+ _plc = $.grep(plc, function (word) {
+ return /^left|right$/.test(word);
+ });
+ o.orientation.x = _plc[0] || 'auto';
+
+ _plc = $.grep(plc, function (word) {
+ return /^top|bottom$/.test(word);
+ });
+ o.orientation.y = _plc[0] || 'auto';
+ }
+ if (o.defaultViewDate instanceof Date || typeof o.defaultViewDate === 'string') {
+ o.defaultViewDate = DPGlobal.parseDate(o.defaultViewDate, format, o.language, o.assumeNearbyYear);
+ } else if (o.defaultViewDate) {
+ var year = o.defaultViewDate.year || new Date().getFullYear();
+ var month = o.defaultViewDate.month || 0;
+ var day = o.defaultViewDate.day || 1;
+ o.defaultViewDate = UTCDate(year, month, day);
+ } else {
+ o.defaultViewDate = UTCToday();
+ }
+ },
+ _applyEvents: function (evs) {
+ for (var i = 0, el, ch, ev; i < evs.length; i++) {
+ el = evs[i][0];
+ if (evs[i].length === 2) {
+ ch = undefined;
+ ev = evs[i][1];
+ } else if (evs[i].length === 3) {
+ ch = evs[i][1];
+ ev = evs[i][2];
+ }
+ el.on(ev, ch);
+ }
+ },
+ _unapplyEvents: function (evs) {
+ for (var i = 0, el, ev, ch; i < evs.length; i++) {
+ el = evs[i][0];
+ if (evs[i].length === 2) {
+ ch = undefined;
+ ev = evs[i][1];
+ } else if (evs[i].length === 3) {
+ ch = evs[i][1];
+ ev = evs[i][2];
+ }
+ el.off(ev, ch);
+ }
+ },
+ _buildEvents: function () {
+ var events = {
+ keyup: $.proxy(function (e) {
+ if ($.inArray(e.keyCode, [27, 37, 39, 38, 40, 32, 13, 9]) === -1)
+ this.update();
+ }, this),
+ keydown: $.proxy(this.keydown, this),
+ paste: $.proxy(this.paste, this)
+ };
+
+ if (this.o.showOnFocus === true) {
+ events.focus = $.proxy(this.show, this);
+ }
+
+ if (this.isInput) { // single input
+ this._events = [
+ [this.element, events]
+ ];
+ }
+ // component: input + button
+ else if (this.component && this.inputField.length) {
+ this._events = [
+ // For components that are not readonly, allow keyboard nav
+ [this.inputField, events],
+ [this.component, {
+ click: $.proxy(this.show, this)
+ }]
+ ];
+ }
+ else {
+ this._events = [
+ [this.element, {
+ click: $.proxy(this.show, this),
+ keydown: $.proxy(this.keydown, this)
+ }]
+ ];
+ }
+ this._events.push(
+ // Component: listen for blur on element descendants
+ [this.element, '*', {
+ blur: $.proxy(function (e) {
+ this._focused_from = e.target;
+ }, this)
+ }],
+ // Input: listen for blur on element
+ [this.element, {
+ blur: $.proxy(function (e) {
+ this._focused_from = e.target;
+ }, this)
+ }]
+ );
+
+ if (this.o.immediateUpdates) {
+ // Trigger input updates immediately on changed year/month
+ this._events.push([this.element, {
+ 'changeYear changeMonth': $.proxy(function (e) {
+ this.update(e.date);
+ }, this)
+ }]);
+ }
+
+ this._secondaryEvents = [
+ [this.picker, {
+ click: $.proxy(this.click, this)
+ }],
+ [this.picker, '.prev, .next', {
+ click: $.proxy(this.navArrowsClick, this)
+ }],
+ [this.picker, '.day:not(.disabled)', {
+ click: $.proxy(this.dayCellClick, this)
+ }],
+ [$(window), {
+ resize: $.proxy(this.place, this)
+ }],
+ [$(document), {
+ 'mousedown touchstart': $.proxy(function (e) {
+ // Clicked outside the datepicker, hide it
+ if (!(
+ this.element.is(e.target) ||
+ this.element.find(e.target).length ||
+ this.picker.is(e.target) ||
+ this.picker.find(e.target).length ||
+ this.isInline
+ )) {
+ this.hide();
+ }
+ }, this)
+ }]
+ ];
+ },
+ _attachEvents: function () {
+ this._detachEvents();
+ this._applyEvents(this._events);
+ },
+ _detachEvents: function () {
+ this._unapplyEvents(this._events);
+ },
+ _attachSecondaryEvents: function () {
+ this._detachSecondaryEvents();
+ this._applyEvents(this._secondaryEvents);
+ },
+ _detachSecondaryEvents: function () {
+ this._unapplyEvents(this._secondaryEvents);
+ },
+ _trigger: function (event, altdate) {
+ var date = altdate || this.dates.get(-1),
+ local_date = this._utc_to_local(date);
+
+ this.element.trigger({
+ type: event,
+ date: local_date,
+ viewMode: this.viewMode,
+ dates: $.map(this.dates, this._utc_to_local),
+ format: $.proxy(function (ix, format) {
+ if (arguments.length === 0) {
+ ix = this.dates.length - 1;
+ format = this.o.format;
+ } else if (typeof ix === 'string') {
+ format = ix;
+ ix = this.dates.length - 1;
+ }
+ format = format || this.o.format;
+ var date = this.dates.get(ix);
+ return DPGlobal.formatDate(date, format, this.o.language);
+ }, this)
+ });
+ },
+
+ show: function () {
+ if (this.inputField.is(':disabled') || (this.inputField.prop('readonly') && this.o.enableOnReadonly === false))
+ return;
+ if (!this.isInline)
+ this.picker.appendTo(this.o.container);
+ this.place();
+ this.picker.show();
+ this._attachSecondaryEvents();
+ this._trigger('show');
+ if ((window.navigator.msMaxTouchPoints || 'ontouchstart' in document) && this.o.disableTouchKeyboard) {
+ $(this.element).blur();
+ }
+ return this;
+ },
+
+ hide: function () {
+ if (this.isInline || !this.picker.is(':visible'))
+ return this;
+ this.focusDate = null;
+ this.picker.hide().detach();
+ this._detachSecondaryEvents();
+ this.setViewMode(this.o.startView);
+
+ if (this.o.forceParse && this.inputField.val())
+ this.setValue();
+ this._trigger('hide');
+ return this;
+ },
+
+ destroy: function () {
+ this.hide();
+ this._detachEvents();
+ this._detachSecondaryEvents();
+ this.picker.remove();
+ delete this.element.data().datepicker;
+ if (!this.isInput) {
+ delete this.element.data().date;
+ }
+ return this;
+ },
+
+ paste: function (e) {
+ var dateString;
+ if (e.originalEvent.clipboardData && e.originalEvent.clipboardData.types
+ && $.inArray('text/plain', e.originalEvent.clipboardData.types) !== -1) {
+ dateString = e.originalEvent.clipboardData.getData('text/plain');
+ } else if (window.clipboardData) {
+ dateString = window.clipboardData.getData('Text');
+ } else {
+ return;
+ }
+ this.setDate(dateString);
+ this.update();
+ e.preventDefault();
+ },
+
+ _utc_to_local: function (utc) {
+ if (!utc) {
+ return utc;
+ }
+
+ var local = new Date(utc.getTime() + (utc.getTimezoneOffset() * 60000));
+
+ if (local.getTimezoneOffset() !== utc.getTimezoneOffset()) {
+ local = new Date(utc.getTime() + (local.getTimezoneOffset() * 60000));
+ }
+
+ return local;
+ },
+ _local_to_utc: function (local) {
+ return local && new Date(local.getTime() - (local.getTimezoneOffset() * 60000));
+ },
+ _zero_time: function (local) {
+ return local && new Date(local.getFullYear(), local.getMonth(), local.getDate());
+ },
+ _zero_utc_time: function (utc) {
+ return utc && UTCDate(utc.getUTCFullYear(), utc.getUTCMonth(), utc.getUTCDate());
+ },
+
+ getDates: function () {
+ return $.map(this.dates, this._utc_to_local);
+ },
+
+ getUTCDates: function () {
+ return $.map(this.dates, function (d) {
+ return new Date(d);
+ });
+ },
+
+ getDate: function () {
+ return this._utc_to_local(this.getUTCDate());
+ },
+
+ getUTCDate: function () {
+ var selected_date = this.dates.get(-1);
+ if (selected_date !== undefined) {
+ return new Date(selected_date);
+ } else {
+ return null;
+ }
+ },
+
+ clearDates: function () {
+ this.inputField.val('');
+ this._trigger('changeDate');
+ this.update();
+ if (this.o.autoclose) {
+ this.hide();
+ }
+ },
+
+ setDates: function () {
+ var args = Array.isArray(arguments[0]) ? arguments[0] : arguments;
+ this.update.apply(this, args);
+ this._trigger('changeDate');
+ this.setValue();
+ return this;
+ },
+
+ setUTCDates: function () {
+ var args = Array.isArray(arguments[0]) ? arguments[0] : arguments;
+ this.setDates.apply(this, $.map(args, this._utc_to_local));
+ return this;
+ },
+
+ setDate: alias('setDates'),
+ setUTCDate: alias('setUTCDates'),
+ remove: alias('destroy', 'Method `remove` is deprecated and will be removed in version 2.0. Use `destroy` instead'),
+
+ setValue: function () {
+ var formatted = this.getFormattedDate();
+ this.inputField.val(formatted);
+ return this;
+ },
+
+ getFormattedDate: function (format) {
+ if (format === undefined)
+ format = this.o.format;
+
+ var lang = this.o.language;
+ return $.map(this.dates, function (d) {
+ return DPGlobal.formatDate(d, format, lang);
+ }).join(this.o.multidateSeparator);
+ },
+
+ getStartDate: function () {
+ return this.o.startDate;
+ },
+
+ setStartDate: function (startDate) {
+ this._process_options({ startDate: startDate });
+ this.update();
+ this.updateNavArrows();
+ return this;
+ },
+
+ getEndDate: function () {
+ return this.o.endDate;
+ },
+
+ setEndDate: function (endDate) {
+ this._process_options({ endDate: endDate });
+ this.update();
+ this.updateNavArrows();
+ return this;
+ },
+
+ setDaysOfWeekDisabled: function (daysOfWeekDisabled) {
+ this._process_options({ daysOfWeekDisabled: daysOfWeekDisabled });
+ this.update();
+ return this;
+ },
+
+ setDaysOfWeekHighlighted: function (daysOfWeekHighlighted) {
+ this._process_options({ daysOfWeekHighlighted: daysOfWeekHighlighted });
+ this.update();
+ return this;
+ },
+
+ setDatesDisabled: function (datesDisabled) {
+ this._process_options({ datesDisabled: datesDisabled });
+ this.update();
+ return this;
+ },
+
+ place: function () {
+ if (this.isInline)
+ return this;
+ var calendarWidth = this.picker.outerWidth(),
+ calendarHeight = this.picker.outerHeight(),
+ visualPadding = 10,
+ container = $(this.o.container),
+ windowWidth = container.width(),
+ scrollTop = this.o.container === 'body' ? $(document).scrollTop() : container.scrollTop(),
+ appendOffset = container.offset();
+
+ var parentsZindex = [0];
+ this.element.parents().each(function () {
+ var itemZIndex = $(this).css('z-index');
+ if (itemZIndex !== 'auto' && Number(itemZIndex) !== 0) parentsZindex.push(Number(itemZIndex));
+ });
+ var zIndex = Math.max.apply(Math, parentsZindex) + this.o.zIndexOffset;
+ var offset = this.component ? this.component.parent().offset() : this.element.offset();
+ var height = this.component ? this.component.outerHeight(true) : this.element.outerHeight(false);
+ var width = this.component ? this.component.outerWidth(true) : this.element.outerWidth(false);
+ var left = offset.left - appendOffset.left;
+ var top = offset.top - appendOffset.top;
+
+ if (this.o.container !== 'body') {
+ top += scrollTop;
+ }
+
+ this.picker.removeClass(
+ 'datepicker-orient-top datepicker-orient-bottom ' +
+ 'datepicker-orient-right datepicker-orient-left'
+ );
+
+ if (this.o.orientation.x !== 'auto') {
+ this.picker.addClass('datepicker-orient-' + this.o.orientation.x);
+ if (this.o.orientation.x === 'right')
+ left -= calendarWidth - width;
+ }
+ // auto x orientation is best-placement: if it crosses a window
+ // edge, fudge it sideways
+ else {
+ if (offset.left < 0) {
+ // component is outside the window on the left side. Move it into visible range
+ this.picker.addClass('datepicker-orient-left');
+ left -= offset.left - visualPadding;
+ } else if (left + calendarWidth > windowWidth) {
+ // the calendar passes the widow right edge. Align it to component right side
+ this.picker.addClass('datepicker-orient-right');
+ left += width - calendarWidth;
+ } else {
+ if (this.o.rtl) {
+ // Default to right
+ this.picker.addClass('datepicker-orient-right');
+ } else {
+ // Default to left
+ this.picker.addClass('datepicker-orient-left');
+ }
+ }
+ }
+
+ // auto y orientation is best-situation: top or bottom, no fudging,
+ // decision based on which shows more of the calendar
+ var yorient = this.o.orientation.y,
+ top_overflow;
+ if (yorient === 'auto') {
+ top_overflow = -scrollTop + top - calendarHeight;
+ yorient = top_overflow < 0 ? 'bottom' : 'top';
+ }
+
+ this.picker.addClass('datepicker-orient-' + yorient);
+ if (yorient === 'top')
+ top -= calendarHeight + parseInt(this.picker.css('padding-top'));
+ else
+ top += height;
+
+ if (this.o.rtl) {
+ var right = windowWidth - (left + width);
+ this.picker.css({
+ top: top,
+ right: right,
+ zIndex: zIndex
+ });
+ } else {
+ this.picker.css({
+ top: top,
+ left: left,
+ zIndex: zIndex
+ });
+ }
+ return this;
+ },
+
+ _allow_update: true,
+ update: function () {
+ if (!this._allow_update)
+ return this;
+
+ var oldDates = this.dates.copy(),
+ dates = [],
+ fromArgs = false;
+ if (arguments.length) {
+ $.each(arguments, $.proxy(function (i, date) {
+ if (date instanceof Date)
+ date = this._local_to_utc(date);
+ dates.push(date);
+ }, this));
+ fromArgs = true;
+ } else {
+ dates = this.isInput
+ ? this.element.val()
+ : this.element.data('date') || this.inputField.val();
+ if (dates && this.o.multidate)
+ dates = dates.split(this.o.multidateSeparator);
+ else
+ dates = [dates];
+ delete this.element.data().date;
+ }
+
+ dates = $.map(dates, $.proxy(function (date) {
+ return DPGlobal.parseDate(date, this.o.format, this.o.language, this.o.assumeNearbyYear);
+ }, this));
+ dates = $.grep(dates, $.proxy(function (date) {
+ return (
+ !this.dateWithinRange(date) ||
+ !date
+ );
+ }, this), true);
+ this.dates.replace(dates);
+
+ if (this.o.updateViewDate) {
+ if (this.dates.length)
+ this.viewDate = new Date(this.dates.get(-1));
+ else if (this.viewDate < this.o.startDate)
+ this.viewDate = new Date(this.o.startDate);
+ else if (this.viewDate > this.o.endDate)
+ this.viewDate = new Date(this.o.endDate);
+ else
+ this.viewDate = this.o.defaultViewDate;
+ }
+
+ if (fromArgs) {
+ // setting date by clicking
+ this.setValue();
+ this.element.change();
+ }
+ else if (this.dates.length) {
+ // setting date by typing
+ if (String(oldDates) !== String(this.dates) && fromArgs) {
+ this._trigger('changeDate');
+ this.element.change();
+ }
+ }
+ if (!this.dates.length && oldDates.length) {
+ this._trigger('clearDate');
+ this.element.change();
+ }
+
+ this.fill();
+ return this;
+ },
+
+ fillDow: function () {
+ if (this.o.showWeekDays) {
+ var dowCnt = this.o.weekStart,
+ html = '';
+ if (this.o.calendarWeeks) {
+ html += ' ';
+ }
+ while (dowCnt < this.o.weekStart + 7) {
+ html += '' + dates[this.o.language].daysMin[(dowCnt++) % 7] + ' ';
+ }
+ html += ' ';
+ this.picker.find('.datepicker-days thead').append(html);
+ }
+ },
+
+ fillMonths: function () {
+ var localDate = this._utc_to_local(this.viewDate);
+ var html = '';
+ var focused;
+ for (var i = 0; i < 12; i++) {
+ focused = localDate && localDate.getMonth() === i ? ' focused' : '';
+ html += '' + dates[this.o.language].monthsShort[i] + ' ';
+ }
+ this.picker.find('.datepicker-months td').html(html);
+ },
+
+ setRange: function (range) {
+ if (!range || !range.length)
+ delete this.range;
+ else
+ this.range = $.map(range, function (d) {
+ return d.valueOf();
+ });
+ this.fill();
+ },
+
+ getClassNames: function (date) {
+ var cls = [],
+ year = this.viewDate.getUTCFullYear(),
+ month = this.viewDate.getUTCMonth(),
+ today = UTCToday();
+ if (date.getUTCFullYear() < year || (date.getUTCFullYear() === year && date.getUTCMonth() < month)) {
+ cls.push('old');
+ } else if (date.getUTCFullYear() > year || (date.getUTCFullYear() === year && date.getUTCMonth() > month)) {
+ cls.push('new');
+ }
+ if (this.focusDate && date.valueOf() === this.focusDate.valueOf())
+ cls.push('focused');
+ // Compare internal UTC date with UTC today, not local today
+ if (this.o.todayHighlight && isUTCEquals(date, today)) {
+ cls.push('today');
+ }
+ if (this.dates.contains(date) !== -1)
+ cls.push('active');
+ if (!this.dateWithinRange(date)) {
+ cls.push('disabled');
+ }
+ if (this.dateIsDisabled(date)) {
+ cls.push('disabled', 'disabled-date');
+ }
+ if ($.inArray(date.getUTCDay(), this.o.daysOfWeekHighlighted) !== -1) {
+ cls.push('highlighted');
+ }
+
+ if (this.range) {
+ if (date > this.range[0] && date < this.range[this.range.length - 1]) {
+ cls.push('range');
+ }
+ if ($.inArray(date.valueOf(), this.range) !== -1) {
+ cls.push('selected');
+ }
+ if (date.valueOf() === this.range[0]) {
+ cls.push('range-start');
+ }
+ if (date.valueOf() === this.range[this.range.length - 1]) {
+ cls.push('range-end');
+ }
+ }
+ return cls;
+ },
+
+ _fill_yearsView: function (selector, cssClass, factor, year, startYear, endYear, beforeFn) {
+ var html = '';
+ var step = factor / 10;
+ var view = this.picker.find(selector);
+ var startVal = Math.floor(year / factor) * factor;
+ var endVal = startVal + step * 9;
+ var focusedVal = Math.floor(this.viewDate.getFullYear() / step) * step;
+ var selected = $.map(this.dates, function (d) {
+ return Math.floor(d.getUTCFullYear() / step) * step;
+ });
+
+ var classes, tooltip, before;
+ for (var currVal = startVal - step; currVal <= endVal + step; currVal += step) {
+ classes = [cssClass];
+ tooltip = null;
+
+ if (currVal === startVal - step) {
+ classes.push('old');
+ } else if (currVal === endVal + step) {
+ classes.push('new');
+ }
+ if ($.inArray(currVal, selected) !== -1) {
+ classes.push('active');
+ }
+ if (currVal < startYear || currVal > endYear) {
+ classes.push('disabled');
+ }
+ if (currVal === focusedVal) {
+ classes.push('focused');
+ }
+
+ if (beforeFn !== $.noop) {
+ before = beforeFn(new Date(currVal, 0, 1));
+ if (before === undefined) {
+ before = {};
+ } else if (typeof before === 'boolean') {
+ before = { enabled: before };
+ } else if (typeof before === 'string') {
+ before = { classes: before };
+ }
+ if (before.enabled === false) {
+ classes.push('disabled');
+ }
+ if (before.classes) {
+ classes = classes.concat(before.classes.split(/\s+/));
+ }
+ if (before.tooltip) {
+ tooltip = before.tooltip;
+ }
+ }
+
+ html += '' + currVal + ' ';
+ }
+
+ view.find('.datepicker-switch').text(startVal + '-' + endVal);
+ view.find('td').html(html);
+ },
+
+ fill: function () {
+ var d = new Date(this.viewDate),
+ year = d.getUTCFullYear(),
+ month = d.getUTCMonth(),
+ startYear = this.o.startDate !== -Infinity ? new Date(this.o.startDate).getUTCFullYear() : -Infinity,
+ startMonth = this.o.startDate !== -Infinity ? new Date(this.o.startDate).getUTCMonth() : -Infinity,
+ endYear = this.o.endDate !== Infinity ? new Date(this.o.endDate).getUTCFullYear() : Infinity,
+ endMonth = this.o.endDate !== Infinity ? new Date(this.o.endDate).getUTCMonth() : Infinity,
+ todaytxt = dates[this.o.language].today || dates['en'].today || '',
+ cleartxt = dates[this.o.language].clear || dates['en'].clear || '',
+ titleFormat = dates[this.o.language].titleFormat || dates['en'].titleFormat,
+ todayDate = UTCToday(),
+ titleBtnVisible = (this.o.todayBtn === true || this.o.todayBtn === 'linked') && todayDate >= this.o.startDate && todayDate <= this.o.endDate && !this.weekOfDateIsDisabled(todayDate),
+ tooltip,
+ before;
+ if (isNaN(year) || isNaN(month))
+ return;
+ this.picker.find('.datepicker-days .datepicker-switch')
+ .text(DPGlobal.formatDate(d, titleFormat, this.o.language));
+ this.picker.find('tfoot .today')
+ .text(todaytxt)
+ .css('display', titleBtnVisible ? 'table-cell' : 'none');
+ this.picker.find('tfoot .clear')
+ .text(cleartxt)
+ .css('display', this.o.clearBtn === true ? 'table-cell' : 'none');
+ this.picker.find('thead .datepicker-title')
+ .text(this.o.title)
+ .css('display', typeof this.o.title === 'string' && this.o.title !== '' ? 'table-cell' : 'none');
+ this.updateNavArrows();
+ this.fillMonths();
+ var prevMonth = UTCDate(year, month, 0),
+ day = prevMonth.getUTCDate();
+ prevMonth.setUTCDate(day - (prevMonth.getUTCDay() - this.o.weekStart + 7) % 7);
+ var nextMonth = new Date(prevMonth);
+ if (prevMonth.getUTCFullYear() < 100) {
+ nextMonth.setUTCFullYear(prevMonth.getUTCFullYear());
+ }
+ nextMonth.setUTCDate(nextMonth.getUTCDate() + 42);
+ nextMonth = nextMonth.valueOf();
+ var html = [];
+ var weekDay, clsName;
+ while (prevMonth.valueOf() < nextMonth) {
+ weekDay = prevMonth.getUTCDay();
+ if (weekDay === this.o.weekStart) {
+ html.push('');
+ if (this.o.calendarWeeks) {
+ // ISO 8601: First week contains first thursday.
+ // ISO also states week starts on Monday, but we can be more abstract here.
+ var
+ // Start of current week: based on weekstart/current date
+ ws = new Date(+prevMonth + (this.o.weekStart - weekDay - 7) % 7 * 864e5),
+ // Thursday of this week
+ th = new Date(Number(ws) + (7 + 4 - ws.getUTCDay()) % 7 * 864e5),
+ // First Thursday of year, year from thursday
+ yth = new Date(Number(yth = UTCDate(th.getUTCFullYear(), 0, 1)) + (7 + 4 - yth.getUTCDay()) % 7 * 864e5),
+ // Calendar week: ms between thursdays, div ms per day, div 7 days
+ calWeek = (th - yth) / 864e5 / 7 + 1;
+ html.push('' + calWeek + ' ');
+ }
+ }
+ clsName = this.getClassNames(prevMonth);
+ clsName.push('day');
+
+ var content = prevMonth.getUTCDate();
+
+ if (this.o.beforeShowDay !== $.noop) {
+ before = this.o.beforeShowDay(this._utc_to_local(prevMonth));
+ if (before === undefined)
+ before = {};
+ else if (typeof before === 'boolean')
+ before = { enabled: before };
+ else if (typeof before === 'string')
+ before = { classes: before };
+ if (before.enabled === false)
+ clsName.push('disabled');
+ if (before.classes)
+ clsName = clsName.concat(before.classes.split(/\s+/));
+ if (before.tooltip)
+ tooltip = before.tooltip;
+ if (before.content)
+ content = before.content;
+ }
+
+ //Check if uniqueSort exists (supported by jquery >=1.12 and >=2.2)
+ //Fallback to unique function for older jquery versions
+ if (typeof $.uniqueSort === "function") {
+ clsName = $.uniqueSort(clsName);
+ } else {
+ clsName = $.unique(clsName);
+ }
+
+ html.push('' + content + ' ');
+ tooltip = null;
+ if (weekDay === this.o.weekEnd) {
+ html.push(' ');
+ }
+ prevMonth.setUTCDate(prevMonth.getUTCDate() + 1);
+ }
+ this.picker.find('.datepicker-days tbody').html(html.join(''));
+
+ var monthsTitle = dates[this.o.language].monthsTitle || dates['en'].monthsTitle || 'Months';
+ var months = this.picker.find('.datepicker-months')
+ .find('.datepicker-switch')
+ .text(this.o.maxViewMode < 2 ? monthsTitle : year)
+ .end()
+ .find('tbody span').removeClass('active');
+
+ $.each(this.dates, function (i, d) {
+ if (d.getUTCFullYear() === year)
+ months.eq(d.getUTCMonth()).addClass('active');
+ });
+
+ if (year < startYear || year > endYear) {
+ months.addClass('disabled');
+ }
+ if (year === startYear) {
+ months.slice(0, startMonth).addClass('disabled');
+ }
+ if (year === endYear) {
+ months.slice(endMonth + 1).addClass('disabled');
+ }
+
+ if (this.o.beforeShowMonth !== $.noop) {
+ var that = this;
+ $.each(months, function (i, month) {
+ var moDate = new Date(year, i, 1);
+ var before = that.o.beforeShowMonth(moDate);
+ if (before === undefined)
+ before = {};
+ else if (typeof before === 'boolean')
+ before = { enabled: before };
+ else if (typeof before === 'string')
+ before = { classes: before };
+ if (before.enabled === false && !$(month).hasClass('disabled'))
+ $(month).addClass('disabled');
+ if (before.classes)
+ $(month).addClass(before.classes);
+ if (before.tooltip)
+ $(month).prop('title', before.tooltip);
+ });
+ }
+
+ // Generating decade/years picker
+ this._fill_yearsView(
+ '.datepicker-years',
+ 'year',
+ 10,
+ year,
+ startYear,
+ endYear,
+ this.o.beforeShowYear
+ );
+
+ // Generating century/decades picker
+ this._fill_yearsView(
+ '.datepicker-decades',
+ 'decade',
+ 100,
+ year,
+ startYear,
+ endYear,
+ this.o.beforeShowDecade
+ );
+
+ // Generating millennium/centuries picker
+ this._fill_yearsView(
+ '.datepicker-centuries',
+ 'century',
+ 1000,
+ year,
+ startYear,
+ endYear,
+ this.o.beforeShowCentury
+ );
+ },
+
+ updateNavArrows: function () {
+ if (!this._allow_update)
+ return;
+
+ var d = new Date(this.viewDate),
+ year = d.getUTCFullYear(),
+ month = d.getUTCMonth(),
+ startYear = this.o.startDate !== -Infinity ? new Date(this.o.startDate).getUTCFullYear() : -Infinity,
+ startMonth = this.o.startDate !== -Infinity ? new Date(this.o.startDate).getUTCMonth() : -Infinity,
+ endYear = this.o.endDate !== Infinity ? new Date(this.o.endDate).getUTCFullYear() : Infinity,
+ endMonth = this.o.endDate !== Infinity ? new Date(this.o.endDate).getUTCMonth() : Infinity,
+ prevIsDisabled,
+ nextIsDisabled,
+ factor = 1;
+ switch (this.viewMode) {
+ case 4:
+ factor *= 10;
+ /* falls through */
+ case 3:
+ factor *= 10;
+ /* falls through */
+ case 2:
+ factor *= 10;
+ /* falls through */
+ case 1:
+ prevIsDisabled = Math.floor(year / factor) * factor <= startYear;
+ nextIsDisabled = Math.floor(year / factor) * factor + factor > endYear;
+ break;
+ case 0:
+ prevIsDisabled = year <= startYear && month <= startMonth;
+ nextIsDisabled = year >= endYear && month >= endMonth;
+ break;
+ }
+
+ this.picker.find('.prev').toggleClass('disabled', prevIsDisabled);
+ this.picker.find('.next').toggleClass('disabled', nextIsDisabled);
+ },
+
+ click: function (e) {
+ e.preventDefault();
+ e.stopPropagation();
+
+ var target, dir, day, year, month;
+ target = $(e.target);
+
+ // Clicked on the switch
+ if (target.hasClass('datepicker-switch') && this.viewMode !== this.o.maxViewMode) {
+ this.setViewMode(this.viewMode + 1);
+ }
+
+ // Clicked on today button
+ if (target.hasClass('today') && !target.hasClass('day')) {
+ this.setViewMode(0);
+ this._setDate(UTCToday(), this.o.todayBtn === 'linked' ? null : 'view');
+ }
+
+ // Clicked on clear button
+ if (target.hasClass('clear')) {
+ this.clearDates();
+ }
+
+ if (!target.hasClass('disabled')) {
+ // Clicked on a month, year, decade, century
+ if (target.hasClass('month')
+ || target.hasClass('year')
+ || target.hasClass('decade')
+ || target.hasClass('century')) {
+ this.viewDate.setUTCDate(1);
+
+ day = 1;
+ if (this.viewMode === 1) {
+ month = target.parent().find('span').index(target);
+ year = this.viewDate.getUTCFullYear();
+ this.viewDate.setUTCMonth(month);
+ } else {
+ month = 0;
+ year = Number(target.text());
+ this.viewDate.setUTCFullYear(year);
+ }
+
+ this._trigger(DPGlobal.viewModes[this.viewMode - 1].e, this.viewDate);
+
+ if (this.viewMode === this.o.minViewMode) {
+ this._setDate(UTCDate(year, month, day));
+ } else {
+ this.setViewMode(this.viewMode - 1);
+ this.fill();
+ }
+ }
+ }
+
+ if (this.picker.is(':visible') && this._focused_from) {
+ this._focused_from.focus();
+ }
+ delete this._focused_from;
+ },
+
+ dayCellClick: function (e) {
+ var $target = $(e.currentTarget);
+ var timestamp = $target.data('date');
+ var date = new Date(timestamp);
+
+ if (this.o.updateViewDate) {
+ if (date.getUTCFullYear() !== this.viewDate.getUTCFullYear()) {
+ this._trigger('changeYear', this.viewDate);
+ }
+
+ if (date.getUTCMonth() !== this.viewDate.getUTCMonth()) {
+ this._trigger('changeMonth', this.viewDate);
+ }
+ }
+ this._setDate(date);
+ },
+
+ // Clicked on prev or next
+ navArrowsClick: function (e) {
+ var $target = $(e.currentTarget);
+ var dir = $target.hasClass('prev') ? -1 : 1;
+ if (this.viewMode !== 0) {
+ dir *= DPGlobal.viewModes[this.viewMode].navStep * 12;
+ }
+ this.viewDate = this.moveMonth(this.viewDate, dir);
+ this._trigger(DPGlobal.viewModes[this.viewMode].e, this.viewDate);
+ this.fill();
+ },
+
+ _toggle_multidate: function (date) {
+ var ix = this.dates.contains(date);
+ if (!date) {
+ this.dates.clear();
+ }
+
+ if (ix !== -1) {
+ if (this.o.multidate === true || this.o.multidate > 1 || this.o.toggleActive) {
+ this.dates.remove(ix);
+ }
+ } else if (this.o.multidate === false) {
+ this.dates.clear();
+ this.dates.push(date);
+ }
+ else {
+ this.dates.push(date);
+ }
+
+ if (typeof this.o.multidate === 'number')
+ while (this.dates.length > this.o.multidate)
+ this.dates.remove(0);
+ },
+
+ _setDate: function (date, which) {
+ if (!which || which === 'date')
+ this._toggle_multidate(date && new Date(date));
+ if ((!which && this.o.updateViewDate) || which === 'view')
+ this.viewDate = date && new Date(date);
+
+ this.fill();
+ this.setValue();
+ if (!which || which !== 'view') {
+ this._trigger('changeDate');
+ }
+ this.inputField.trigger('change');
+ if (this.o.autoclose && (!which || which === 'date')) {
+ this.hide();
+ }
+ },
+
+ moveDay: function (date, dir) {
+ var newDate = new Date(date);
+ newDate.setUTCDate(date.getUTCDate() + dir);
+
+ return newDate;
+ },
+
+ moveWeek: function (date, dir) {
+ return this.moveDay(date, dir * 7);
+ },
+
+ moveMonth: function (date, dir) {
+ if (!isValidDate(date))
+ return this.o.defaultViewDate;
+ if (!dir)
+ return date;
+ var new_date = new Date(date.valueOf()),
+ day = new_date.getUTCDate(),
+ month = new_date.getUTCMonth(),
+ mag = Math.abs(dir),
+ new_month, test;
+ dir = dir > 0 ? 1 : -1;
+ if (mag === 1) {
+ test = dir === -1
+ // If going back one month, make sure month is not current month
+ // (eg, Mar 31 -> Feb 31 == Feb 28, not Mar 02)
+ ? function () {
+ return new_date.getUTCMonth() === month;
+ }
+ // If going forward one month, make sure month is as expected
+ // (eg, Jan 31 -> Feb 31 == Feb 28, not Mar 02)
+ : function () {
+ return new_date.getUTCMonth() !== new_month;
+ };
+ new_month = month + dir;
+ new_date.setUTCMonth(new_month);
+ // Dec -> Jan (12) or Jan -> Dec (-1) -- limit expected date to 0-11
+ new_month = (new_month + 12) % 12;
+ }
+ else {
+ // For magnitudes >1, move one month at a time...
+ for (var i = 0; i < mag; i++)
+ // ...which might decrease the day (eg, Jan 31 to Feb 28, etc)...
+ new_date = this.moveMonth(new_date, dir);
+ // ...then reset the day, keeping it in the new month
+ new_month = new_date.getUTCMonth();
+ new_date.setUTCDate(day);
+ test = function () {
+ return new_month !== new_date.getUTCMonth();
+ };
+ }
+ // Common date-resetting loop -- if date is beyond end of month, make it
+ // end of month
+ while (test()) {
+ new_date.setUTCDate(--day);
+ new_date.setUTCMonth(new_month);
+ }
+ return new_date;
+ },
+
+ moveYear: function (date, dir) {
+ return this.moveMonth(date, dir * 12);
+ },
+
+ moveAvailableDate: function (date, dir, fn) {
+ do {
+ date = this[fn](date, dir);
+
+ if (!this.dateWithinRange(date))
+ return false;
+
+ fn = 'moveDay';
+ }
+ while (this.dateIsDisabled(date));
+
+ return date;
+ },
+
+ weekOfDateIsDisabled: function (date) {
+ return $.inArray(date.getUTCDay(), this.o.daysOfWeekDisabled) !== -1;
+ },
+
+ dateIsDisabled: function (date) {
+ return (
+ this.weekOfDateIsDisabled(date) ||
+ $.grep(this.o.datesDisabled, function (d) {
+ return isUTCEquals(date, d);
+ }).length > 0
+ );
+ },
+
+ dateWithinRange: function (date) {
+ return date >= this.o.startDate && date <= this.o.endDate;
+ },
+
+ keydown: function (e) {
+ if (!this.picker.is(':visible')) {
+ if (e.keyCode === 40 || e.keyCode === 27) { // allow down to re-show picker
+ this.show();
+ e.stopPropagation();
+ }
+ return;
+ }
+ var dateChanged = false,
+ dir, newViewDate,
+ focusDate = this.focusDate || this.viewDate;
+ switch (e.keyCode) {
+ case 27: // escape
+ if (this.focusDate) {
+ this.focusDate = null;
+ this.viewDate = this.dates.get(-1) || this.viewDate;
+ this.fill();
+ }
+ else
+ this.hide();
+ e.preventDefault();
+ e.stopPropagation();
+ break;
+ case 37: // left
+ case 38: // up
+ case 39: // right
+ case 40: // down
+ if (!this.o.keyboardNavigation || this.o.daysOfWeekDisabled.length === 7)
+ break;
+ dir = e.keyCode === 37 || e.keyCode === 38 ? -1 : 1;
+ if (this.viewMode === 0) {
+ if (e.ctrlKey) {
+ newViewDate = this.moveAvailableDate(focusDate, dir, 'moveYear');
+
+ if (newViewDate)
+ this._trigger('changeYear', this.viewDate);
+ } else if (e.shiftKey) {
+ newViewDate = this.moveAvailableDate(focusDate, dir, 'moveMonth');
+
+ if (newViewDate)
+ this._trigger('changeMonth', this.viewDate);
+ } else if (e.keyCode === 37 || e.keyCode === 39) {
+ newViewDate = this.moveAvailableDate(focusDate, dir, 'moveDay');
+ } else if (!this.weekOfDateIsDisabled(focusDate)) {
+ newViewDate = this.moveAvailableDate(focusDate, dir, 'moveWeek');
+ }
+ } else if (this.viewMode === 1) {
+ if (e.keyCode === 38 || e.keyCode === 40) {
+ dir = dir * 4;
+ }
+ newViewDate = this.moveAvailableDate(focusDate, dir, 'moveMonth');
+ } else if (this.viewMode === 2) {
+ if (e.keyCode === 38 || e.keyCode === 40) {
+ dir = dir * 4;
+ }
+ newViewDate = this.moveAvailableDate(focusDate, dir, 'moveYear');
+ }
+ if (newViewDate) {
+ this.focusDate = this.viewDate = newViewDate;
+ this.setValue();
+ this.fill();
+ e.preventDefault();
+ }
+ break;
+ case 13: // enter
+ if (!this.o.forceParse)
+ break;
+ focusDate = this.focusDate || this.dates.get(-1) || this.viewDate;
+ if (this.o.keyboardNavigation) {
+ this._toggle_multidate(focusDate);
+ dateChanged = true;
+ }
+ this.focusDate = null;
+ this.viewDate = this.dates.get(-1) || this.viewDate;
+ this.setValue();
+ this.fill();
+ if (this.picker.is(':visible')) {
+ e.preventDefault();
+ e.stopPropagation();
+ if (this.o.autoclose)
+ this.hide();
+ }
+ break;
+ case 9: // tab
+ this.focusDate = null;
+ this.viewDate = this.dates.get(-1) || this.viewDate;
+ this.fill();
+ this.hide();
+ break;
+ }
+ if (dateChanged) {
+ if (this.dates.length)
+ this._trigger('changeDate');
+ else
+ this._trigger('clearDate');
+ this.inputField.trigger('change');
+ }
+ },
+
+ setViewMode: function (viewMode) {
+ this.viewMode = viewMode;
+ this.picker
+ .children('div')
+ .hide()
+ .filter('.datepicker-' + DPGlobal.viewModes[this.viewMode].clsName)
+ .show();
+ this.updateNavArrows();
+ this._trigger('changeViewMode', new Date(this.viewDate));
+ }
+ };
+
+ var DateRangePicker = function (element, options) {
+ $.data(element, 'datepicker', this);
+ this.element = $(element);
+ this.inputs = $.map(options.inputs, function (i) {
+ return i.jquery ? i[0] : i;
+ });
+ delete options.inputs;
+
+ this.keepEmptyValues = options.keepEmptyValues;
+ delete options.keepEmptyValues;
+
+ datepickerPlugin.call($(this.inputs), options)
+ .on('changeDate', $.proxy(this.dateUpdated, this));
+
+ this.pickers = $.map(this.inputs, function (i) {
+ return $.data(i, 'datepicker');
+ });
+ this.updateDates();
+ };
+ DateRangePicker.prototype = {
+ updateDates: function () {
+ this.dates = $.map(this.pickers, function (i) {
+ return i.getUTCDate();
+ });
+ this.updateRanges();
+ },
+ updateRanges: function () {
+ var range = $.map(this.dates, function (d) {
+ return d.valueOf();
+ });
+ $.each(this.pickers, function (i, p) {
+ p.setRange(range);
+ });
+ },
+ clearDates: function () {
+ $.each(this.pickers, function (i, p) {
+ p.clearDates();
+ });
+ },
+ dateUpdated: function (e) {
+ // `this.updating` is a workaround for preventing infinite recursion
+ // between `changeDate` triggering and `setUTCDate` calling. Until
+ // there is a better mechanism.
+ if (this.updating)
+ return;
+ this.updating = true;
+
+ var dp = $.data(e.target, 'datepicker');
+
+ if (dp === undefined) {
+ return;
+ }
+
+ var new_date = dp.getUTCDate(),
+ keep_empty_values = this.keepEmptyValues,
+ i = $.inArray(e.target, this.inputs),
+ j = i - 1,
+ k = i + 1,
+ l = this.inputs.length;
+ if (i === -1)
+ return;
+
+ $.each(this.pickers, function (i, p) {
+ if (!p.getUTCDate() && (p === dp || !keep_empty_values))
+ p.setUTCDate(new_date);
+ });
+
+ if (new_date < this.dates[j]) {
+ // Date being moved earlier/left
+ while (j >= 0 && new_date < this.dates[j] && (this.pickers[j].element.val() || "").length > 0) {
+ this.pickers[j--].setUTCDate(new_date);
+ }
+ } else if (new_date > this.dates[k]) {
+ // Date being moved later/right
+ while (k < l && new_date > this.dates[k] && (this.pickers[k].element.val() || "").length > 0) {
+ this.pickers[k++].setUTCDate(new_date);
+ }
+ }
+ this.updateDates();
+
+ delete this.updating;
+ },
+ destroy: function () {
+ $.map(this.pickers, function (p) { p.destroy(); });
+ $(this.inputs).off('changeDate', this.dateUpdated);
+ delete this.element.data().datepicker;
+ },
+ remove: alias('destroy', 'Method `remove` is deprecated and will be removed in version 2.0. Use `destroy` instead')
+ };
+
+ function opts_from_el(el, prefix) {
+ // Derive options from element data-attrs
+ var data = $(el).data(),
+ out = {}, inkey,
+ replace = new RegExp('^' + prefix.toLowerCase() + '([A-Z])');
+ prefix = new RegExp('^' + prefix.toLowerCase());
+ function re_lower(_, a) {
+ return a.toLowerCase();
+ }
+ for (var key in data)
+ if (prefix.test(key)) {
+ inkey = key.replace(replace, re_lower);
+ out[inkey] = data[key];
+ }
+ return out;
+ }
+
+ function opts_from_locale(lang) {
+ // Derive options from locale plugins
+ var out = {};
+ // Check if "de-DE" style date is available, if not language should
+ // fallback to 2 letter code eg "de"
+ if (!dates[lang]) {
+ lang = lang.split('-')[0];
+ if (!dates[lang])
+ return;
+ }
+ var d = dates[lang];
+ $.each(locale_opts, function (i, k) {
+ if (k in d)
+ out[k] = d[k];
+ });
+ return out;
+ }
+
+ var old = $.fn.datepicker;
+ var datepickerPlugin = function (option) {
+ var args = Array.apply(null, arguments);
+ args.shift();
+ var internal_return;
+ this.each(function () {
+ var $this = $(this),
+ data = $this.data('datepicker'),
+ options = typeof option === 'object' && option;
+ if (!data) {
+ var elopts = opts_from_el(this, 'date'),
+ // Preliminary otions
+ xopts = $.extend({}, defaults, elopts, options),
+ locopts = opts_from_locale(xopts.language),
+ // Options priority: js args, data-attrs, locales, defaults
+ opts = $.extend({}, defaults, locopts, elopts, options);
+ if ($this.hasClass('input-daterange') || opts.inputs) {
+ $.extend(opts, {
+ inputs: opts.inputs || $this.find('input').toArray()
+ });
+ data = new DateRangePicker(this, opts);
+ }
+ else {
+ data = new Datepicker(this, opts);
+ }
+ $this.data('datepicker', data);
+ }
+ if (typeof option === 'string' && typeof data[option] === 'function') {
+ internal_return = data[option].apply(data, args);
+ }
+ });
+
+ if (
+ internal_return === undefined ||
+ internal_return instanceof Datepicker ||
+ internal_return instanceof DateRangePicker
+ )
+ return this;
+
+ if (this.length > 1)
+ throw new Error('Using only allowed for the collection of a single element (' + option + ' function)');
+ else
+ return internal_return;
+ };
+ $.fn.datepicker = datepickerPlugin;
+
+ var defaults = $.fn.datepicker.defaults = {
+ assumeNearbyYear: false,
+ autoclose: false,
+ beforeShowDay: $.noop,
+ beforeShowMonth: $.noop,
+ beforeShowYear: $.noop,
+ beforeShowDecade: $.noop,
+ beforeShowCentury: $.noop,
+ calendarWeeks: false,
+ clearBtn: false,
+ toggleActive: false,
+ daysOfWeekDisabled: [],
+ daysOfWeekHighlighted: [],
+ datesDisabled: [],
+ endDate: Infinity,
+ forceParse: true,
+ format: 'mm/dd/yyyy',
+ isInline: null,
+ keepEmptyValues: false,
+ keyboardNavigation: true,
+ language: 'en',
+ minViewMode: 0,
+ maxViewMode: 4,
+ multidate: false,
+ multidateSeparator: ',',
+ orientation: "auto",
+ rtl: false,
+ startDate: -Infinity,
+ startView: 0,
+ todayBtn: false,
+ todayHighlight: false,
+ updateViewDate: true,
+ weekStart: 0,
+ disableTouchKeyboard: false,
+ enableOnReadonly: true,
+ showOnFocus: true,
+ zIndexOffset: 10,
+ container: 'body',
+ immediateUpdates: false,
+ title: '',
+ templates: {
+ leftArrow: '«',
+ rightArrow: '»'
+ },
+ showWeekDays: true
+ };
+ var locale_opts = $.fn.datepicker.locale_opts = [
+ 'format',
+ 'rtl',
+ 'weekStart'
+ ];
+ $.fn.datepicker.Constructor = Datepicker;
+ var dates = $.fn.datepicker.dates = {
+ en: {
+ days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
+ daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
+ daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],
+ months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
+ monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
+ today: "Today",
+ clear: "Clear",
+ titleFormat: "MM yyyy"
+ }
+ };
+
+ var DPGlobal = {
+ viewModes: [
+ {
+ names: ['days', 'month'],
+ clsName: 'days',
+ e: 'changeMonth'
+ },
+ {
+ names: ['months', 'year'],
+ clsName: 'months',
+ e: 'changeYear',
+ navStep: 1
+ },
+ {
+ names: ['years', 'decade'],
+ clsName: 'years',
+ e: 'changeDecade',
+ navStep: 10
+ },
+ {
+ names: ['decades', 'century'],
+ clsName: 'decades',
+ e: 'changeCentury',
+ navStep: 100
+ },
+ {
+ names: ['centuries', 'millennium'],
+ clsName: 'centuries',
+ e: 'changeMillennium',
+ navStep: 1000
+ }
+ ],
+ validParts: /dd?|DD?|mm?|MM?|yy(?:yy)?/g,
+ nonpunctuation: /[^ -\/:-@\u5e74\u6708\u65e5\[-`{-~\t\n\r]+/g,
+ parseFormat: function (format) {
+ if (typeof format.toValue === 'function' && typeof format.toDisplay === 'function')
+ return format;
+ // IE treats \0 as a string end in inputs (truncating the value),
+ // so it's a bad format delimiter, anyway
+ var separators = format.replace(this.validParts, '\0').split('\0'),
+ parts = format.match(this.validParts);
+ if (!separators || !separators.length || !parts || parts.length === 0) {
+ throw new Error("Invalid date format.");
+ }
+ return { separators: separators, parts: parts };
+ },
+ parseDate: function (date, format, language, assumeNearby) {
+ if (!date)
+ return undefined;
+ if (date instanceof Date)
+ return date;
+ if (typeof format === 'string')
+ format = DPGlobal.parseFormat(format);
+ if (format.toValue)
+ return format.toValue(date, format, language);
+ var fn_map = {
+ d: 'moveDay',
+ m: 'moveMonth',
+ w: 'moveWeek',
+ y: 'moveYear'
+ },
+ dateAliases = {
+ yesterday: '-1d',
+ today: '+0d',
+ tomorrow: '+1d'
+ },
+ parts, part, dir, i, fn;
+ if (date in dateAliases) {
+ date = dateAliases[date];
+ }
+ if (/^[\-+]\d+[dmwy]([\s,]+[\-+]\d+[dmwy])*$/i.test(date)) {
+ parts = date.match(/([\-+]\d+)([dmwy])/gi);
+ date = new Date();
+ for (i = 0; i < parts.length; i++) {
+ part = parts[i].match(/([\-+]\d+)([dmwy])/i);
+ dir = Number(part[1]);
+ fn = fn_map[part[2].toLowerCase()];
+ date = Datepicker.prototype[fn](date, dir);
+ }
+ return Datepicker.prototype._zero_utc_time(date);
+ }
+
+ parts = date && date.match(this.nonpunctuation) || [];
+
+ function applyNearbyYear(year, threshold) {
+ if (threshold === true)
+ threshold = 10;
+
+ // if year is 2 digits or less, than the user most likely is trying to get a recent century
+ if (year < 100) {
+ year += 2000;
+ // if the new year is more than threshold years in advance, use last century
+ if (year > ((new Date()).getFullYear() + threshold)) {
+ year -= 100;
+ }
+ }
+
+ return year;
+ }
+
+ var parsed = {},
+ setters_order = ['yyyy', 'yy', 'M', 'MM', 'm', 'mm', 'd', 'dd'],
+ setters_map = {
+ yyyy: function (d, v) {
+ return d.setUTCFullYear(assumeNearby ? applyNearbyYear(v, assumeNearby) : v);
+ },
+ m: function (d, v) {
+ if (isNaN(d))
+ return d;
+ v -= 1;
+ while (v < 0) v += 12;
+ v %= 12;
+ d.setUTCMonth(v);
+ while (d.getUTCMonth() !== v)
+ d.setUTCDate(d.getUTCDate() - 1);
+ return d;
+ },
+ d: function (d, v) {
+ return d.setUTCDate(v);
+ }
+ },
+ val, filtered;
+ setters_map['yy'] = setters_map['yyyy'];
+ setters_map['M'] = setters_map['MM'] = setters_map['mm'] = setters_map['m'];
+ setters_map['dd'] = setters_map['d'];
+ date = UTCToday();
+ var fparts = format.parts.slice();
+ // Remove noop parts
+ if (parts.length !== fparts.length) {
+ fparts = $(fparts).filter(function (i, p) {
+ return $.inArray(p, setters_order) !== -1;
+ }).toArray();
+ }
+ // Process remainder
+ function match_part() {
+ var m = this.slice(0, parts[i].length),
+ p = parts[i].slice(0, m.length);
+ return m.toLowerCase() === p.toLowerCase();
+ }
+ if (parts.length === fparts.length) {
+ var cnt;
+ for (i = 0, cnt = fparts.length; i < cnt; i++) {
+ val = parseInt(parts[i], 10);
+ part = fparts[i];
+ if (isNaN(val)) {
+ switch (part) {
+ case 'MM':
+ filtered = $(dates[language].months).filter(match_part);
+ val = $.inArray(filtered[0], dates[language].months) + 1;
+ break;
+ case 'M':
+ filtered = $(dates[language].monthsShort).filter(match_part);
+ val = $.inArray(filtered[0], dates[language].monthsShort) + 1;
+ break;
+ }
+ }
+ parsed[part] = val;
+ }
+ var _date, s;
+ for (i = 0; i < setters_order.length; i++) {
+ s = setters_order[i];
+ if (s in parsed && !isNaN(parsed[s])) {
+ _date = new Date(date);
+ setters_map[s](_date, parsed[s]);
+ if (!isNaN(_date))
+ date = _date;
+ }
+ }
+ }
+ return date;
+ },
+ formatDate: function (date, format, language) {
+ if (!date)
+ return '';
+ if (typeof format === 'string')
+ format = DPGlobal.parseFormat(format);
+ if (format.toDisplay)
+ return format.toDisplay(date, format, language);
+ var val = {
+ d: date.getUTCDate(),
+ D: dates[language].daysShort[date.getUTCDay()],
+ DD: dates[language].days[date.getUTCDay()],
+ m: date.getUTCMonth() + 1,
+ M: dates[language].monthsShort[date.getUTCMonth()],
+ MM: dates[language].months[date.getUTCMonth()],
+ yy: date.getUTCFullYear().toString().substring(2),
+ yyyy: date.getUTCFullYear()
+ };
+ val.dd = (val.d < 10 ? '0' : '') + val.d;
+ val.mm = (val.m < 10 ? '0' : '') + val.m;
+ date = [];
+ var seps = $.extend([], format.separators);
+ for (var i = 0, cnt = format.parts.length; i <= cnt; i++) {
+ if (seps.length)
+ date.push(seps.shift());
+ date.push(val[format.parts[i]]);
+ }
+ return date.join('');
+ },
+ headTemplate: '' +
+ '' +
+ ' ' +
+ ' ' +
+ '' +
+ '' + defaults.templates.leftArrow + ' ' +
+ ' ' +
+ '' + defaults.templates.rightArrow + ' ' +
+ ' ' +
+ ' ',
+ contTemplate: ' ',
+ footTemplate: '' +
+ '' +
+ ' ' +
+ ' ' +
+ '' +
+ ' ' +
+ ' ' +
+ ' '
+ };
+ DPGlobal.template = '' +
+ '
' +
+ '
' +
+ DPGlobal.headTemplate +
+ ' ' +
+ DPGlobal.footTemplate +
+ '
' +
+ '
' +
+ '
' +
+ '
' +
+ DPGlobal.headTemplate +
+ DPGlobal.contTemplate +
+ DPGlobal.footTemplate +
+ '
' +
+ '
' +
+ '
' +
+ '
' +
+ DPGlobal.headTemplate +
+ DPGlobal.contTemplate +
+ DPGlobal.footTemplate +
+ '
' +
+ '
' +
+ '
' +
+ '
' +
+ DPGlobal.headTemplate +
+ DPGlobal.contTemplate +
+ DPGlobal.footTemplate +
+ '
' +
+ '
' +
+ '
' +
+ '
' +
+ DPGlobal.headTemplate +
+ DPGlobal.contTemplate +
+ DPGlobal.footTemplate +
+ '
' +
+ '
' +
+ '
';
+
+ $.fn.datepicker.DPGlobal = DPGlobal;
+
+
+ /* DATEPICKER NO CONFLICT
+ * =================== */
+
+ $.fn.datepicker.noConflict = function () {
+ $.fn.datepicker = old;
+ return this;
+ };
+
+ /* DATEPICKER VERSION
+ * =================== */
+ $.fn.datepicker.version = '1.10.0';
+
+ $.fn.datepicker.deprecated = function (msg) {
+ var console = window.console;
+ if (console && console.warn) {
+ console.warn('DEPRECATED: ' + msg);
+ }
+ };
+
+
+ /* DATEPICKER DATA-API
+ * ================== */
+
+ $(document).on(
+ 'focus.datepicker.data-api click.datepicker.data-api',
+ '[data-provide="datepicker"]',
+ function (e) {
+ var $this = $(this);
+ if ($this.data('datepicker'))
+ return;
+ e.preventDefault();
+ // component click requires us to explicitly show it
+ datepickerPlugin.call($this, 'show');
+ }
+ );
+ $(function () {
+ datepickerPlugin.call($('[data-provide="datepicker-inline"]'));
+ });
+
+}));
\ No newline at end of file
diff --git a/src/assets/plugins/bootstrap-datetimepicker/css/bootstrap-datetimepicker.css b/src/assets/plugins/bootstrap-datetimepicker/css/bootstrap-datetimepicker.css
new file mode 100644
index 0000000..fc0f297
--- /dev/null
+++ b/src/assets/plugins/bootstrap-datetimepicker/css/bootstrap-datetimepicker.css
@@ -0,0 +1,419 @@
+/*!
+ * Datetimepicker for Bootstrap
+ *
+ * Copyright 2012 Stefan Petre
+ * Improvements by Andrew Rowls
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ */
+.datetimepicker {
+ padding: 4px;
+ margin-top: 1px;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+ direction: ltr
+}
+
+.datetimepicker-inline {
+ width: 220px
+}
+
+.datetimepicker.datetimepicker-rtl {
+ direction: rtl
+}
+
+.datetimepicker.datetimepicker-rtl table tr td span {
+ float: right
+}
+
+.datetimepicker-dropdown,
+.datetimepicker-dropdown-left {
+ top: 0;
+ left: 0
+}
+
+[class*=" datetimepicker-dropdown"]:before {
+ content: '';
+ display: inline-block;
+ border-left: 7px solid transparent;
+ border-right: 7px solid transparent;
+ border-bottom: 7px solid #ccc;
+ border-bottom-color: rgba(0, 0, 0, 0.2);
+ position: absolute
+}
+
+[class*=" datetimepicker-dropdown"]:after {
+ content: '';
+ display: inline-block;
+ border-left: 6px solid transparent;
+ border-right: 6px solid transparent;
+ border-bottom: 6px solid #fff;
+ position: absolute
+}
+
+[class*=" datetimepicker-dropdown-top"]:before {
+ content: '';
+ display: inline-block;
+ border-left: 7px solid transparent;
+ border-right: 7px solid transparent;
+ border-top: 7px solid #ccc;
+ border-top-color: rgba(0, 0, 0, 0.2);
+ border-bottom: 0
+}
+
+[class*=" datetimepicker-dropdown-top"]:after {
+ content: '';
+ display: inline-block;
+ border-left: 6px solid transparent;
+ border-right: 6px solid transparent;
+ border-top: 6px solid #fff;
+ border-bottom: 0
+}
+
+.datetimepicker-dropdown-bottom-left:before {
+ top: -7px;
+ right: 6px
+}
+
+.datetimepicker-dropdown-bottom-left:after {
+ top: -6px;
+ right: 7px
+}
+
+.datetimepicker-dropdown-bottom-right:before {
+ top: -7px;
+ left: 6px
+}
+
+.datetimepicker-dropdown-bottom-right:after {
+ top: -6px;
+ left: 7px
+}
+
+.datetimepicker-dropdown-top-left:before {
+ bottom: -7px;
+ right: 6px
+}
+
+.datetimepicker-dropdown-top-left:after {
+ bottom: -6px;
+ right: 7px
+}
+
+.datetimepicker-dropdown-top-right:before {
+ bottom: -7px;
+ left: 6px
+}
+
+.datetimepicker-dropdown-top-right:after {
+ bottom: -6px;
+ left: 7px
+}
+
+.datetimepicker>div {
+ display: none
+}
+
+.datetimepicker.minutes div.datetimepicker-minutes {
+ display: block
+}
+
+.datetimepicker.hours div.datetimepicker-hours {
+ display: block
+}
+
+.datetimepicker.days div.datetimepicker-days {
+ display: block
+}
+
+.datetimepicker.months div.datetimepicker-months {
+ display: block
+}
+
+.datetimepicker.years div.datetimepicker-years {
+ display: block
+}
+
+.datetimepicker table {
+ margin: 0
+}
+
+.datetimepicker td,
+.datetimepicker th {
+ text-align: center;
+ width: 20px;
+ height: 20px;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+ border: 0
+}
+
+.table-striped .datetimepicker table tr td,
+.table-striped .datetimepicker table tr th {
+ background-color: transparent
+}
+
+.datetimepicker table tr td.minute:hover {
+ background: #eee;
+ cursor: pointer
+}
+
+.datetimepicker table tr td.hour:hover {
+ background: #eee;
+ cursor: pointer
+}
+
+.datetimepicker table tr td.day:hover {
+ background: #eee;
+ cursor: pointer
+}
+
+.datetimepicker table tr td.old,
+.datetimepicker table tr td.new {
+ color: #999
+}
+
+.datetimepicker table tr td.disabled,
+.datetimepicker table tr td.disabled:hover {
+ background: 0;
+ color: #999;
+ cursor: default
+}
+
+.datetimepicker table tr td.today,
+.datetimepicker table tr td.today:hover,
+.datetimepicker table tr td.today.disabled,
+.datetimepicker table tr td.today.disabled:hover {
+ background-color: #fde19a;
+ background-image: -moz-linear-gradient(top, #fdd49a, #fdf59a);
+ background-image: -ms-linear-gradient(top, #fdd49a, #fdf59a);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fdd49a), to(#fdf59a));
+ background-image: -webkit-linear-gradient(top, #fdd49a, #fdf59a);
+ background-image: -o-linear-gradient(top, #fdd49a, #fdf59a);
+ background-image: linear-gradient(top, #fdd49a, #fdf59a);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fdd49a', endColorstr='#fdf59a', GradientType=0);
+ border-color: #fdf59a #fdf59a #fbed50;
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled=false)
+}
+
+.datetimepicker table tr td.today:hover,
+.datetimepicker table tr td.today:hover:hover,
+.datetimepicker table tr td.today.disabled:hover,
+.datetimepicker table tr td.today.disabled:hover:hover,
+.datetimepicker table tr td.today:active,
+.datetimepicker table tr td.today:hover:active,
+.datetimepicker table tr td.today.disabled:active,
+.datetimepicker table tr td.today.disabled:hover:active,
+.datetimepicker table tr td.today.active,
+.datetimepicker table tr td.today:hover.active,
+.datetimepicker table tr td.today.disabled.active,
+.datetimepicker table tr td.today.disabled:hover.active,
+.datetimepicker table tr td.today.disabled,
+.datetimepicker table tr td.today:hover.disabled,
+.datetimepicker table tr td.today.disabled.disabled,
+.datetimepicker table tr td.today.disabled:hover.disabled,
+.datetimepicker table tr td.today[disabled],
+.datetimepicker table tr td.today:hover[disabled],
+.datetimepicker table tr td.today.disabled[disabled],
+.datetimepicker table tr td.today.disabled:hover[disabled] {
+ background-color: #fdf59a
+}
+
+.datetimepicker table tr td.today:active,
+.datetimepicker table tr td.today:hover:active,
+.datetimepicker table tr td.today.disabled:active,
+.datetimepicker table tr td.today.disabled:hover:active,
+.datetimepicker table tr td.today.active,
+.datetimepicker table tr td.today:hover.active,
+.datetimepicker table tr td.today.disabled.active,
+.datetimepicker table tr td.today.disabled:hover.active {
+ background-color: #fbf069
+}
+
+.datetimepicker table tr td.active,
+.datetimepicker table tr td.active:hover,
+.datetimepicker table tr td.active.disabled,
+.datetimepicker table tr td.active.disabled:hover {
+ background-color: #006dcc;
+ background-image: -moz-linear-gradient(top, #08c, #04c);
+ background-image: -ms-linear-gradient(top, #08c, #04c);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#08c), to(#04c));
+ background-image: -webkit-linear-gradient(top, #08c, #04c);
+ background-image: -o-linear-gradient(top, #08c, #04c);
+ background-image: linear-gradient(top, #08c, #04c);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);
+ border-color: #04c #04c #002a80;
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+ color: #fff;
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25)
+}
+
+.datetimepicker table tr td.active:hover,
+.datetimepicker table tr td.active:hover:hover,
+.datetimepicker table tr td.active.disabled:hover,
+.datetimepicker table tr td.active.disabled:hover:hover,
+.datetimepicker table tr td.active:active,
+.datetimepicker table tr td.active:hover:active,
+.datetimepicker table tr td.active.disabled:active,
+.datetimepicker table tr td.active.disabled:hover:active,
+.datetimepicker table tr td.active.active,
+.datetimepicker table tr td.active:hover.active,
+.datetimepicker table tr td.active.disabled.active,
+.datetimepicker table tr td.active.disabled:hover.active,
+.datetimepicker table tr td.active.disabled,
+.datetimepicker table tr td.active:hover.disabled,
+.datetimepicker table tr td.active.disabled.disabled,
+.datetimepicker table tr td.active.disabled:hover.disabled,
+.datetimepicker table tr td.active[disabled],
+.datetimepicker table tr td.active:hover[disabled],
+.datetimepicker table tr td.active.disabled[disabled],
+.datetimepicker table tr td.active.disabled:hover[disabled] {
+ background-color: #04c
+}
+
+.datetimepicker table tr td.active:active,
+.datetimepicker table tr td.active:hover:active,
+.datetimepicker table tr td.active.disabled:active,
+.datetimepicker table tr td.active.disabled:hover:active,
+.datetimepicker table tr td.active.active,
+.datetimepicker table tr td.active:hover.active,
+.datetimepicker table tr td.active.disabled.active,
+.datetimepicker table tr td.active.disabled:hover.active {
+ background-color: #039
+}
+
+.datetimepicker table tr td span {
+ display: block;
+ width: 23%;
+ height: 54px;
+ line-height: 54px;
+ float: left;
+ margin: 1%;
+ cursor: pointer;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px
+}
+
+.datetimepicker .datetimepicker-hours span {
+ height: 26px;
+ line-height: 26px
+}
+
+.datetimepicker .datetimepicker-hours table tr td span.hour_am,
+.datetimepicker .datetimepicker-hours table tr td span.hour_pm {
+ width: 14.6%
+}
+
+.datetimepicker .datetimepicker-hours fieldset legend,
+.datetimepicker .datetimepicker-minutes fieldset legend {
+ margin-bottom: inherit;
+ line-height: 30px
+}
+
+.datetimepicker .datetimepicker-minutes span {
+ height: 26px;
+ line-height: 26px
+}
+
+.datetimepicker table tr td span:hover {
+ background: #eee
+}
+
+.datetimepicker table tr td span.disabled,
+.datetimepicker table tr td span.disabled:hover {
+ background: 0;
+ color: #999;
+ cursor: default
+}
+
+.datetimepicker table tr td span.active,
+.datetimepicker table tr td span.active:hover,
+.datetimepicker table tr td span.active.disabled,
+.datetimepicker table tr td span.active.disabled:hover {
+ background-color: #006dcc;
+ background-image: -moz-linear-gradient(top, #08c, #04c);
+ background-image: -ms-linear-gradient(top, #08c, #04c);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#08c), to(#04c));
+ background-image: -webkit-linear-gradient(top, #08c, #04c);
+ background-image: -o-linear-gradient(top, #08c, #04c);
+ background-image: linear-gradient(top, #08c, #04c);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);
+ border-color: #04c #04c #002a80;
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+ color: #fff;
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25)
+}
+
+.datetimepicker table tr td span.active:hover,
+.datetimepicker table tr td span.active:hover:hover,
+.datetimepicker table tr td span.active.disabled:hover,
+.datetimepicker table tr td span.active.disabled:hover:hover,
+.datetimepicker table tr td span.active:active,
+.datetimepicker table tr td span.active:hover:active,
+.datetimepicker table tr td span.active.disabled:active,
+.datetimepicker table tr td span.active.disabled:hover:active,
+.datetimepicker table tr td span.active.active,
+.datetimepicker table tr td span.active:hover.active,
+.datetimepicker table tr td span.active.disabled.active,
+.datetimepicker table tr td span.active.disabled:hover.active,
+.datetimepicker table tr td span.active.disabled,
+.datetimepicker table tr td span.active:hover.disabled,
+.datetimepicker table tr td span.active.disabled.disabled,
+.datetimepicker table tr td span.active.disabled:hover.disabled,
+.datetimepicker table tr td span.active[disabled],
+.datetimepicker table tr td span.active:hover[disabled],
+.datetimepicker table tr td span.active.disabled[disabled],
+.datetimepicker table tr td span.active.disabled:hover[disabled] {
+ background-color: #04c
+}
+
+.datetimepicker table tr td span.active:active,
+.datetimepicker table tr td span.active:hover:active,
+.datetimepicker table tr td span.active.disabled:active,
+.datetimepicker table tr td span.active.disabled:hover:active,
+.datetimepicker table tr td span.active.active,
+.datetimepicker table tr td span.active:hover.active,
+.datetimepicker table tr td span.active.disabled.active,
+.datetimepicker table tr td span.active.disabled:hover.active {
+ background-color: #039
+}
+
+.datetimepicker table tr td span.old {
+ color: #999
+}
+
+.datetimepicker th.switch {
+ width: 145px
+}
+
+.datetimepicker th span.glyphicon {
+ pointer-events: none
+}
+
+.datetimepicker thead tr:first-child th,
+.datetimepicker tfoot th {
+ cursor: pointer
+}
+
+.datetimepicker thead tr:first-child th:hover,
+.datetimepicker tfoot th:hover {
+ background: #eee
+}
+
+.input-append.date .add-on i,
+.input-prepend.date .add-on i,
+.input-group.date .input-group-addon span {
+ cursor: pointer;
+ width: 14px;
+ height: 14px
+}
\ No newline at end of file
diff --git a/src/assets/plugins/bootstrap-datetimepicker/js/bootstrap-datetimepicker.min.js b/src/assets/plugins/bootstrap-datetimepicker/js/bootstrap-datetimepicker.min.js
new file mode 100644
index 0000000..f45e7a0
--- /dev/null
+++ b/src/assets/plugins/bootstrap-datetimepicker/js/bootstrap-datetimepicker.min.js
@@ -0,0 +1,1694 @@
+(function(a) {
+ var define;
+ if (typeof define === "function" && define.amd) {
+ define(["jquery"], a)
+ } else {
+ if (typeof exports === "object") {
+ a(require("jquery"))
+ } else {
+ a(jQuery)
+ }
+ }
+}(function(f, c) {
+ if (!("indexOf"in Array.prototype)) {
+ Array.prototype.indexOf = function(k, j) {
+ if (j === c) {
+ j = 0
+ }
+ if (j < 0) {
+ j += this.length
+ }
+ if (j < 0) {
+ j = 0
+ }
+ for (var l = this.length; j < l; j++) {
+ if (j in this && this[j] === k) {
+ return j
+ }
+ }
+ return -1
+ }
+ }
+ function e(l) {
+ var k = f(l);
+ var j = k.add(k.parents());
+ var m = false;
+ j.each(function() {
+ if (f(this).css("position") === "fixed") {
+ m = true;
+ return false
+ }
+ });
+ return m
+ }
+ function h() {
+ return new Date(Date.UTC.apply(Date, arguments))
+ }
+ function d() {
+ var j = new Date();
+ return h(j.getUTCFullYear(), j.getUTCMonth(), j.getUTCDate(), j.getUTCHours(), j.getUTCMinutes(), j.getUTCSeconds(), 0)
+ }
+ var i = function(l, k) {
+ var n = this;
+ this.element = f(l);
+ this.container = k.container || "body";
+ this.language = k.language || this.element.data("date-language") || "en";
+ this.language = this.language in a ? this.language : this.language.split("-")[0];
+ this.language = this.language in a ? this.language : "en";
+ this.isRTL = a[this.language].rtl || false;
+ this.formatType = k.formatType || this.element.data("format-type") || "standard";
+ this.format = g.parseFormat(k.format || this.element.data("date-format") || a[this.language].format || g.getDefaultFormat(this.formatType, "input"), this.formatType);
+ this.isInline = false;
+ this.isVisible = false;
+ this.isInput = this.element.is("input");
+ this.fontAwesome = k.fontAwesome || this.element.data("font-awesome") || false;
+ this.bootcssVer = k.bootcssVer || (this.isInput ? (this.element.is(".form-control") ? 3 : 2) : (this.bootcssVer = this.element.is(".input-group") ? 3 : 2));
+ this.component = this.element.is(".date") ? (this.bootcssVer == 3 ? this.element.find(".input-group-addon .glyphicon-th, .input-group-addon .glyphicon-time, .input-group-addon .glyphicon-remove, .input-group-addon .glyphicon-calendar, .input-group-addon .fa-calendar, .input-group-addon .fa-clock-o").parent() : this.element.find(".add-on .icon-th, .add-on .icon-time, .add-on .icon-calendar, .add-on .fa-calendar, .add-on .fa-clock-o").parent()) : false;
+ this.componentReset = this.element.is(".date") ? (this.bootcssVer == 3 ? this.element.find(".input-group-addon .glyphicon-remove, .input-group-addon .fa-times").parent() : this.element.find(".add-on .icon-remove, .add-on .fa-times").parent()) : false;
+ this.hasInput = this.component && this.element.find("input").length;
+ if (this.component && this.component.length === 0) {
+ this.component = false
+ }
+ this.linkField = k.linkField || this.element.data("link-field") || false;
+ this.linkFormat = g.parseFormat(k.linkFormat || this.element.data("link-format") || g.getDefaultFormat(this.formatType, "link"), this.formatType);
+ this.minuteStep = k.minuteStep || this.element.data("minute-step") || 5;
+ this.pickerPosition = k.pickerPosition || this.element.data("picker-position") || "bottom-right";
+ this.showMeridian = k.showMeridian || this.element.data("show-meridian") || false;
+ this.initialDate = k.initialDate || new Date();
+ this.zIndex = k.zIndex || this.element.data("z-index") || c;
+ this.title = typeof k.title === "undefined" ? false : k.title;
+ this.icons = {
+ leftArrow: this.fontAwesome ? "fa-arrow-left" : (this.bootcssVer === 3 ? "glyphicon-arrow-left" : "icon-arrow-left"),
+ rightArrow: this.fontAwesome ? "fa-arrow-right" : (this.bootcssVer === 3 ? "glyphicon-arrow-right" : "icon-arrow-right")
+ };
+ this.icontype = this.fontAwesome ? "fa" : "glyphicon";
+ this._attachEvents();
+ this.clickedOutside = function(o) {
+ if (f(o.target).closest(".datetimepicker").length === 0) {
+ n.hide()
+ }
+ }
+ ;
+ this.formatViewType = "datetime";
+ if ("formatViewType"in k) {
+ this.formatViewType = k.formatViewType
+ } else {
+ if ("formatViewType"in this.element.data()) {
+ this.formatViewType = this.element.data("formatViewType")
+ }
+ }
+ this.minView = 0;
+ if ("minView"in k) {
+ this.minView = k.minView
+ } else {
+ if ("minView"in this.element.data()) {
+ this.minView = this.element.data("min-view")
+ }
+ }
+ this.minView = g.convertViewMode(this.minView);
+ this.maxView = g.modes.length - 1;
+ if ("maxView"in k) {
+ this.maxView = k.maxView
+ } else {
+ if ("maxView"in this.element.data()) {
+ this.maxView = this.element.data("max-view")
+ }
+ }
+ this.maxView = g.convertViewMode(this.maxView);
+ this.wheelViewModeNavigation = false;
+ if ("wheelViewModeNavigation"in k) {
+ this.wheelViewModeNavigation = k.wheelViewModeNavigation
+ } else {
+ if ("wheelViewModeNavigation"in this.element.data()) {
+ this.wheelViewModeNavigation = this.element.data("view-mode-wheel-navigation")
+ }
+ }
+ this.wheelViewModeNavigationInverseDirection = false;
+ if ("wheelViewModeNavigationInverseDirection"in k) {
+ this.wheelViewModeNavigationInverseDirection = k.wheelViewModeNavigationInverseDirection
+ } else {
+ if ("wheelViewModeNavigationInverseDirection"in this.element.data()) {
+ this.wheelViewModeNavigationInverseDirection = this.element.data("view-mode-wheel-navigation-inverse-dir")
+ }
+ }
+ this.wheelViewModeNavigationDelay = 100;
+ if ("wheelViewModeNavigationDelay"in k) {
+ this.wheelViewModeNavigationDelay = k.wheelViewModeNavigationDelay
+ } else {
+ if ("wheelViewModeNavigationDelay"in this.element.data()) {
+ this.wheelViewModeNavigationDelay = this.element.data("view-mode-wheel-navigation-delay")
+ }
+ }
+ this.startViewMode = 2;
+ if ("startView"in k) {
+ this.startViewMode = k.startView
+ } else {
+ if ("startView"in this.element.data()) {
+ this.startViewMode = this.element.data("start-view")
+ }
+ }
+ this.startViewMode = g.convertViewMode(this.startViewMode);
+ this.viewMode = this.startViewMode;
+ this.viewSelect = this.minView;
+ if ("viewSelect"in k) {
+ this.viewSelect = k.viewSelect
+ } else {
+ if ("viewSelect"in this.element.data()) {
+ this.viewSelect = this.element.data("view-select")
+ }
+ }
+ this.viewSelect = g.convertViewMode(this.viewSelect);
+ this.forceParse = true;
+ if ("forceParse"in k) {
+ this.forceParse = k.forceParse
+ } else {
+ if ("dateForceParse"in this.element.data()) {
+ this.forceParse = this.element.data("date-force-parse")
+ }
+ }
+ var m = this.bootcssVer === 3 ? g.templateV3 : g.template;
+ while (m.indexOf("{iconType}") !== -1) {
+ m = m.replace("{iconType}", this.icontype)
+ }
+ while (m.indexOf("{leftArrow}") !== -1) {
+ m = m.replace("{leftArrow}", this.icons.leftArrow)
+ }
+ while (m.indexOf("{rightArrow}") !== -1) {
+ m = m.replace("{rightArrow}", this.icons.rightArrow)
+ }
+ this.picker = f(m).appendTo(this.isInline ? this.element : this.container).on({
+ click: f.proxy(this.click, this),
+ mousedown: f.proxy(this.mousedown, this)
+ });
+ if (this.wheelViewModeNavigation) {
+ if (f.fn.mousewheel) {
+ this.picker.on({
+ mousewheel: f.proxy(this.mousewheel, this)
+ })
+ } else {
+ console.log("Mouse Wheel event is not supported. Please include the jQuery Mouse Wheel plugin before enabling this option")
+ }
+ }
+ if (this.isInline) {
+ this.picker.addClass("datetimepicker-inline")
+ } else {
+ this.picker.addClass("datetimepicker-dropdown-" + this.pickerPosition + " dropdown-menu")
+ }
+ if (this.isRTL) {
+ this.picker.addClass("datetimepicker-rtl");
+ var j = this.bootcssVer === 3 ? ".prev span, .next span" : ".prev i, .next i";
+ this.picker.find(j).toggleClass(this.icons.leftArrow + " " + this.icons.rightArrow)
+ }
+ f(document).on("mousedown", this.clickedOutside);
+ this.autoclose = false;
+ if ("autoclose"in k) {
+ this.autoclose = k.autoclose
+ } else {
+ if ("dateAutoclose"in this.element.data()) {
+ this.autoclose = this.element.data("date-autoclose")
+ }
+ }
+ this.keyboardNavigation = true;
+ if ("keyboardNavigation"in k) {
+ this.keyboardNavigation = k.keyboardNavigation
+ } else {
+ if ("dateKeyboardNavigation"in this.element.data()) {
+ this.keyboardNavigation = this.element.data("date-keyboard-navigation")
+ }
+ }
+ this.todayBtn = (k.todayBtn || this.element.data("date-today-btn") || false);
+ this.clearBtn = (k.clearBtn || this.element.data("date-clear-btn") || false);
+ this.todayHighlight = (k.todayHighlight || this.element.data("date-today-highlight") || false);
+ this.weekStart = ((k.weekStart || this.element.data("date-weekstart") || a[this.language].weekStart || 0) % 7);
+ this.weekEnd = ((this.weekStart + 6) % 7);
+ this.startDate = -Infinity;
+ this.endDate = Infinity;
+ this.datesDisabled = [];
+ this.daysOfWeekDisabled = [];
+ this.setStartDate(k.startDate || this.element.data("date-startdate"));
+ this.setEndDate(k.endDate || this.element.data("date-enddate"));
+ this.setDatesDisabled(k.datesDisabled || this.element.data("date-dates-disabled"));
+ this.setDaysOfWeekDisabled(k.daysOfWeekDisabled || this.element.data("date-days-of-week-disabled"));
+ this.setMinutesDisabled(k.minutesDisabled || this.element.data("date-minute-disabled"));
+ this.setHoursDisabled(k.hoursDisabled || this.element.data("date-hour-disabled"));
+ this.fillDow();
+ this.fillMonths();
+ this.update();
+ this.showMode();
+ if (this.isInline) {
+ this.show()
+ }
+ };
+ i.prototype = {
+ constructor: i,
+ _events: [],
+ _attachEvents: function() {
+ this._detachEvents();
+ if (this.isInput) {
+ this._events = [[this.element, {
+ focus: f.proxy(this.show, this),
+ keyup: f.proxy(this.update, this),
+ keydown: f.proxy(this.keydown, this)
+ }]]
+ } else {
+ if (this.component && this.hasInput) {
+ this._events = [[this.element.find("input"), {
+ focus: f.proxy(this.show, this),
+ keyup: f.proxy(this.update, this),
+ keydown: f.proxy(this.keydown, this)
+ }], [this.component, {
+ click: f.proxy(this.show, this)
+ }]];
+ if (this.componentReset) {
+ this._events.push([this.componentReset, {
+ click: f.proxy(this.reset, this)
+ }])
+ }
+ } else {
+ if (this.element.is("div")) {
+ this.isInline = true
+ } else {
+ this._events = [[this.element, {
+ click: f.proxy(this.show, this)
+ }]]
+ }
+ }
+ }
+ for (var j = 0, k, l; j < this._events.length; j++) {
+ k = this._events[j][0];
+ l = this._events[j][1];
+ k.on(l)
+ }
+ },
+ _detachEvents: function() {
+ for (var j = 0, k, l; j < this._events.length; j++) {
+ k = this._events[j][0];
+ l = this._events[j][1];
+ k.off(l)
+ }
+ this._events = []
+ },
+ show: function(j) {
+ this.picker.show();
+ this.height = this.component ? this.component.outerHeight() : this.element.outerHeight();
+ if (this.forceParse) {
+ this.update()
+ }
+ this.place();
+ f(window).on("resize", f.proxy(this.place, this));
+ if (j) {
+ j.stopPropagation();
+ j.preventDefault()
+ }
+ this.isVisible = true;
+ this.element.trigger({
+ type: "show",
+ date: this.date
+ })
+ },
+ hide: function(j) {
+ if (!this.isVisible) {
+ return
+ }
+ if (this.isInline) {
+ return
+ }
+ this.picker.hide();
+ f(window).off("resize", this.place);
+ this.viewMode = this.startViewMode;
+ this.showMode();
+ if (!this.isInput) {
+ f(document).off("mousedown", this.hide)
+ }
+ if (this.forceParse && (this.isInput && this.element.val() || this.hasInput && this.element.find("input").val())) {
+ this.setValue()
+ }
+ this.isVisible = false;
+ this.element.trigger({
+ type: "hide",
+ date: this.date
+ })
+ },
+ remove: function() {
+ this._detachEvents();
+ f(document).off("mousedown", this.clickedOutside);
+ this.picker.remove();
+ delete this.picker;
+ delete this.element.data().datetimepicker
+ },
+ getDate: function() {
+ var j = this.getUTCDate();
+ return new Date(j.getTime() + (j.getTimezoneOffset() * 60000))
+ },
+ getUTCDate: function() {
+ return this.date
+ },
+ setDate: function(j) {
+ this.setUTCDate(new Date(j.getTime() - (j.getTimezoneOffset() * 60000)))
+ },
+ setUTCDate: function(j) {
+ if (j >= this.startDate && j <= this.endDate) {
+ this.date = j;
+ this.setValue();
+ this.viewDate = this.date;
+ this.fill()
+ } else {
+ this.element.trigger({
+ type: "outOfRange",
+ date: j,
+ startDate: this.startDate,
+ endDate: this.endDate
+ })
+ }
+ },
+ setFormat: function(k) {
+ this.format = g.parseFormat(k, this.formatType);
+ var j;
+ if (this.isInput) {
+ j = this.element
+ } else {
+ if (this.component) {
+ j = this.element.find("input")
+ }
+ }
+ if (j && j.val()) {
+ this.setValue()
+ }
+ },
+ setValue: function() {
+ var j = this.getFormattedDate();
+ if (!this.isInput) {
+ if (this.component) {
+ this.element.find("input").val(j)
+ }
+ this.element.data("date", j)
+ } else {
+ this.element.val(j)
+ }
+ if (this.linkField) {
+ f("#" + this.linkField).val(this.getFormattedDate(this.linkFormat))
+ }
+ },
+ getFormattedDate: function(j) {
+ if (j == c) {
+ j = this.format
+ }
+ return g.formatDate(this.date, j, this.language, this.formatType)
+ },
+ setStartDate: function(j) {
+ this.startDate = j || -Infinity;
+ if (this.startDate !== -Infinity) {
+ this.startDate = g.parseDate(this.startDate, this.format, this.language, this.formatType)
+ }
+ this.update();
+ this.updateNavArrows()
+ },
+ setEndDate: function(j) {
+ this.endDate = j || Infinity;
+ if (this.endDate !== Infinity) {
+ this.endDate = g.parseDate(this.endDate, this.format, this.language, this.formatType)
+ }
+ this.update();
+ this.updateNavArrows()
+ },
+ setDatesDisabled: function(j) {
+ this.datesDisabled = j || [];
+ if (!f.isArray(this.datesDisabled)) {
+ this.datesDisabled = this.datesDisabled.split(/,\s*/)
+ }
+ this.datesDisabled = f.map(this.datesDisabled, function(k) {
+ return g.parseDate(k, this.format, this.language, this.formatType).toDateString()
+ });
+ this.update();
+ this.updateNavArrows()
+ },
+ setTitle: function(j, k) {
+ return this.picker.find(j).find("th:eq(1)").text(this.title === false ? k : this.title)
+ },
+ setDaysOfWeekDisabled: function(j) {
+ this.daysOfWeekDisabled = j || [];
+ if (!f.isArray(this.daysOfWeekDisabled)) {
+ this.daysOfWeekDisabled = this.daysOfWeekDisabled.split(/,\s*/)
+ }
+ this.daysOfWeekDisabled = f.map(this.daysOfWeekDisabled, function(k) {
+ return parseInt(k, 10)
+ });
+ this.update();
+ this.updateNavArrows()
+ },
+ setMinutesDisabled: function(j) {
+ this.minutesDisabled = j || [];
+ if (!f.isArray(this.minutesDisabled)) {
+ this.minutesDisabled = this.minutesDisabled.split(/,\s*/)
+ }
+ this.minutesDisabled = f.map(this.minutesDisabled, function(k) {
+ return parseInt(k, 10)
+ });
+ this.update();
+ this.updateNavArrows()
+ },
+ setHoursDisabled: function(j) {
+ this.hoursDisabled = j || [];
+ if (!f.isArray(this.hoursDisabled)) {
+ this.hoursDisabled = this.hoursDisabled.split(/,\s*/)
+ }
+ this.hoursDisabled = f.map(this.hoursDisabled, function(k) {
+ return parseInt(k, 10)
+ });
+ this.update();
+ this.updateNavArrows()
+ },
+ place: function() {
+ if (this.isInline) {
+ return
+ }
+ if (!this.zIndex) {
+ var k = 0;
+ f("div").each(function() {
+ var p = parseInt(f(this).css("zIndex"), 10);
+ if (p > k) {
+ k = p
+ }
+ });
+ this.zIndex = k + 10
+ }
+ var o, n, m, l;
+ if (this.container instanceof f) {
+ l = this.container.offset()
+ } else {
+ l = f(this.container).offset()
+ }
+ if (this.component) {
+ o = this.component.offset();
+ m = o.left;
+ if (this.pickerPosition == "bottom-left" || this.pickerPosition == "top-left") {
+ m += this.component.outerWidth() - this.picker.outerWidth()
+ }
+ } else {
+ o = this.element.offset();
+ m = o.left;
+ if (this.pickerPosition == "bottom-left" || this.pickerPosition == "top-left") {
+ m += this.element.outerWidth() - this.picker.outerWidth()
+ }
+ }
+ var j = document.body.clientWidth || window.innerWidth;
+ if (m + 220 > j) {
+ m = j - 220
+ }
+ if (this.component) {
+ n = n - l.top + 169;
+ m = m - l.left + 210
+ } else {
+ if (this.pickerPosition == "top-left" || this.pickerPosition == "top-right") {
+ n = o.top - this.picker.outerHeight()
+ } else {
+ n = o.top + this.height
+ }
+ }
+ this.picker.css({
+ top: n,
+ left: m,
+ zIndex: this.zIndex
+ })
+ },
+ update: function() {
+ var j, k = false;
+ if (arguments && arguments.length && (typeof arguments[0] === "string" || arguments[0]instanceof Date)) {
+ j = arguments[0];
+ k = true
+ } else {
+ j = (this.isInput ? this.element.val() : this.element.find("input").val()) || this.element.data("date") || this.initialDate;
+ if (typeof j == "string" || j instanceof String) {
+ j = j.replace(/^\s+|\s+$/g, "")
+ }
+ }
+ if (!j) {
+ j = new Date();
+ k = false
+ }
+ this.date = g.parseDate(j, this.format, this.language, this.formatType);
+ if (k) {
+ this.setValue()
+ }
+ if (this.date < this.startDate) {
+ this.viewDate = new Date(this.startDate)
+ } else {
+ if (this.date > this.endDate) {
+ this.viewDate = new Date(this.endDate)
+ } else {
+ this.viewDate = new Date(this.date)
+ }
+ }
+ this.fill()
+ },
+ fillDow: function() {
+ var j = this.weekStart
+ , k = "";
+ while (j < this.weekStart + 7) {
+ k += '' + a[this.language].daysMin[(j++) % 7] + " "
+ }
+ k += " ";
+ this.picker.find(".datetimepicker-days thead").append(k)
+ },
+ fillMonths: function() {
+ var k = ""
+ , j = 0;
+ while (j < 12) {
+ k += '' + a[this.language].monthsShort[j++] + " "
+ }
+ this.picker.find(".datetimepicker-months td").html(k)
+ },
+ fill: function() {
+ if (this.date == null || this.viewDate == null) {
+ return
+ }
+ var H = new Date(this.viewDate)
+ , u = H.getUTCFullYear()
+ , I = H.getUTCMonth()
+ , n = H.getUTCDate()
+ , D = H.getUTCHours()
+ , y = H.getUTCMinutes()
+ , z = this.startDate !== -Infinity ? this.startDate.getUTCFullYear() : -Infinity
+ , E = this.startDate !== -Infinity ? this.startDate.getUTCMonth() + 1 : -Infinity
+ , q = this.endDate !== Infinity ? this.endDate.getUTCFullYear() : Infinity
+ , A = this.endDate !== Infinity ? this.endDate.getUTCMonth() + 1 : Infinity
+ , r = (new h(this.date.getUTCFullYear(),this.date.getUTCMonth(),this.date.getUTCDate())).valueOf()
+ , G = new Date();
+ this.setTitle(".datetimepicker-days", a[this.language].months[I] + " " + u);
+ if (this.formatViewType == "time") {
+ var k = this.getFormattedDate();
+ this.setTitle(".datetimepicker-hours", k);
+ this.setTitle(".datetimepicker-minutes", k)
+ } else {
+ this.setTitle(".datetimepicker-hours", n + " " + a[this.language].months[I] + " " + u);
+ this.setTitle(".datetimepicker-minutes", n + " " + a[this.language].months[I] + " " + u)
+ }
+ this.picker.find("tfoot th.today").text(a[this.language].today || a.en.today).toggle(this.todayBtn !== false);
+ this.picker.find("tfoot th.clear").text(a[this.language].clear || a.en.clear).toggle(this.clearBtn !== false);
+ this.updateNavArrows();
+ this.fillMonths();
+ var K = h(u, I - 1, 28, 0, 0, 0, 0)
+ , C = g.getDaysInMonth(K.getUTCFullYear(), K.getUTCMonth());
+ K.setUTCDate(C);
+ K.setUTCDate(C - (K.getUTCDay() - this.weekStart + 7) % 7);
+ var j = new Date(K);
+ j.setUTCDate(j.getUTCDate() + 42);
+ j = j.valueOf();
+ var s = [];
+ var v;
+ while (K.valueOf() < j) {
+ if (K.getUTCDay() == this.weekStart) {
+ s.push("")
+ }
+ v = "";
+ if (K.getUTCFullYear() < u || (K.getUTCFullYear() == u && K.getUTCMonth() < I)) {
+ v += " old"
+ } else {
+ if (K.getUTCFullYear() > u || (K.getUTCFullYear() == u && K.getUTCMonth() > I)) {
+ v += " new"
+ }
+ }
+ if (this.todayHighlight && K.getUTCFullYear() == G.getFullYear() && K.getUTCMonth() == G.getMonth() && K.getUTCDate() == G.getDate()) {
+ v += " today"
+ }
+ if (K.valueOf() == r) {
+ v += " active"
+ }
+ if ((K.valueOf() + 86400000) <= this.startDate || K.valueOf() > this.endDate || f.inArray(K.getUTCDay(), this.daysOfWeekDisabled) !== -1 || f.inArray(K.toDateString(), this.datesDisabled) !== -1) {
+ v += " disabled"
+ }
+ s.push('' + K.getUTCDate() + " ");
+ if (K.getUTCDay() == this.weekEnd) {
+ s.push(" ")
+ }
+ K.setUTCDate(K.getUTCDate() + 1)
+ }
+ this.picker.find(".datetimepicker-days tbody").empty().append(s.join(""));
+ s = [];
+ var w = ""
+ , F = ""
+ , t = "";
+ var l = this.hoursDisabled || [];
+ for (var B = 0; B < 24; B++) {
+ if (l.indexOf(B) !== -1) {
+ continue
+ }
+ var x = h(u, I, n, B);
+ v = "";
+ if ((x.valueOf() + 3600000) <= this.startDate || x.valueOf() > this.endDate) {
+ v += " disabled"
+ } else {
+ if (D == B) {
+ v += " active"
+ }
+ }
+ if (this.showMeridian && a[this.language].meridiem.length == 2) {
+ F = (B < 12 ? a[this.language].meridiem[0] : a[this.language].meridiem[1]);
+ if (F != t) {
+ if (t != "") {
+ s.push("")
+ }
+ s.push('' + F.toUpperCase() + " ")
+ }
+ t = F;
+ w = (B % 12 ? B % 12 : 12);
+ s.push('' + w + " ");
+ if (B == 23) {
+ s.push(" ")
+ }
+ } else {
+ w = B + ":00";
+ s.push('' + w + " ")
+ }
+ }
+ this.picker.find(".datetimepicker-hours td").html(s.join(""));
+ s = [];
+ w = "",
+ F = "",
+ t = "";
+ var m = this.minutesDisabled || [];
+ for (let B = 0; B < 60; B += this.minuteStep) {
+ if (m.indexOf(B) !== -1) {
+ continue
+ }
+ let x = h(u, I, n, D, B, 0);
+ v = "";
+ if (x.valueOf() < this.startDate || x.valueOf() > this.endDate) {
+ v += " disabled"
+ } else {
+ if (Math.floor(y / this.minuteStep) == Math.floor(B / this.minuteStep)) {
+ v += " active"
+ }
+ }
+ if (this.showMeridian && a[this.language].meridiem.length == 2) {
+ F = (D < 12 ? a[this.language].meridiem[0] : a[this.language].meridiem[1]);
+ if (F != t) {
+ if (t != "") {
+ s.push("")
+ }
+ s.push('' + F.toUpperCase() + " ")
+ }
+ t = F;
+ w = (D % 12 ? D % 12 : 12);
+ s.push('' + w + ":" + (B < 10 ? "0" + B : B) + " ");
+ if (B == 59) {
+ s.push(" ")
+ }
+ } else {
+ w = B + ":00";
+ s.push('' + D + ":" + (B < 10 ? "0" + B : B) + " ")
+ }
+ }
+ this.picker.find(".datetimepicker-minutes td").html(s.join(""));
+ var L = this.date.getUTCFullYear();
+ var p = this.setTitle(".datetimepicker-months", u).end().find("span").removeClass("active");
+ if (L == u) {
+ var o = p.length - 12;
+ p.eq(this.date.getUTCMonth() + o).addClass("active")
+ }
+ if (u < z || u > q) {
+ p.addClass("disabled")
+ }
+ if (u == z) {
+ p.slice(0, E + 1).addClass("disabled")
+ }
+ if (u == q) {
+ p.slice(A).addClass("disabled")
+ }
+ s = "";
+ u = parseInt(u / 10, 10) * 10;
+ var J = this.setTitle(".datetimepicker-years", u + "-" + (u + 9)).end().find("td");
+ u -= 1;
+ for (let B = -1; B < 11; B++) {
+ s += ' q ? " disabled" : "") + '">' + u + " ";
+ u += 1
+ }
+ J.html(s);
+ this.place()
+ },
+ updateNavArrows: function() {
+ var n = new Date(this.viewDate)
+ , l = n.getUTCFullYear()
+ , m = n.getUTCMonth()
+ , k = n.getUTCDate()
+ , j = n.getUTCHours();
+ switch (this.viewMode) {
+ case 0:
+ if (this.startDate !== -Infinity && l <= this.startDate.getUTCFullYear() && m <= this.startDate.getUTCMonth() && k <= this.startDate.getUTCDate() && j <= this.startDate.getUTCHours()) {
+ this.picker.find(".prev").css({
+ visibility: "hidden"
+ })
+ } else {
+ this.picker.find(".prev").css({
+ visibility: "visible"
+ })
+ }
+ if (this.endDate !== Infinity && l >= this.endDate.getUTCFullYear() && m >= this.endDate.getUTCMonth() && k >= this.endDate.getUTCDate() && j >= this.endDate.getUTCHours()) {
+ this.picker.find(".next").css({
+ visibility: "hidden"
+ })
+ } else {
+ this.picker.find(".next").css({
+ visibility: "visible"
+ })
+ }
+ break;
+ case 1:
+ if (this.startDate !== -Infinity && l <= this.startDate.getUTCFullYear() && m <= this.startDate.getUTCMonth() && k <= this.startDate.getUTCDate()) {
+ this.picker.find(".prev").css({
+ visibility: "hidden"
+ })
+ } else {
+ this.picker.find(".prev").css({
+ visibility: "visible"
+ })
+ }
+ if (this.endDate !== Infinity && l >= this.endDate.getUTCFullYear() && m >= this.endDate.getUTCMonth() && k >= this.endDate.getUTCDate()) {
+ this.picker.find(".next").css({
+ visibility: "hidden"
+ })
+ } else {
+ this.picker.find(".next").css({
+ visibility: "visible"
+ })
+ }
+ break;
+ case 2:
+ if (this.startDate !== -Infinity && l <= this.startDate.getUTCFullYear() && m <= this.startDate.getUTCMonth()) {
+ this.picker.find(".prev").css({
+ visibility: "hidden"
+ })
+ } else {
+ this.picker.find(".prev").css({
+ visibility: "visible"
+ })
+ }
+ if (this.endDate !== Infinity && l >= this.endDate.getUTCFullYear() && m >= this.endDate.getUTCMonth()) {
+ this.picker.find(".next").css({
+ visibility: "hidden"
+ })
+ } else {
+ this.picker.find(".next").css({
+ visibility: "visible"
+ })
+ }
+ break;
+ case 3:
+ case 4:
+ if (this.startDate !== -Infinity && l <= this.startDate.getUTCFullYear()) {
+ this.picker.find(".prev").css({
+ visibility: "hidden"
+ })
+ } else {
+ this.picker.find(".prev").css({
+ visibility: "visible"
+ })
+ }
+ if (this.endDate !== Infinity && l >= this.endDate.getUTCFullYear()) {
+ this.picker.find(".next").css({
+ visibility: "hidden"
+ })
+ } else {
+ this.picker.find(".next").css({
+ visibility: "visible"
+ })
+ }
+ break
+ }
+ },
+ mousewheel: function(k) {
+ k.preventDefault();
+ k.stopPropagation();
+ if (this.wheelPause) {
+ return
+ }
+ this.wheelPause = true;
+ var j = k.originalEvent;
+ var m = j.wheelDelta;
+ var l = m > 0 ? 1 : (m === 0) ? 0 : -1;
+ if (this.wheelViewModeNavigationInverseDirection) {
+ l = -l
+ }
+ this.showMode(l);
+ setTimeout(f.proxy(function() {
+ this.wheelPause = false
+ }, this), this.wheelViewModeNavigationDelay)
+ },
+ click: function(n) {
+ n.stopPropagation();
+ n.preventDefault();
+ var o = f(n.target).closest("span, td, th, legend");
+ if (o.is("." + this.icontype)) {
+ o = f(o).parent().closest("span, td, th, legend")
+ }
+ if (o.length == 1) {
+ if (o.is(".disabled")) {
+ this.element.trigger({
+ type: "outOfRange",
+ date: this.viewDate,
+ startDate: this.startDate,
+ endDate: this.endDate
+ });
+ return
+ }
+ switch (o[0].nodeName.toLowerCase()) {
+ case "th":
+ switch (o[0].className) {
+ case "switch":
+ this.showMode(1);
+ break;
+ case "prev":
+ case "next":
+ var j = g.modes[this.viewMode].navStep * (o[0].className == "prev" ? -1 : 1);
+ switch (this.viewMode) {
+ case 0:
+ this.viewDate = this.moveHour(this.viewDate, j);
+ break;
+ case 1:
+ this.viewDate = this.moveDate(this.viewDate, j);
+ break;
+ case 2:
+ this.viewDate = this.moveMonth(this.viewDate, j);
+ break;
+ case 3:
+ case 4:
+ this.viewDate = this.moveYear(this.viewDate, j);
+ break
+ }
+ this.fill();
+ this.element.trigger({
+ type: o[0].className + ":" + this.convertViewModeText(this.viewMode),
+ date: this.viewDate,
+ startDate: this.startDate,
+ endDate: this.endDate
+ });
+ break;
+ case "clear":
+ this.reset();
+ if (this.autoclose) {
+ this.hide()
+ }
+ break;
+ case "today":
+ var k = new Date();
+ k = h(k.getFullYear(), k.getMonth(), k.getDate(), k.getHours(), k.getMinutes(), k.getSeconds(), 0);
+ if (k < this.startDate) {
+ k = this.startDate
+ } else {
+ if (k > this.endDate) {
+ k = this.endDate
+ }
+ }
+ this.viewMode = this.startViewMode;
+ this.showMode(0);
+ this._setDate(k);
+ this.fill();
+ if (this.autoclose) {
+ this.hide()
+ }
+ break
+ }
+ break;
+ case "span":
+ if (!o.is(".disabled")) {
+ var q = this.viewDate.getUTCFullYear()
+ , p = this.viewDate.getUTCMonth()
+ , r = this.viewDate.getUTCDate()
+ , s = this.viewDate.getUTCHours()
+ , l = this.viewDate.getUTCMinutes()
+ , t = this.viewDate.getUTCSeconds();
+ if (o.is(".month")) {
+ this.viewDate.setUTCDate(1);
+ p = o.parent().find("span").index(o);
+ r = this.viewDate.getUTCDate();
+ this.viewDate.setUTCMonth(p);
+ this.element.trigger({
+ type: "changeMonth",
+ date: this.viewDate
+ });
+ if (this.viewSelect >= 3) {
+ this._setDate(h(q, p, r, s, l, t, 0))
+ }
+ } else {
+ if (o.is(".year")) {
+ this.viewDate.setUTCDate(1);
+ q = parseInt(o.text(), 10) || 0;
+ this.viewDate.setUTCFullYear(q);
+ this.element.trigger({
+ type: "changeYear",
+ date: this.viewDate
+ });
+ if (this.viewSelect >= 4) {
+ this._setDate(h(q, p, r, s, l, t, 0))
+ }
+ } else {
+ if (o.is(".hour")) {
+ s = parseInt(o.text(), 10) || 0;
+ if (o.hasClass("hour_am") || o.hasClass("hour_pm")) {
+ if (s == 12 && o.hasClass("hour_am")) {
+ s = 0
+ } else {
+ if (s != 12 && o.hasClass("hour_pm")) {
+ s += 12
+ }
+ }
+ }
+ this.viewDate.setUTCHours(s);
+ this.element.trigger({
+ type: "changeHour",
+ date: this.viewDate
+ });
+ if (this.viewSelect >= 1) {
+ this._setDate(h(q, p, r, s, l, t, 0))
+ }
+ } else {
+ if (o.is(".minute")) {
+ l = parseInt(o.text().substr(o.text().indexOf(":") + 1), 10) || 0;
+ this.viewDate.setUTCMinutes(l);
+ this.element.trigger({
+ type: "changeMinute",
+ date: this.viewDate
+ });
+ if (this.viewSelect >= 0) {
+ this._setDate(h(q, p, r, s, l, t, 0))
+ }
+ }
+ }
+ }
+ }
+ if (this.viewMode != 0) {
+ var m = this.viewMode;
+ this.showMode(-1);
+ this.fill();
+ if (m == this.viewMode && this.autoclose) {
+ this.hide()
+ }
+ } else {
+ this.fill();
+ if (this.autoclose) {
+ this.hide()
+ }
+ }
+ }
+ break;
+ case "td":
+ if (o.is(".day") && !o.is(".disabled")) {
+ let r = parseInt(o.text(), 10) || 1;
+ let q = this.viewDate.getUTCFullYear()
+ , p = this.viewDate.getUTCMonth()
+ , s = this.viewDate.getUTCHours()
+ , l = this.viewDate.getUTCMinutes()
+ , t = this.viewDate.getUTCSeconds();
+ if (o.is(".old")) {
+ if (p === 0) {
+ p = 11;
+ q -= 1
+ } else {
+ p -= 1
+ }
+ } else {
+ if (o.is(".new")) {
+ if (p == 11) {
+ p = 0;
+ q += 1
+ } else {
+ p += 1
+ }
+ }
+ }
+ this.viewDate.setUTCFullYear(q);
+ this.viewDate.setUTCMonth(p, r);
+ this.element.trigger({
+ type: "changeDay",
+ date: this.viewDate
+ });
+ if (this.viewSelect >= 2) {
+ this._setDate(h(q, p, r, s, l, t, 0))
+ }
+ }
+ m = this.viewMode;
+ this.showMode(-1);
+ this.fill();
+ if (m == this.viewMode && this.autoclose) {
+ this.hide()
+ }
+ break
+ }
+ }
+ },
+ _setDate: function(j, l) {
+ if (!l || l == "date") {
+ this.date = j
+ }
+ if (!l || l == "view") {
+ this.viewDate = j
+ }
+ this.fill();
+ this.setValue();
+ var k;
+ if (this.isInput) {
+ k = this.element
+ } else {
+ if (this.component) {
+ k = this.element.find("input")
+ }
+ }
+ if (k) {
+ k.change();
+ if (this.autoclose && (!l || l == "date")) ;
+ }
+ this.element.trigger({
+ type: "changeDate",
+ date: this.getDate()
+ });
+ if (j == null) {
+ this.date = this.viewDate
+ }
+ },
+ moveMinute: function(k, j) {
+ if (!j) {
+ return k
+ }
+ var l = new Date(k.valueOf());
+ l.setUTCMinutes(l.getUTCMinutes() + (j * this.minuteStep));
+ return l
+ },
+ moveHour: function(k, j) {
+ if (!j) {
+ return k
+ }
+ var l = new Date(k.valueOf());
+ l.setUTCHours(l.getUTCHours() + j);
+ return l
+ },
+ moveDate: function(k, j) {
+ if (!j) {
+ return k
+ }
+ var l = new Date(k.valueOf());
+ l.setUTCDate(l.getUTCDate() + j);
+ return l
+ },
+ moveMonth: function(j, k) {
+ if (!k) {
+ return j
+ }
+ var n = new Date(j.valueOf()), r = n.getUTCDate(), o = n.getUTCMonth(), m = Math.abs(k), q, p;
+ k = k > 0 ? 1 : -1;
+ if (m == 1) {
+ p = k == -1 ? function() {
+ return n.getUTCMonth() == o
+ }
+ : function() {
+ return n.getUTCMonth() != q
+ }
+ ;
+ q = o + k;
+ n.setUTCMonth(q);
+ if (q < 0 || q > 11) {
+ q = (q + 12) % 12
+ }
+ } else {
+ for (var l = 0; l < m; l++) {
+ n = this.moveMonth(n, k)
+ }
+ q = n.getUTCMonth();
+ n.setUTCDate(r);
+ p = function() {
+ return q != n.getUTCMonth()
+ }
+ }
+ while (p()) {
+ n.setUTCDate(--r);
+ n.setUTCMonth(q)
+ }
+ return n
+ },
+ moveYear: function(k, j) {
+ return this.moveMonth(k, j * 12)
+ },
+ dateWithinRange: function(j) {
+ return j >= this.startDate && j <= this.endDate
+ },
+ keydown: function(n) {
+ let viewMode;
+ if (this.picker.is(":not(:visible)")) {
+ if (n.keyCode == 27) {
+ this.show()
+ }
+ return
+ }
+ var p = false, k, q, o, r, j;
+ switch (n.keyCode) {
+ case 27:
+ this.hide();
+ n.preventDefault();
+ break;
+ case 37:
+ case 39:
+ if (!this.keyboardNavigation) {
+ break
+ }
+ k = n.keyCode == 37 ? -1 : 1;
+ viewMode = this.viewMode;
+ if (n.ctrlKey) {
+ viewMode += 2
+ } else {
+ if (n.shiftKey) {
+ viewMode += 1
+ }
+ }
+ if (viewMode == 4) {
+ r = this.moveYear(this.date, k);
+ j = this.moveYear(this.viewDate, k)
+ } else {
+ if (viewMode == 3) {
+ r = this.moveMonth(this.date, k);
+ j = this.moveMonth(this.viewDate, k)
+ } else {
+ if (viewMode == 2) {
+ r = this.moveDate(this.date, k);
+ j = this.moveDate(this.viewDate, k)
+ } else {
+ if (viewMode == 1) {
+ r = this.moveHour(this.date, k);
+ j = this.moveHour(this.viewDate, k)
+ } else {
+ if (viewMode == 0) {
+ r = this.moveMinute(this.date, k);
+ j = this.moveMinute(this.viewDate, k)
+ }
+ }
+ }
+ }
+ }
+ if (this.dateWithinRange(r)) {
+ this.date = r;
+ this.viewDate = j;
+ this.setValue();
+ this.update();
+ n.preventDefault();
+ p = true
+ }
+ break;
+ case 38:
+ case 40:
+ if (!this.keyboardNavigation) {
+ break
+ }
+ k = n.keyCode == 38 ? -1 : 1;
+ viewMode = this.viewMode;
+ if (n.ctrlKey) {
+ viewMode += 2
+ } else {
+ if (n.shiftKey) {
+ viewMode += 1
+ }
+ }
+ if (viewMode == 4) {
+ r = this.moveYear(this.date, k);
+ j = this.moveYear(this.viewDate, k)
+ } else {
+ if (viewMode == 3) {
+ r = this.moveMonth(this.date, k);
+ j = this.moveMonth(this.viewDate, k)
+ } else {
+ if (viewMode == 2) {
+ r = this.moveDate(this.date, k * 7);
+ j = this.moveDate(this.viewDate, k * 7)
+ } else {
+ if (viewMode == 1) {
+ if (this.showMeridian) {
+ r = this.moveHour(this.date, k * 6);
+ j = this.moveHour(this.viewDate, k * 6)
+ } else {
+ r = this.moveHour(this.date, k * 4);
+ j = this.moveHour(this.viewDate, k * 4)
+ }
+ } else {
+ if (viewMode == 0) {
+ r = this.moveMinute(this.date, k * 4);
+ j = this.moveMinute(this.viewDate, k * 4)
+ }
+ }
+ }
+ }
+ }
+ if (this.dateWithinRange(r)) {
+ this.date = r;
+ this.viewDate = j;
+ this.setValue();
+ this.update();
+ n.preventDefault();
+ p = true
+ }
+ break;
+ case 13:
+ if (this.viewMode != 0) {
+ var m = this.viewMode;
+ this.showMode(-1);
+ this.fill();
+ if (m == this.viewMode && this.autoclose) {
+ this.hide()
+ }
+ } else {
+ this.fill();
+ if (this.autoclose) {
+ this.hide()
+ }
+ }
+ n.preventDefault();
+ break;
+ case 9:
+ this.hide();
+ break
+ }
+ if (p) {
+ var l;
+ if (this.isInput) {
+ l = this.element
+ } else {
+ if (this.component) {
+ l = this.element.find("input")
+ }
+ }
+ if (l) {
+ l.change()
+ }
+ this.element.trigger({
+ type: "changeDate",
+ date: this.getDate()
+ })
+ }
+ },
+ showMode: function(j) {
+ if (j) {
+ var k = Math.max(0, Math.min(g.modes.length - 1, this.viewMode + j));
+ if (k >= this.minView && k <= this.maxView) {
+ this.element.trigger({
+ type: "changeMode",
+ date: this.viewDate,
+ oldViewMode: this.viewMode,
+ newViewMode: k
+ });
+ this.viewMode = k
+ }
+ }
+ this.picker.find(">div").hide().filter(".datetimepicker-" + g.modes[this.viewMode].clsName).css("display", "block");
+ this.updateNavArrows()
+ },
+ reset: function(j) {
+ this._setDate(null, "date")
+ },
+ convertViewModeText: function(j) {
+ switch (j) {
+ case 4:
+ return "decade";
+ case 3:
+ return "year";
+ case 2:
+ return "month";
+ case 1:
+ return "day";
+ case 0:
+ return "hour"
+ }
+ }
+ };
+ var b = f.fn.datetimepicker;
+ f.fn.datetimepicker = function(l) {
+ var j = Array.apply(null, arguments);
+ j.shift();
+ var k;
+ this.each(function() {
+ var o = f(this)
+ , n = o.data("datetimepicker")
+ , m = typeof l == "object" && l;
+ if (!n) {
+ o.data("datetimepicker", (n = new i(this,f.extend({}, f.fn.datetimepicker.defaults, m))))
+ }
+ if (typeof l == "string" && typeof n[l] == "function") {
+ k = n[l].apply(n, j);
+ if (k !== c) {
+ return false
+ }
+ }
+ });
+ if (k !== c) {
+ return k
+ } else {
+ return this
+ }
+ }
+ ;
+ f.fn.datetimepicker.defaults = {};
+ f.fn.datetimepicker.Constructor = i;
+ var a = f.fn.datetimepicker.dates = {
+ en: {
+ days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"],
+ daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
+ daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"],
+ months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
+ monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
+ meridiem: ["am", "pm"],
+ suffix: ["st", "nd", "rd", "th"],
+ today: "Today",
+ clear: "Clear"
+ }
+ };
+ var g = {
+ modes: [{
+ clsName: "minutes",
+ navFnc: "Hours",
+ navStep: 1
+ }, {
+ clsName: "hours",
+ navFnc: "Date",
+ navStep: 1
+ }, {
+ clsName: "days",
+ navFnc: "Month",
+ navStep: 1
+ }, {
+ clsName: "months",
+ navFnc: "FullYear",
+ navStep: 1
+ }, {
+ clsName: "years",
+ navFnc: "FullYear",
+ navStep: 10
+ }],
+ isLeapYear: function(j) {
+ return (((j % 4 === 0) && (j % 100 !== 0)) || (j % 400 === 0))
+ },
+ getDaysInMonth: function(j, k) {
+ return [31, (g.isLeapYear(j) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][k]
+ },
+ getDefaultFormat: function(j, k) {
+ if (j == "standard") {
+ if (k == "input") {
+ return "yyyy-mm-dd hh:ii"
+ } else {
+ return "yyyy-mm-dd hh:ii:ss"
+ }
+ } else {
+ if (j == "php") {
+ if (k == "input") {
+ return "Y-m-d H:i"
+ } else {
+ return "Y-m-d H:i:s"
+ }
+ } else {
+ throw new Error("Invalid format type.")
+ }
+ }
+ },
+ validParts: function(j) {
+ if (j == "standard") {
+ return /t|hh?|HH?|p|P|ii?|ss?|dd?|DD?|mm?|MM?|yy(?:yy)?/g
+ } else {
+ if (j == "php") {
+ return /[dDjlNwzFmMnStyYaABgGhHis]/g
+ } else {
+ throw new Error("Invalid format type.")
+ }
+ }
+ },
+ nonpunctuation: /[^ -\/:-@\[-`{-~\t\n\rTZ]+/g,
+ parseFormat: function(m, k) {
+ var j = m.replace(this.validParts(k), "\0").split("\0")
+ , l = m.match(this.validParts(k));
+ if (!j || !j.length || !l || l.length == 0) {
+ throw new Error("Invalid date format.")
+ }
+ return {
+ separators: j,
+ parts: l
+ }
+ },
+ parseDate: function(n, w, q, u) {
+ let x;
+ if (n instanceof Date) {
+ var y = new Date(n.valueOf() - n.getTimezoneOffset() * 60000);
+ y.setMilliseconds(0);
+ return y
+ }
+ if (/^\d{4}\-\d{1,2}\-\d{1,2}$/.test(n)) {
+ w = this.parseFormat("yyyy-mm-dd", u)
+ }
+ if (/^\d{4}\-\d{1,2}\-\d{1,2}[T ]\d{1,2}\:\d{1,2}$/.test(n)) {
+ w = this.parseFormat("yyyy-mm-dd hh:ii", u)
+ }
+ if (/^\d{4}\-\d{1,2}\-\d{1,2}[T ]\d{1,2}\:\d{1,2}\:\d{1,2}[Z]{0,1}$/.test(n)) {
+ w = this.parseFormat("yyyy-mm-dd hh:ii:ss", u)
+ }
+ if (/^[-+]\d+[dmwy]([\s,]+[-+]\d+[dmwy])*$/.test(n)) {
+ var z = /([-+]\d+)([dmwy])/, o = n.match(/([-+]\d+)([dmwy])/g), j, m;
+ n = new Date();
+ for (var p = 0; p < o.length; p++) {
+ j = z.exec(o[p]);
+ m = parseInt(j[1]);
+ switch (j[2]) {
+ case "d":
+ n.setUTCDate(n.getUTCDate() + m);
+ break;
+ case "m":
+ n = i.prototype.moveMonth.call(i.prototype, n, m);
+ break;
+ case "w":
+ n.setUTCDate(n.getUTCDate() + m * 7);
+ break;
+ case "y":
+ n = i.prototype.moveYear.call(i.prototype, n, m);
+ break
+ }
+ }
+ return h(n.getUTCFullYear(), n.getUTCMonth(), n.getUTCDate(), n.getUTCHours(), n.getUTCMinutes(), n.getUTCSeconds(), 0)
+ }
+ o = n && n.toString().match(this.nonpunctuation) || [], x = {
+ hh: function(B, s) {
+ return B.setUTCHours(s)
+ },
+ h: function(B, s) {
+ return B.setUTCHours(s)
+ },
+ HH: function(B, s) {
+ return B.setUTCHours(s == 12 ? 0 : s)
+ },
+ H: function(B, s) {
+ return B.setUTCHours(s == 12 ? 0 : s)
+ },
+ ii: function(B, s) {
+ return B.setUTCMinutes(s)
+ },
+ i: function(B, s) {
+ return B.setUTCMinutes(s)
+ },
+ ss: function(B, s) {
+ return B.setUTCSeconds(s)
+ },
+ s: function(B, s) {
+ return B.setUTCSeconds(s)
+ },
+ yyyy: function(B, s) {
+ return B.setUTCFullYear(s)
+ },
+ yy: function(B, s) {
+ return B.setUTCFullYear(2000 + s)
+ },
+ m: function(B, s) {
+ s -= 1;
+ while (s < 0) {
+ s += 12
+ }
+ s %= 12;
+ B.setUTCMonth(s);
+ while (B.getUTCMonth() != s) {
+ if (isNaN(B.getUTCMonth())) {
+ return B
+ } else {
+ B.setUTCDate(B.getUTCDate() - 1)
+ }
+ }
+ return B
+ },
+ d: function(B, s) {
+ return B.setUTCDate(s)
+ },
+ p: function(B, s) {
+ return B.setUTCHours(s == 1 ? B.getUTCHours() + 12 : B.getUTCHours())
+ }
+ };
+ let t = {}, v = ["hh", "h", "ii", "i", "ss", "s", "yyyy", "yy", "M", "MM", "m", "mm", "D", "DD", "d", "dd", "H", "HH", "p", "P"], l, r;
+ n = new Date(0,0,0,0,0,0,0);
+ x.M = x.MM = x.mm = x.m;
+ x.dd = x.d;
+ x.P = x.p;
+ n = h(n.getFullYear(), n.getMonth(), n.getDate(), n.getHours(), n.getMinutes(), n.getSeconds());
+ if (o.length == w.parts.length) {
+ for (let p = 0, k = w.parts.length; p < k; p++) {
+ l = parseInt(o[p], 10);
+ j = w.parts[p];
+ if (isNaN(l)) {
+ switch (j) {
+ case "MM":
+ r = f(a[q].months).filter(function() {
+ var s = this.slice(0, o[p].length)
+ , B = o[p].slice(0, s.length);
+ return s == B
+ });
+ l = f.inArray(r[0], a[q].months) + 1;
+ break;
+ case "M":
+ r = f(a[q].monthsShort).filter(function() {
+ var s = this.slice(0, o[p].length)
+ , B = o[p].slice(0, s.length);
+ return s.toLowerCase() == B.toLowerCase()
+ });
+ l = f.inArray(r[0], a[q].monthsShort) + 1;
+ break;
+ case "p":
+ case "P":
+ l = f.inArray(o[p].toLowerCase(), a[q].meridiem);
+ break
+ }
+ }
+ t[j] = l;
+ }
+ for (let p = 0, A; p < v.length; p++) {
+ A = v[p];
+ if (A in t && !isNaN(t[A])) {
+ x[A](n, t[A])
+ }
+ }
+ }
+ return n
+ },
+ formatDate: function(j, o, q, m) {
+ if (j == null) {
+ return ""
+ }
+ var p;
+ if (m == "standard") {
+ p = {
+ t: j.getTime(),
+ yy: j.getUTCFullYear().toString().substring(2),
+ yyyy: j.getUTCFullYear(),
+ m: j.getUTCMonth() + 1,
+ M: a[q].monthsShort[j.getUTCMonth()],
+ MM: a[q].months[j.getUTCMonth()],
+ d: j.getUTCDate(),
+ D: a[q].daysShort[j.getUTCDay()],
+ DD: a[q].days[j.getUTCDay()],
+ p: ((a[q].meridiem && a[q].meridiem.length == 2) ? a[q].meridiem[j.getUTCHours() < 12 ? 0 : 1] : ""),
+ h: j.getUTCHours(),
+ i: j.getUTCMinutes(),
+ s: j.getUTCSeconds()
+ };
+ if (a[q].meridiem && a[q].meridiem.length == 2) {
+ p.H = (p.h % 12 == 0 ? 12 : p.h % 12)
+ } else {
+ p.H = p.h
+ }
+ p.HH = (p.H < 10 ? "0" : "") + p.H;
+ p.P = p.p.toUpperCase();
+ p.hh = (p.h < 10 ? "0" : "") + p.h;
+ p.ii = (p.i < 10 ? "0" : "") + p.i;
+ p.ss = (p.s < 10 ? "0" : "") + p.s;
+ p.dd = (p.d < 10 ? "0" : "") + p.d;
+ p.mm = (p.m < 10 ? "0" : "") + p.m
+ } else {
+ if (m == "php") {
+ p = {
+ y: j.getUTCFullYear().toString().substring(2),
+ Y: j.getUTCFullYear(),
+ F: a[q].months[j.getUTCMonth()],
+ M: a[q].monthsShort[j.getUTCMonth()],
+ n: j.getUTCMonth() + 1,
+ t: g.getDaysInMonth(j.getUTCFullYear(), j.getUTCMonth()),
+ j: j.getUTCDate(),
+ l: a[q].days[j.getUTCDay()],
+ D: a[q].daysShort[j.getUTCDay()],
+ w: j.getUTCDay(),
+ N: (j.getUTCDay() == 0 ? 7 : j.getUTCDay()),
+ S: (j.getUTCDate() % 10 <= a[q].suffix.length ? a[q].suffix[j.getUTCDate() % 10 - 1] : ""),
+ a: (a[q].meridiem.length == 2 ? a[q].meridiem[j.getUTCHours() < 12 ? 0 : 1] : ""),
+ g: (j.getUTCHours() % 12 == 0 ? 12 : j.getUTCHours() % 12),
+ G: j.getUTCHours(),
+ i: j.getUTCMinutes(),
+ s: j.getUTCSeconds()
+ };
+ p.m = (p.n < 10 ? "0" : "") + p.n;
+ p.d = (p.j < 10 ? "0" : "") + p.j;
+ p.A = p.a.toString().toUpperCase();
+ p.h = (p.g < 10 ? "0" : "") + p.g;
+ p.H = (p.G < 10 ? "0" : "") + p.G;
+ p.i = (p.i < 10 ? "0" : "") + p.i;
+ p.s = (p.s < 10 ? "0" : "") + p.s
+ } else {
+ throw new Error("Invalid format type.")
+ }
+ }
+ j = [];
+ var n = f.extend([], o.separators);
+ for (var l = 0, k = o.parts.length; l < k; l++) {
+ if (n.length) {
+ j.push(n.shift())
+ }
+ j.push(p[o.parts[l]])
+ }
+ if (n.length) {
+ j.push(n.shift())
+ }
+ return j.join("")
+ },
+ convertViewMode: function(j) {
+ switch (j) {
+ case 4:
+ case "decade":
+ j = 4;
+ break;
+ case 3:
+ case "year":
+ j = 3;
+ break;
+ case 2:
+ case "month":
+ j = 2;
+ break;
+ case 1:
+ case "day":
+ j = 1;
+ break;
+ case 0:
+ case "hour":
+ j = 0;
+ break
+ }
+ return j
+ },
+ headTemplate: ' ',
+ headTemplateV3: ' ',
+ contTemplate: ' ',
+ footTemplate: ' '
+ };
+ g.template = '' + g.headTemplate + g.contTemplate + g.footTemplate + '
' + g.headTemplate + g.contTemplate + g.footTemplate + '
' + g.headTemplate + " " + g.footTemplate + '
' + g.headTemplate + g.contTemplate + g.footTemplate + '
' + g.headTemplate + g.contTemplate + g.footTemplate + "
";
+ g.templateV3 = '' + g.headTemplateV3 + g.contTemplate + g.footTemplate + '
' + g.headTemplateV3 + g.contTemplate + g.footTemplate + '
' + g.headTemplateV3 + " " + g.footTemplate + '
' + g.headTemplateV3 + g.contTemplate + g.footTemplate + '
' + g.headTemplateV3 + g.contTemplate + g.footTemplate + "
";
+ f.fn.datetimepicker.DPGlobal = g;
+ f.fn.datetimepicker.noConflict = function() {
+ f.fn.datetimepicker = b;
+ return this
+ }
+ ;
+ f(document).on("focus.datetimepicker.data-api click.datetimepicker.data-api", '[data-provide="datetimepicker"]', function(k) {
+ var j = f(this);
+ if (j.data("datetimepicker")) {
+ return
+ }
+ k.preventDefault();
+ j.datetimepicker("show")
+ });
+ f(function() {
+ f('[data-provide="datetimepicker-inline"]').datetimepicker()
+ })
+}));
diff --git a/src/assets/plugins/bootstrap-datetimepicker/js/locales/bootstrap-datetimepicker.zh-CN.js b/src/assets/plugins/bootstrap-datetimepicker/js/locales/bootstrap-datetimepicker.zh-CN.js
new file mode 100644
index 0000000..7e6228e
--- /dev/null
+++ b/src/assets/plugins/bootstrap-datetimepicker/js/locales/bootstrap-datetimepicker.zh-CN.js
@@ -0,0 +1,14 @@
+/**
+ * Simplified Chinese translation for bootstrap-datetimepicker
+ * Yuan Cheung
+ */
+(function ($) {
+ $.fn.datetimepicker.dates['zh-CN'] = {
+ days: ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"],
+ daysShort: ["周日", "周一", "周二", "周三", "周四", "周五", "周六", "周日"],
+ daysMin: ["日", "一", "二", "三", "四", "五", "六", "日"],
+ months: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"],
+ monthsShort: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"],
+ today: "今日"
+ };
+}(jQuery));
diff --git a/src/assets/plugins/bootstrap-multiselect/css/bootstrap-multiselect.css b/src/assets/plugins/bootstrap-multiselect/css/bootstrap-multiselect.css
new file mode 100644
index 0000000..6ca65b1
--- /dev/null
+++ b/src/assets/plugins/bootstrap-multiselect/css/bootstrap-multiselect.css
@@ -0,0 +1,190 @@
+/**
+ * Bootstrap Multiselect (http://davidstutz.de/bootstrap-multiselect/)
+ *
+ * Apache License, Version 2.0:
+ * Copyright (c) 2012 - 2021 David Stutz
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a
+ * copy of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ * BSD 3-Clause License:
+ * Copyright (c) 2012 - 2021 David Stutz
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * - Neither the name of David Stutz nor the names of its contributors may be
+ * used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+span.multiselect-native-select {
+ position: relative;
+}
+
+span.multiselect-native-select select {
+ border: 0 !important;
+ clip: rect(0 0 0 0) !important;
+ height: 1px !important;
+ margin: -1px -1px -1px -3px !important;
+ overflow: hidden !important;
+ padding: 0 !important;
+ position: absolute !important;
+ width: 1px !important;
+ left: 50%;
+ top: 30px;
+}
+
+.multiselect.dropdown-toggle:after {
+ display: none;
+}
+
+.multiselect {
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+.multiselect-container {
+ position: absolute;
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+}
+
+.multiselect-container .multiselect-reset .input-group {
+ width: 93%;
+}
+
+.multiselect-container .multiselect-filter>.fa-search {
+ z-index: 1;
+ padding-left: 0.75rem;
+}
+
+.multiselect-container .multiselect-filter>input.multiselect-search {
+ border: none;
+ border-bottom: 1px solid lightgrey;
+ padding-left: 2rem;
+ margin-left: -1.625rem;
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 0;
+}
+
+.multiselect-container .multiselect-filter>input.multiselect-search:focus {
+ border-bottom-right-radius: 0.25rem;
+ border-bottom-left-radius: 0.25rem;
+}
+
+.multiselect-container .multiselect-filter>.multiselect-moz-clear-filter {
+ margin-left: -1.5rem;
+ display: none;
+}
+
+.multiselect-container .multiselect-option.multiselect-group-option-indented {
+ padding-left: 1.75rem;
+}
+
+.multiselect-container .multiselect-option,
+.multiselect-container .multiselect-group,
+.multiselect-container .multiselect-all {
+ padding: 0.25rem 0.25rem 0.25rem 0.75rem;
+}
+
+.multiselect-container .multiselect-option.dropdown-item,
+.multiselect-container .multiselect-group.dropdown-item,
+.multiselect-container .multiselect-all.dropdown-item,
+.multiselect-container .multiselect-option.dropdown-toggle,
+.multiselect-container .multiselect-group.dropdown-toggle,
+.multiselect-container .multiselect-all.dropdown-toggle {
+ cursor: pointer;
+}
+
+.multiselect-container .multiselect-option .form-check-label,
+.multiselect-container .multiselect-group .form-check-label,
+.multiselect-container .multiselect-all .form-check-label {
+ cursor: pointer;
+}
+
+.multiselect-container .multiselect-option.active:not(.multiselect-active-item-fallback),
+.multiselect-container .multiselect-group.active:not(.multiselect-active-item-fallback),
+.multiselect-container .multiselect-all.active:not(.multiselect-active-item-fallback),
+.multiselect-container .multiselect-option:not(.multiselect-active-item-fallback):active,
+.multiselect-container .multiselect-group:not(.multiselect-active-item-fallback):active,
+.multiselect-container .multiselect-all:not(.multiselect-active-item-fallback):active {
+ background-color: lightgrey;
+ color: black;
+}
+
+.multiselect-container .multiselect-option:hover,
+.multiselect-container .multiselect-group:hover,
+.multiselect-container .multiselect-all:hover,
+.multiselect-container .multiselect-option:focus,
+.multiselect-container .multiselect-group:focus,
+.multiselect-container .multiselect-all:focus {
+ background-color: darkgray !important;
+}
+
+.multiselect-container .multiselect-option .form-check,
+.multiselect-container .multiselect-group .form-check,
+.multiselect-container .multiselect-all .form-check {
+ padding: 0 5px 0 20px;
+}
+
+.multiselect-container .multiselect-option:focus,
+.multiselect-container .multiselect-group:focus,
+.multiselect-container .multiselect-all:focus {
+ outline: none;
+}
+
+.form-inline .multiselect-container span.form-check {
+ padding: 3px 20px 3px 40px;
+}
+
+.input-group.input-group-sm>.multiselect-native-select .multiselect {
+ padding: .25rem .5rem;
+ font-size: .875rem;
+ line-height: 1.5;
+ padding-right: 1.75rem;
+ height: calc(4em);
+}
+
+.input-group>.multiselect-native-select {
+ flex: 1 1 auto;
+ width: 1%;
+}
+
+.input-group>.multiselect-native-select>div.btn-group {
+ width: 100%;
+}
+
+.input-group>.multiselect-native-select:not(:first-child) .multiselect {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+}
+
+.input-group>.multiselect-native-select:not(:last-child) .multiselect {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
\ No newline at end of file
diff --git a/src/assets/plugins/bootstrap-multiselect/js/bootstrap-multiselect.js b/src/assets/plugins/bootstrap-multiselect/js/bootstrap-multiselect.js
new file mode 100644
index 0000000..5828305
--- /dev/null
+++ b/src/assets/plugins/bootstrap-multiselect/js/bootstrap-multiselect.js
@@ -0,0 +1,2017 @@
+/**
+ * Bootstrap Multiselect (http://davidstutz.de/bootstrap-multiselect/)
+ *
+ * Apache License, Version 2.0:
+ * Copyright (c) 2012 - 2021 David Stutz
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a
+ * copy of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ * BSD 3-Clause License:
+ * Copyright (c) 2012 - 2021 David Stutz
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * - Neither the name of David Stutz nor the names of its contributors may be
+ * used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+(function (root, factory) {
+ var define;
+ // check to see if 'knockout' AMD module is specified if using requirejs
+ if (typeof define === 'function' && define.amd &&
+ typeof require === 'function' && typeof require.specified === 'function' && require.specified('knockout')) {
+
+ // AMD. Register as an anonymous module.
+ define(['jquery', 'knockout'], factory);
+ } else {
+ // Browser globals
+ factory(require("jquery"), root.ko);
+ }
+})(this, function ($, ko) {
+ "use strict";// jshint ;_;
+
+ if (typeof ko !== 'undefined' && ko.bindingHandlers && !ko.bindingHandlers.multiselect) {
+ ko.bindingHandlers.multiselect = {
+ after: ['options', 'value', 'selectedOptions', 'enable', 'disable'],
+
+ init: function (element, valueAccessor, allBindings, viewModel, bindingContext) {
+ var $element = $(element);
+ var config = ko.toJS(valueAccessor());
+
+ $element.multiselect(config);
+
+ if (allBindings.has('options')) {
+ var options = allBindings.get('options');
+ if (ko.isObservable(options)) {
+ ko.computed({
+ read: function () {
+ options();
+ setTimeout(function () {
+ var ms = $element.data('multiselect');
+ if (ms)
+ ms.updateOriginalOptions();//Not sure how beneficial this is.
+ $element.multiselect('rebuild');
+ }, 1);
+ },
+ disposeWhenNodeIsRemoved: element
+ });
+ }
+ }
+
+ //value and selectedOptions are two-way, so these will be triggered even by our own actions.
+ //It needs some way to tell if they are triggered because of us or because of outside change.
+ //It doesn't loop but it's a waste of processing.
+ if (allBindings.has('value')) {
+ var value = allBindings.get('value');
+ if (ko.isObservable(value)) {
+ ko.computed({
+ read: function () {
+ value();
+ setTimeout(function () {
+ $element.multiselect('refresh');
+ }, 1);
+ },
+ disposeWhenNodeIsRemoved: element
+ }).extend({ rateLimit: 100, notifyWhenChangesStop: true });
+ }
+ }
+
+ //Switched from arrayChange subscription to general subscription using 'refresh'.
+ //Not sure performance is any better using 'select' and 'deselect'.
+ if (allBindings.has('selectedOptions')) {
+ var selectedOptions = allBindings.get('selectedOptions');
+ if (ko.isObservable(selectedOptions)) {
+ ko.computed({
+ read: function () {
+ selectedOptions();
+ setTimeout(function () {
+ $element.multiselect('refresh');
+ }, 1);
+ },
+ disposeWhenNodeIsRemoved: element
+ }).extend({ rateLimit: 100, notifyWhenChangesStop: true });
+ }
+ }
+
+ var setEnabled = function (enable) {
+ setTimeout(function () {
+ if (enable)
+ $element.multiselect('enable');
+ else
+ $element.multiselect('disable');
+ });
+ };
+
+ if (allBindings.has('enable')) {
+ var enable = allBindings.get('enable');
+ if (ko.isObservable(enable)) {
+ ko.computed({
+ read: function () {
+ setEnabled(enable());
+ },
+ disposeWhenNodeIsRemoved: element
+ }).extend({ rateLimit: 100, notifyWhenChangesStop: true });
+ } else {
+ setEnabled(enable);
+ }
+ }
+
+ if (allBindings.has('disable')) {
+ var disable = allBindings.get('disable');
+ if (ko.isObservable(disable)) {
+ ko.computed({
+ read: function () {
+ setEnabled(!disable());
+ },
+ disposeWhenNodeIsRemoved: element
+ }).extend({ rateLimit: 100, notifyWhenChangesStop: true });
+ } else {
+ setEnabled(!disable);
+ }
+ }
+
+ ko.utils.domNodeDisposal.addDisposeCallback(element, function () {
+ $element.multiselect('destroy');
+ });
+ },
+
+ update: function (element, valueAccessor, allBindings, viewModel, bindingContext) {
+ var $element = $(element);
+ var config = ko.toJS(valueAccessor());
+
+ $element.multiselect('setOptions', config);
+ $element.multiselect('rebuild');
+ }
+ };
+ }
+
+ function forEach(array, callback) {
+ for (var index = 0; index < array.length; ++index) {
+ callback(array[index], index);
+ }
+ }
+
+ /**
+ * Constructor to create a new multiselect using the given select.
+ *
+ * @param {jQuery} select
+ * @param {Object} options
+ * @returns {Multiselect}
+ */
+ function Multiselect(select, options) {
+
+ this.$select = $(select);
+ this.options = this.mergeOptions($.extend({}, options, this.$select.data()));
+
+ // Placeholder via data attributes
+ if (this.$select.attr("data-placeholder")) {
+ this.options.nonSelectedText = this.$select.data("placeholder");
+ }
+
+ // Initialization.
+ // We have to clone to create a new reference.
+ this.originalOptions = this.$select.clone()[0].options;
+ this.query = '';
+ this.searchTimeout = null;
+ this.lastToggledInput = null;
+
+ this.options.multiple = this.$select.attr('multiple') === "multiple";
+ this.options.onChange = $.proxy(this.options.onChange, this);
+ this.options.onSelectAll = $.proxy(this.options.onSelectAll, this);
+ this.options.onDeselectAll = $.proxy(this.options.onDeselectAll, this);
+ this.options.onDropdownShow = $.proxy(this.options.onDropdownShow, this);
+ this.options.onDropdownHide = $.proxy(this.options.onDropdownHide, this);
+ this.options.onDropdownShown = $.proxy(this.options.onDropdownShown, this);
+ this.options.onDropdownHidden = $.proxy(this.options.onDropdownHidden, this);
+ this.options.onInitialized = $.proxy(this.options.onInitialized, this);
+ this.options.onFiltering = $.proxy(this.options.onFiltering, this);
+
+ // Build select all if enabled.
+ this.buildContainer();
+ this.buildButton();
+ this.buildDropdown();
+ this.buildReset();
+ this.buildSelectAll();
+ this.buildDropdownOptions();
+ this.buildFilter();
+ this.buildButtons();
+
+ this.updateButtonText();
+ this.updateSelectAll(true);
+
+ if (this.options.enableClickableOptGroups && this.options.multiple) {
+ this.updateOptGroups();
+ }
+
+ this.options.wasDisabled = this.$select.prop('disabled');
+ if (this.options.disableIfEmpty && $('option', this.$select).length <= 0 && !this.options.wasDisabled) {
+ this.disable(true);
+ }
+
+ this.$select.wrap(' ').after(this.$container);
+ this.$select.prop('tabindex', '-1');
+
+ if (this.options.widthSynchronizationMode !== 'never') {
+ this.synchronizeButtonAndPopupWidth();
+ }
+
+ this.options.onInitialized(this.$select, this.$container);
+ }
+
+ Multiselect.prototype = {
+
+ defaults: {
+ /**
+ * Default text function will either print 'None selected' in case no
+ * option is selected or a list of the selected options up to a length
+ * of 3 selected options.
+ *
+ * @param {jQuery} options
+ * @param {jQuery} select
+ * @returns {String}
+ */
+ buttonText: function (selectedOptions, select) {
+ if (this.disabledText.length > 0 && select.prop('disabled')) {
+ return this.disabledText;
+ }
+ else if (selectedOptions.length === 0) {
+ return this.nonSelectedText;
+ }
+ else if (this.allSelectedText
+ && selectedOptions.length === $('option', $(select)).length
+ && $('option', $(select)).length !== 1
+ && this.multiple) {
+
+ if (this.selectAllNumber) {
+ return this.allSelectedText + ' (' + selectedOptions.length + ')';
+ }
+ else {
+ return this.allSelectedText;
+ }
+ }
+ else if (this.numberDisplayed != 0 && selectedOptions.length > this.numberDisplayed) {
+ return selectedOptions.length + ' ' + this.nSelectedText;
+ }
+ else {
+ var selected = '';
+ var delimiter = this.delimiterText;
+
+ selectedOptions.each(function () {
+ var label = ($(this).attr('label') !== undefined) ? $(this).attr('label') : $(this).text();
+ selected += label + delimiter;
+ });
+
+ return selected.substr(0, selected.length - this.delimiterText.length);
+ }
+ },
+ /**
+ * Updates the title of the button similar to the buttonText function.
+ *
+ * @param {jQuery} options
+ * @param {jQuery} select
+ * @returns {@exp;selected@call;substr}
+ */
+ buttonTitle: function (options, select) {
+ if (options.length === 0) {
+ return this.nonSelectedText;
+ }
+ else {
+ var selected = '';
+ var delimiter = this.delimiterText;
+
+ options.each(function () {
+ var label = ($(this).attr('label') !== undefined) ? $(this).attr('label') : $(this).text();
+ selected += label + delimiter;
+ });
+ return selected.substr(0, selected.length - this.delimiterText.length);
+ }
+ },
+ checkboxName: function (option) {
+ return false; // no checkbox name
+ },
+ /**
+ * Create a label.
+ *
+ * @param {jQuery} element
+ * @returns {String}
+ */
+ optionLabel: function (element) {
+ return $(element).attr('label') || $(element).text();
+ },
+ /**
+ * Create a class.
+ *
+ * @param {jQuery} element
+ * @returns {String}
+ */
+ optionClass: function (element) {
+ return $(element).attr('class') || '';
+ },
+ /**
+ * Triggered on change of the multiselect.
+ *
+ * Not triggered when selecting/deselecting options manually.
+ *
+ * @param {jQuery} option
+ * @param {Boolean} checked
+ */
+ onChange: function (option, checked) {
+
+ },
+ /**
+ * Triggered when the dropdown is shown.
+ *
+ * @param {jQuery} event
+ */
+ onDropdownShow: function (event) {
+
+ },
+ /**
+ * Triggered when the dropdown is hidden.
+ *
+ * @param {jQuery} event
+ */
+ onDropdownHide: function (event) {
+
+ },
+ /**
+ * Triggered after the dropdown is shown.
+ *
+ * @param {jQuery} event
+ */
+ onDropdownShown: function (event) {
+
+ },
+ /**
+ * Triggered after the dropdown is hidden.
+ *
+ * @param {jQuery} event
+ */
+ onDropdownHidden: function (event) {
+
+ },
+ /**
+ * Triggered on select all.
+ */
+ onSelectAll: function () {
+
+ },
+ /**
+ * Triggered on deselect all.
+ */
+ onDeselectAll: function () {
+
+ },
+ /**
+ * Triggered after initializing.
+ *
+ * @param {jQuery} $select
+ * @param {jQuery} $container
+ */
+ onInitialized: function ($select, $container) {
+
+ },
+ /**
+ * Triggered on filtering.
+ *
+ * @param {jQuery} $filter
+ */
+ onFiltering: function ($filter) {
+
+ },
+ enableHTML: false,
+ buttonClass: 'custom-select',
+ inheritClass: false,
+ buttonWidth: 'auto',
+ buttonContainer: '
',
+ dropRight: false,
+ dropUp: false,
+ selectedClass: 'active',
+ // Maximum height of the dropdown menu.
+ // If maximum height is exceeded a scrollbar will be displayed.
+ maxHeight: false,
+ includeSelectAllOption: false,
+ includeSelectAllIfMoreThan: 0,
+ selectAllText: ' Select all',
+ selectAllValue: 'multiselect-all',
+ selectAllName: false,
+ selectAllNumber: true,
+ selectAllJustVisible: true,
+ enableFiltering: false,
+ enableCaseInsensitiveFiltering: false,
+ enableFullValueFiltering: false,
+ enableClickableOptGroups: false,
+ enableCollapsibleOptGroups: false,
+ collapseOptGroupsByDefault: false,
+ filterPlaceholder: 'Search',
+ // possible options: 'text', 'value', 'both'
+ filterBehavior: 'text',
+ includeFilterClearBtn: true,
+ preventInputChangeEvent: false,
+ nonSelectedText: 'None selected',
+ nSelectedText: 'selected',
+ allSelectedText: 'All selected',
+ resetButtonText: 'Reset',
+ numberDisplayed: 3,
+ disableIfEmpty: false,
+ disabledText: '',
+ delimiterText: ', ',
+ includeResetOption: false,
+ includeResetDivider: false,
+ resetText: 'Reset',
+ indentGroupOptions: true,
+ // possible options: 'never', 'always', 'ifPopupIsSmaller', 'ifPopupIsWider'
+ widthSynchronizationMode: 'never',
+ buttonTextAlignment: 'center',
+ enableResetButton: false,
+ templates: {
+ button: ' ',
+ popupContainer: '',
+ filter: '
',
+ buttonGroup: '
',
+ buttonGroupReset: ' ',
+ option: ' ',
+ divider: '
',
+ optionGroup: ' ',
+ resetButton: '
'
+ }
+ },
+
+ constructor: Multiselect,
+
+ /**
+ * Builds the container of the multiselect.
+ */
+ buildContainer: function () {
+ this.$container = $(this.options.buttonContainer);
+ if (this.options.widthSynchronizationMode !== 'never') {
+ this.$container.on('show.bs.dropdown', $.proxy(function () {
+ // the width needs to be synchronized again in case the width of the button changed in between
+ this.synchronizeButtonAndPopupWidth();
+ this.options.onDropdownShow();
+ }, this));
+ }
+ else {
+ this.$container.on('show.bs.dropdown', this.options.onDropdownShow);
+ }
+ this.$container.on('hide.bs.dropdown', this.options.onDropdownHide);
+ this.$container.on('shown.bs.dropdown', this.options.onDropdownShown);
+ this.$container.on('hidden.bs.dropdown', this.options.onDropdownHidden);
+ },
+
+ /**
+ * Builds the button of the multiselect.
+ */
+ buildButton: function () {
+ this.$button = $(this.options.templates.button).addClass(this.options.buttonClass);
+ if (this.$select.attr('class') && this.options.inheritClass) {
+ this.$button.addClass(this.$select.attr('class'));
+ }
+ // Adopt active state.
+ if (this.$select.prop('disabled')) {
+ this.disable();
+ }
+ else {
+ this.enable();
+ }
+
+ // Manually add button width if set.
+ if (this.options.buttonWidth && this.options.buttonWidth !== 'auto') {
+ this.$button.css({
+ 'width': '100%' //this.options.buttonWidth,
+ });
+ this.$container.css({
+ 'width': this.options.buttonWidth
+ });
+ }
+
+ if (this.options.buttonTextAlignment) {
+ switch (this.options.buttonTextAlignment) {
+ case 'left':
+ this.$button.addClass('text-left');
+ break;
+ case 'center':
+ this.$button.addClass('text-center');
+ break;
+ case 'right':
+ this.$button.addClass('text-right');
+ break;
+ }
+ }
+
+ // Keep the tab index from the select.
+ var tabindex = this.$select.attr('tabindex');
+ if (tabindex) {
+ this.$button.attr('tabindex', tabindex);
+ }
+
+ this.$container.prepend(this.$button);
+ },
+
+ /**
+ * Builds the popup container representing the dropdown menu.
+ */
+ buildDropdown: function () {
+
+ // Build popup container.
+ this.$popupContainer = $(this.options.templates.popupContainer);
+
+ if (this.options.dropRight) {
+ this.$container.addClass('dropright');
+ }
+ else if (this.options.dropUp) {
+ this.$container.addClass("dropup");
+ }
+
+ // Set max height of dropdown menu to activate auto scrollbar.
+ if (this.options.maxHeight) {
+ // TODO: Add a class for this option to move the css declarations.
+ this.$popupContainer.css({
+ 'max-height': this.options.maxHeight + 'px',
+ 'overflow-y': 'auto',
+ 'overflow-x': 'hidden'
+ });
+ }
+
+ if (this.options.widthSynchronizationMode !== 'never') {
+ this.$popupContainer.css('overflow-x', 'hidden');
+ }
+
+ this.$popupContainer.on("touchstart click", function (e) {
+ e.stopPropagation();
+ });
+
+ this.$container.append(this.$popupContainer);
+ },
+
+ synchronizeButtonAndPopupWidth: function () {
+ if (!this.$popupContainer || this.options.widthSynchronizationMode === 'never') {
+ return;
+ }
+
+ var buttonWidth = this.$button.outerWidth();
+ switch (this.options.widthSynchronizationMode) {
+ case 'always':
+ this.$popupContainer.css('min-width', buttonWidth);
+ this.$popupContainer.css('max-width', buttonWidth);
+ break;
+ case 'ifPopupIsSmaller':
+ this.$popupContainer.css('min-width', buttonWidth);
+ break;
+ case 'ifPopupIsWider':
+ this.$popupContainer.css('max-width', buttonWidth);
+ break;
+ }
+ },
+
+ /**
+ * Build the dropdown options and binds all necessary events.
+ *
+ * Uses createDivider and createOptionValue to create the necessary options.
+ */
+ buildDropdownOptions: function () {
+
+ this.$select.children().each($.proxy(function (index, element) {
+
+ var $element = $(element);
+ // Support optgroups and options without a group simultaneously.
+ var tag = $element.prop('tagName')
+ .toLowerCase();
+
+ if ($element.prop('value') === this.options.selectAllValue) {
+ return;
+ }
+
+ if (tag === 'optgroup') {
+ this.createOptgroup(element);
+ }
+ else if (tag === 'option') {
+
+ if ($element.data('role') === 'divider') {
+ this.createDivider();
+ }
+ else {
+ this.createOptionValue(element, false);
+ }
+
+ }
+
+ // Other illegal tags will be ignored.
+ }, this));
+
+ // Bind the change event on the dropdown elements.
+ $(this.$popupContainer).off('change', '> *:not(.multiselect-group) input[type="checkbox"], > *:not(.multiselect-group) input[type="radio"]');
+ $(this.$popupContainer).on('change', '> *:not(.multiselect-group) input[type="checkbox"], > *:not(.multiselect-group) input[type="radio"]', $.proxy(function (event) {
+ var $target = $(event.target);
+
+ var checked = $target.prop('checked') || false;
+ var isSelectAllOption = $target.val() === this.options.selectAllValue;
+
+ // Apply or unapply the configured selected class.
+ if (this.options.selectedClass) {
+ if (checked) {
+ $target.closest('.multiselect-option')
+ .addClass(this.options.selectedClass);
+ }
+ else {
+ $target.closest('.multiselect-option')
+ .removeClass(this.options.selectedClass);
+ }
+ }
+
+ // Get the corresponding option.
+ var value = $target.val();
+ var $option = this.getOptionByValue(value);
+
+ var $optionsNotThis = $('option', this.$select).not($option);
+ var $checkboxesNotThis = $('input', this.$container).not($target);
+
+ if (isSelectAllOption) {
+
+ if (checked) {
+ this.selectAll(this.options.selectAllJustVisible, true);
+ }
+ else {
+ this.deselectAll(this.options.selectAllJustVisible, true);
+ }
+ }
+ else {
+ if (checked) {
+ $option.prop('selected', true);
+
+ if (this.options.multiple) {
+ // Simply select additional option.
+ $option.prop('selected', true);
+ }
+ else {
+ // Unselect all other options and corresponding checkboxes.
+ if (this.options.selectedClass) {
+ $($checkboxesNotThis).closest('.dropdown-item').removeClass(this.options.selectedClass);
+ }
+
+ $($checkboxesNotThis).prop('checked', false);
+ $optionsNotThis.prop('selected', false);
+
+ // It's a single selection, so close.
+ this.$button.click();
+ }
+
+ if (this.options.selectedClass === "active") {
+ $optionsNotThis.closest(".dropdown-item").css("outline", "");
+ }
+ }
+ else {
+ // Unselect option.
+ $option.prop('selected', false);
+ }
+
+ // To prevent select all from firing onChange: #575
+ this.options.onChange($option, checked);
+
+ // Do not update select all or optgroups on select all change!
+ this.updateSelectAll();
+
+ if (this.options.enableClickableOptGroups && this.options.multiple) {
+ this.updateOptGroups();
+ }
+ }
+
+ this.$select.change();
+ this.updateButtonText();
+
+ if (this.options.preventInputChangeEvent) {
+ return false;
+ }
+ }, this));
+
+ $('.multiselect-option', this.$popupContainer).off('mousedown');
+ $('.multiselect-option', this.$popupContainer).on('mousedown', function (e) {
+ if (e.shiftKey) {
+ // Prevent selecting text by Shift+click
+ return false;
+ }
+ });
+
+ $(this.$popupContainer).off('touchstart click', '.multiselect-option, .multiselect-all, .multiselect-group');
+ $(this.$popupContainer).on('touchstart click', '.multiselect-option, .multiselect-all, .multiselect-group', $.proxy(function (event) {
+ event.stopPropagation();
+
+ var $target = $(event.target);
+
+ if (event.shiftKey && this.options.multiple) {
+ if (!$target.is("input")) { // Handles checkbox selection manually (see https://github.com/davidstutz/bootstrap-multiselect/issues/431)
+ event.preventDefault();
+ $target = $target.closest(".multiselect-option").find("input");
+ $target.prop("checked", !$target.prop("checked"));
+ }
+ var checked = $target.prop('checked') || false;
+
+ if (this.lastToggledInput !== null && this.lastToggledInput !== $target) { // Make sure we actually have a range
+ var from = this.$popupContainer.find(".multiselect-option:visible").index($target.closest(".multiselect-option"));
+ var to = this.$popupContainer.find(".multiselect-option:visible").index(this.lastToggledInput.closest(".multiselect-option"));
+
+ if (from > to) { // Swap the indices
+ var tmp = to;
+ to = from;
+ from = tmp;
+ }
+
+ // Make sure we grab all elements since slice excludes the last index
+ ++to;
+
+ // Change the checkboxes and underlying options
+ var range = this.$popupContainer.find(".multiselect-option:not(.multiselect-filter-hidden)").slice(from, to).find("input");
+
+ range.prop('checked', checked);
+
+ if (this.options.selectedClass) {
+ range.closest('.multiselect-option')
+ .toggleClass(this.options.selectedClass, checked);
+ }
+
+ for (var i = 0, j = range.length; i < j; i++) {
+ let $checkbox = $(range[i]);
+
+ var $option = this.getOptionByValue($checkbox.val());
+
+ $option.prop('selected', checked);
+ }
+ }
+
+ // Trigger the select "change" event
+ $target.trigger("change");
+ }
+ else if (!$target.is('input')) {
+ var $checkbox = $target.closest('.multiselect-option, .multiselect-all').find('.form-check-input');
+ if ($checkbox.length > 0) {
+ if (this.options.multiple || !$checkbox.prop('checked')) {
+ $checkbox.prop('checked', !$checkbox.prop('checked'));
+ $checkbox.change();
+ }
+ }
+ else if (this.options.enableClickableOptGroups && this.options.multiple && !$target.hasClass("caret-container")) {
+ var groupItem = $target;
+ if (!groupItem.hasClass("multiselect-group")) {
+ groupItem = $target.closest('.multiselect-group');
+ }
+ $checkbox = groupItem.find(".form-check-input");
+ if ($checkbox.length > 0) {
+ $checkbox.prop('checked', !$checkbox.prop('checked'));
+ $checkbox.change();
+ }
+ }
+
+ event.preventDefault();
+ }
+
+ // Remembers last clicked option
+ var $input = $target.closest(".multiselect-option").find("input[type='checkbox'], input[type='radio']");
+ if ($input.length > 0) {
+ this.lastToggledInput = $target;
+ }
+ else {
+ this.lastToggledInput = null;
+ }
+
+ $target.blur();
+ }, this));
+
+ //Keyboard support.
+ this.$container.off('keydown.multiselect').on('keydown.multiselect', $.proxy(function (event) {
+ var $items = $(this.$container).find(".multiselect-option:not(.disabled), .multiselect-group:not(.disabled), .multiselect-all").filter(":visible");
+ var index = $items.index($items.filter(':focus'));
+ var $search = $('.multiselect-search', this.$container);
+
+ // keyCode 9 == Tab
+ if (event.keyCode === 9 && this.$container.hasClass('show')) {
+ this.$button.click();
+ }
+ // keyCode 13 = Enter
+ else if (event.keyCode == 13) {
+ var $current = $items.eq(index);
+ setTimeout(function () {
+ $current.focus();
+ }, 1);
+ }
+ // keyCode 38 = Arrow Up
+ else if (event.keyCode == 38) {
+ if (index == 0 && !$search.is(':focus')) {
+ setTimeout(function () {
+ $search.focus();
+ }, 1);
+ }
+ }
+ // keyCode 40 = Arrow Down
+ else if (event.keyCode == 40) {
+ if ($search.is(':focus')) {
+ var $first = $items.eq(0);
+ setTimeout(function () {
+ $search.blur();
+ $first.focus();
+ }, 1);
+ }
+ else if (index == -1) {
+ setTimeout(function () {
+ $search.focus();
+ }, 1);
+ }
+ }
+ }, this));
+
+ if (this.options.enableClickableOptGroups && this.options.multiple) {
+ $(".multiselect-group input", this.$popupContainer).off("change");
+ $(".multiselect-group input", this.$popupContainer).on("change", $.proxy(function (event) {
+ event.stopPropagation();
+
+ var $target = $(event.target);
+ var checked = $target.prop('checked') || false;
+
+ var $item = $(event.target).closest('.dropdown-item');
+ var $group = $item.nextUntil(".multiselect-group")
+ .not('.multiselect-filter-hidden')
+ .not('.disabled');
+
+ var $inputs = $group.find("input");
+
+ var $options = [];
+
+ if (this.options.selectedClass) {
+ if (checked) {
+ $item.addClass(this.options.selectedClass);
+ }
+ else {
+ $item.removeClass(this.options.selectedClass);
+ }
+ }
+
+ $.each($inputs, $.proxy(function (index, input) {
+ var $input = $(input);
+ var value = $input.val();
+ var $option = this.getOptionByValue(value);
+
+ if (checked) {
+ $input.prop('checked', true);
+ $input.closest('.dropdown-item')
+ .addClass(this.options.selectedClass);
+
+ $option.prop('selected', true);
+ }
+ else {
+ $input.prop('checked', false);
+ $input.closest('.dropdown-item')
+ .removeClass(this.options.selectedClass);
+
+ $option.prop('selected', false);
+ }
+
+ $options.push(this.getOptionByValue(value));
+ }, this))
+
+ // Cannot use select or deselect here because it would call updateOptGroups again.
+
+ this.options.onChange($options, checked);
+
+ this.$select.change();
+ this.updateButtonText();
+ this.updateSelectAll();
+ }, this));
+ }
+
+ if (this.options.enableCollapsibleOptGroups && this.options.multiple) {
+ $(".multiselect-group .caret-container", this.$popupContainer).off("click");
+ $(".multiselect-group .caret-container", this.$popupContainer).on("click", $.proxy(function (event) {
+ var $group = $(event.target).closest('.multiselect-group');
+ var $inputs = $group.nextUntil(".multiselect-group")
+ .not('.multiselect-filter-hidden');
+
+ var visible = true;
+ $inputs.each(function () {
+ visible = visible && !$(this).hasClass('multiselect-collapsible-hidden');
+ });
+
+ if (visible) {
+ $inputs.hide()
+ .addClass('multiselect-collapsible-hidden');
+ }
+ else {
+ $inputs.show()
+ .removeClass('multiselect-collapsible-hidden');
+ }
+ }, this));
+ }
+ },
+
+ /**
+ * Create a checkbox container with input and label based on given values
+ * @param {JQuery} $item
+ * @param {String} label
+ * @param {String} name
+ * @param {String} value
+ * @param {String} inputType
+ * @returns {JQuery}
+ */
+ createCheckbox: function ($item, labelContent, name, value, title, inputType) {
+ var $wrapper = $(' ');
+ $wrapper.addClass("form-check");
+ var $checkboxLabel;
+ if (this.options.enableHTML && $(labelContent).length > 0) {
+ $checkboxLabel = $(' ');
+ $checkboxLabel.html(labelContent);
+ $wrapper.append($checkboxLabel);
+ }
+ else {
+ $checkboxLabel = $(' ');
+ $checkboxLabel.text(labelContent);
+ $wrapper.append($checkboxLabel);
+ }
+
+ var $checkbox = $(' ').attr('type', inputType);
+ $checkbox.val(value);
+ $wrapper.prepend($checkbox);
+
+ if (name) {
+ $checkbox.attr('name', name);
+ }
+
+ $item.prepend($wrapper);
+ $item.attr("title", title || labelContent);
+
+ return $checkbox;
+ },
+
+ /**
+ * Create an option using the given select option.
+ *
+ * @param {jQuery} element
+ */
+ createOptionValue: function (element, isGroupOption) {
+ var $element = $(element);
+ if ($element.is(':selected')) {
+ $element.prop('selected', true);
+ }
+
+ // Support the label attribute on options.
+ var label = this.options.optionLabel(element);
+ var classes = this.options.optionClass(element);
+ var value = $element.val();
+ var inputType = this.options.multiple ? "checkbox" : "radio";
+ var title = $element.attr('title');
+
+ var $option = $(this.options.templates.option);
+ $option.addClass(classes);
+
+ if (isGroupOption && this.options.indentGroupOptions) {
+ $option.addClass("multiselect-group-option-indented")
+ }
+
+ // Hide all children items when collapseOptGroupsByDefault is true
+ if (this.options.collapseOptGroupsByDefault && $(element).parent().prop("tagName").toLowerCase() === "optgroup") {
+ $option.addClass("multiselect-collapsible-hidden");
+ $option.hide();
+ }
+
+ var name = this.options.checkboxName($element);
+ var $checkbox = this.createCheckbox($option, label, name, value, title, inputType);
+
+ var selected = $element.prop('selected') || false;
+
+ if (value === this.options.selectAllValue) {
+ $option.addClass("multiselect-all");
+ $option.removeClass("multiselect-option");
+ $checkbox.parent().parent()
+ .addClass('multiselect-all');
+ }
+
+ this.$popupContainer.append($option);
+
+ if ($element.is(':disabled')) {
+ $checkbox.attr('disabled', 'disabled')
+ .prop('disabled', true)
+ .closest('.dropdown-item')
+ .addClass('disabled');
+ }
+
+ $checkbox.prop('checked', selected);
+
+ if (selected && this.options.selectedClass) {
+ $checkbox.closest('.dropdown-item')
+ .addClass(this.options.selectedClass);
+ }
+ },
+
+ /**
+ * Creates a divider using the given select option.
+ *
+ * @param {jQuery} element
+ */
+ createDivider: function (element) {
+ var $divider = $(this.options.templates.divider);
+ this.$popupContainer.append($divider);
+ },
+
+ /**
+ * Creates an optgroup.
+ *
+ * @param {jQuery} group
+ */
+ createOptgroup: function (group) {
+ var $group = $(group);
+ var label = $group.attr("label");
+ var value = $group.attr("value");
+ var title = $group.attr('title');
+
+ var $groupOption = $(" ");
+
+ if (this.options.enableClickableOptGroups && this.options.multiple) {
+ $groupOption = $(this.options.templates.optionGroup);
+ var $checkbox = this.createCheckbox($groupOption, label, null, value, title, "checkbox");
+ }
+ else {
+ if (this.options.enableHTML) {
+ $groupOption.html(" " + label);
+ }
+ else {
+ $groupOption.text(" " + label);
+ }
+ }
+
+ var classes = this.options.optionClass(group);
+ $groupOption.addClass(classes);
+
+ if (this.options.enableCollapsibleOptGroups && this.options.multiple) {
+ $groupOption.find('.form-check').addClass('d-inline-block');
+ $groupOption.append(' ');
+ }
+
+ if ($group.is(':disabled')) {
+ $groupOption.addClass('disabled');
+ }
+
+ this.$popupContainer.append($groupOption);
+
+ $("option", group).each($.proxy(function ($, group) {
+ this.createOptionValue(group, true);
+ }, this));
+ },
+
+ /**
+ * Build the reset.
+ *
+ */
+ buildReset: function () {
+ if (this.options.includeResetOption) {
+
+ // Check whether to add a divider after the reset.
+ if (this.options.includeResetDivider) {
+ var divider = $(this.options.templates.divider);
+ divider.addClass("mt-0");
+ this.$popupContainer.prepend(divider);
+ }
+
+ var $resetButton = $(this.options.templates.resetButton);
+
+ if (this.options.enableHTML) {
+ $('button', $resetButton).html(this.options.resetText);
+ }
+ else {
+ $('button', $resetButton).text(this.options.resetText);
+ }
+
+ $('button', $resetButton).click($.proxy(function () {
+ this.clearSelection();
+ }, this));
+
+ this.$popupContainer.prepend($resetButton);
+ }
+ },
+
+ /**
+ * Build the select all.
+ *
+ * Checks if a select all has already been created.
+ */
+ buildSelectAll: function () {
+ if (typeof this.options.selectAllValue === 'number') {
+ this.options.selectAllValue = this.options.selectAllValue.toString();
+ }
+
+ var alreadyHasSelectAll = this.hasSelectAll();
+
+ if (!alreadyHasSelectAll && this.options.includeSelectAllOption && this.options.multiple
+ && $('option', this.$select).length > this.options.includeSelectAllIfMoreThan) {
+
+ // Check whether to add a divider after the select all.
+ if (this.options.includeSelectAllDivider) {
+ this.$popupContainer.prepend($(this.options.templates.divider));
+ }
+
+ var $option = $(this.options.templates.li || this.options.templates.option);
+ var $checkbox = this.createCheckbox($option, this.options.selectAllText, this.options.selectAllName, this.options.selectAllValue, this.options.selectAllText, "checkbox");
+
+ $option.addClass("multiselect-all");
+ $option.removeClass("multiselect-option");
+ $option.find(".form-check-label").addClass("font-weight-bold");
+
+ this.$popupContainer.prepend($option);
+
+ $checkbox.prop('checked', false);
+ }
+ },
+
+ /**
+ * Builds the filter.
+ */
+ buildFilter: function () {
+
+ // Build filter if filtering OR case insensitive filtering is enabled and the number of options exceeds (or equals) enableFilterLength.
+ if (this.options.enableFiltering || this.options.enableCaseInsensitiveFiltering) {
+ var enableFilterLength = Math.max(this.options.enableFiltering, this.options.enableCaseInsensitiveFiltering);
+
+ if (this.$select.find('option').length >= enableFilterLength) {
+
+ this.$filter = $(this.options.templates.filter);
+ $('input', this.$filter).attr('placeholder', this.options.filterPlaceholder);
+
+ // Handles optional filter clear button
+ if (!this.options.includeFilterClearBtn) {
+ this.$filter.find(".multiselect-search").attr("type", "text");
+
+ // Remove clear button if the old design of the filter with input groups and separated clear button is used
+ this.$filter.find(".multiselect-clear-filter").remove();
+ }
+ else {
+ // Firefox does not support a clear button in search inputs right now therefore it must be added manually
+ if (this.isFirefox() && this.$filter.find(".multiselect-clear-filter").length === 0) {
+ this.$filter.append(" ");
+ }
+
+ this.$filter.find(".multiselect-clear-filter").on('click', $.proxy(function (event) {
+ clearTimeout(this.searchTimeout);
+
+ this.query = '';
+ this.$filter.find('.multiselect-search').val('');
+ $('.dropdown-item', this.$popupContainer).show().removeClass('multiselect-filter-hidden');
+
+ this.updateSelectAll();
+
+ if (this.options.enableClickableOptGroups && this.options.multiple) {
+ this.updateOptGroups();
+ }
+
+ }, this));
+ }
+
+ this.$popupContainer.prepend(this.$filter);
+
+ this.$filter.val(this.query).on('click', function (event) {
+ event.stopPropagation();
+ }).on('input keydown', $.proxy(function (event) {
+ // Cancel enter key default behaviour
+ if (event.which === 13) {
+ event.preventDefault();
+ }
+
+ if (this.isFirefox() && this.options.includeFilterClearBtn) {
+ if (event.target.value) {
+ this.$filter.find(".multiselect-moz-clear-filter").show();
+ }
+ else {
+ this.$filter.find(".multiselect-moz-clear-filter").hide();
+ }
+ }
+
+ // This is useful to catch "keydown" events after the browser has updated the control.
+ clearTimeout(this.searchTimeout);
+
+ this.searchTimeout = this.asyncFunction($.proxy(function () {
+
+ if (this.query !== event.target.value) {
+ this.query = event.target.value;
+
+ var currentGroup, currentGroupVisible;
+ $.each($('.multiselect-option, .multiselect-group', this.$popupContainer), $.proxy(function (index, element) {
+ var value = $('input', element).length > 0 ? $('input', element).val() : "";
+ var text = $('.form-check-label', element).text();
+
+ var filterCandidate = '';
+ if ((this.options.filterBehavior === 'text')) {
+ filterCandidate = text;
+ }
+ else if ((this.options.filterBehavior === 'value')) {
+ filterCandidate = value;
+ }
+ else if (this.options.filterBehavior === 'both') {
+ filterCandidate = text + '\n' + value;
+ }
+
+ if (value !== this.options.selectAllValue && text) {
+
+ // By default lets assume that element is not
+ // interesting for this search.
+ var showElement = false;
+
+ if (this.options.enableCaseInsensitiveFiltering) {
+ filterCandidate = filterCandidate.toLowerCase();
+ this.query = this.query.toLowerCase();
+ }
+
+ if (this.options.enableFullValueFiltering && this.options.filterBehavior !== 'both') {
+ var valueToMatch = filterCandidate.trim().substring(0, this.query.length);
+ if (this.query.indexOf(valueToMatch) > -1) {
+ showElement = true;
+ }
+ }
+ else if (filterCandidate.indexOf(this.query) > -1) {
+ showElement = true;
+ }
+
+ // Toggle current element (group or group item) according to showElement boolean.
+ if (!showElement) {
+ $(element).css('display', 'none');
+ $(element).addClass('multiselect-filter-hidden');
+ }
+ if (showElement) {
+ $(element).css('display', 'block');
+ $(element).removeClass('multiselect-filter-hidden');
+ }
+
+ // Differentiate groups and group items.
+ if ($(element).hasClass('multiselect-group')) {
+ // Remember group status.
+ currentGroup = element;
+ currentGroupVisible = showElement;
+ }
+ else {
+ // Show group name when at least one of its items is visible.
+ if (showElement) {
+ $(currentGroup).show()
+ .removeClass('multiselect-filter-hidden');
+ }
+
+ // Show all group items when group name satisfies filter.
+ if (!showElement && currentGroupVisible) {
+ $(element).show()
+ .removeClass('multiselect-filter-hidden');
+ }
+ }
+ }
+ }, this));
+ }
+
+ this.updateSelectAll();
+
+ if (this.options.enableClickableOptGroups && this.options.multiple) {
+ this.updateOptGroups();
+ }
+
+ this.updatePopupPosition();
+
+ this.options.onFiltering(event.target);
+
+ }, this), 300, this);
+ }, this));
+ }
+ }
+ },
+
+ /**
+ * Builds the filter.
+ */
+ buildButtons: function () {
+ if (this.options.enableResetButton) {
+ var $buttonGroup = $(this.options.templates.buttonGroup);
+ this.$buttonGroupReset = $(this.options.templates.buttonGroupReset).text(this.options.resetButtonText);
+ $buttonGroup.append(this.$buttonGroupReset);
+ this.$popupContainer.prepend($buttonGroup);
+
+ // We save all options that were previously selected.
+ this.defaultSelection = {};
+ $('option', this.$select).each($.proxy(function (index, element) {
+ var $option = $(element);
+ this.defaultSelection[$option.val()] = $option.prop('selected');
+ }, this));
+
+ this.$buttonGroupReset.on('click', $.proxy(function (event) {
+ $('option', this.$select).each($.proxy(function (index, element) {
+ var $option = $(element);
+ $option.prop('selected', this.defaultSelection[$option.val()]);
+ }, this));
+ this.refresh();
+
+ if (this.options.enableFiltering) {
+ this.$filter.trigger('keydown');
+ $('input', this.$filter).val('');
+ }
+ }, this));
+ }
+ },
+
+ updatePopupPosition: function () {
+ // prevent gaps between popup and select when filter is used (#1199)
+ var transformMatrix = this.$popupContainer.css("transform");
+ var matrixType = transformMatrix.substring(0, transformMatrix.indexOf('('));
+ var values = transformMatrix.substring(transformMatrix.indexOf('(') + 1, transformMatrix.length - 1);
+ var valuesArray = values.split(',');
+
+ var valueIndex = 5;
+ if (matrixType === "matrix3d") {
+ valueIndex = 13;
+ }
+
+ var yTransformation = valuesArray[valueIndex];
+ // Need to check to avoid errors when testing and in some other situations.
+ yTransformation = typeof yTransformation === 'undefined' ? 0 : yTransformation.trim();
+ if (yTransformation < 0) {
+ yTransformation = this.$popupContainer.css("height").replace('px', '') * -1;
+ valuesArray[valueIndex] = yTransformation;
+ transformMatrix = matrixType + '(' + valuesArray.join(',') + ')';
+ this.$popupContainer.css("transform", transformMatrix);
+ }
+ },
+
+ /**
+ * Unbinds the whole plugin.
+ */
+ destroy: function () {
+ this.$container.remove();
+ this.$select.unwrap();
+ this.$select.show();
+
+ // reset original state
+ this.$select.prop('disabled', this.options.wasDisabled);
+
+ this.$select.data('multiselect', null);
+ },
+
+ /**
+ * Refreshs the multiselect based on the selected options of the select.
+ */
+ refresh: function () {
+ var inputs = {};
+ $('.multiselect-option input', this.$popupContainer).each(function () {
+ inputs[$(this).val()] = $(this);
+ });
+
+ $('option', this.$select).each($.proxy(function (index, element) {
+ var $elem = $(element);
+ var $input = inputs[$(element).val()];
+
+ if ($elem.is(':selected')) {
+ $input.prop('checked', true);
+
+ if (this.options.selectedClass) {
+ $input.closest('.multiselect-option')
+ .addClass(this.options.selectedClass);
+ }
+ }
+ else {
+ $input.prop('checked', false);
+
+ if (this.options.selectedClass) {
+ $input.closest('.multiselect-option')
+ .removeClass(this.options.selectedClass);
+ }
+ }
+
+ if ($elem.is(":disabled")) {
+ $input.attr('disabled', 'disabled')
+ .prop('disabled', true)
+ .closest('.multiselect-option')
+ .addClass('disabled');
+ }
+ else {
+ $input.prop('disabled', false)
+ .closest('.multiselect-option')
+ .removeClass('disabled');
+ }
+ }, this));
+
+ this.updateButtonText();
+ this.updateSelectAll();
+
+ if (this.options.enableClickableOptGroups && this.options.multiple) {
+ this.updateOptGroups();
+ }
+ },
+
+ /**
+ * Select all options of the given values.
+ *
+ * If triggerOnChange is set to true, the on change event is triggered if
+ * and only if one value is passed.
+ *
+ * @param {Array} selectValues
+ * @param {Boolean} triggerOnChange
+ */
+ select: function (selectValues, triggerOnChange) {
+ if (!$.isArray(selectValues)) {
+ selectValues = [selectValues];
+ }
+
+ for (var i = 0; i < selectValues.length; i++) {
+ var value = selectValues[i];
+
+ if (value === null || value === undefined) {
+ continue;
+ }
+
+ var $option = this.getOptionByValue(value);
+ var $checkbox = this.getInputByValue(value);
+
+ if ($option === undefined || $checkbox === undefined) {
+ continue;
+ }
+
+ if (this.options.selectedClass) {
+ $checkbox.closest('.dropdown-item')
+ .addClass(this.options.selectedClass);
+ }
+
+ $checkbox.prop('checked', true);
+ $option.prop('selected', true);
+
+ if (!this.options.multiple) {
+ var $checkboxesNotThis = $('input', this.$container).not($checkbox);
+ $($checkboxesNotThis).prop('checked', false);
+ $($checkboxesNotThis).closest('.multiselect-option').removeClass("active")
+
+ var $optionsNotThis = $('option', this.$select).not($option);
+ $optionsNotThis.prop('selected', false);
+ }
+
+ if (triggerOnChange) {
+ this.options.onChange($option, true);
+ }
+ }
+
+ this.updateButtonText();
+ this.updateSelectAll();
+
+ if (this.options.enableClickableOptGroups && this.options.multiple) {
+ this.updateOptGroups();
+ }
+ },
+
+ /**
+ * Clears all selected items.
+ */
+ clearSelection: function () {
+ this.deselectAll(false);
+ this.updateButtonText();
+ this.updateSelectAll();
+
+ if (this.options.enableClickableOptGroups && this.options.multiple) {
+ this.updateOptGroups();
+ }
+ },
+
+ /**
+ * Deselects all options of the given values.
+ *
+ * If triggerOnChange is set to true, the on change event is triggered, if
+ * and only if one value is passed.
+ *
+ * @param {Array} deselectValues
+ * @param {Boolean} triggerOnChange
+ */
+ deselect: function (deselectValues, triggerOnChange) {
+ if (!this.options.multiple) {
+ // In single selection mode at least on option needs to be selected
+ return;
+ }
+
+ if (!$.isArray(deselectValues)) {
+ deselectValues = [deselectValues];
+ }
+
+ for (var i = 0; i < deselectValues.length; i++) {
+ var value = deselectValues[i];
+
+ if (value === null || value === undefined) {
+ continue;
+ }
+
+ var $option = this.getOptionByValue(value);
+ var $checkbox = this.getInputByValue(value);
+
+ if ($option === undefined || $checkbox === undefined) {
+ continue;
+ }
+
+ if (this.options.selectedClass) {
+ $checkbox.closest('.dropdown-item')
+ .removeClass(this.options.selectedClass);
+ }
+
+ $checkbox.prop('checked', false);
+ $option.prop('selected', false);
+
+ if (triggerOnChange) {
+ this.options.onChange($option, false);
+ }
+ }
+
+ this.updateButtonText();
+ this.updateSelectAll();
+
+ if (this.options.enableClickableOptGroups && this.options.multiple) {
+ this.updateOptGroups();
+ }
+ },
+
+ /**
+ * Selects all enabled & visible options.
+ *
+ * If justVisible is true or not specified, only visible options are selected.
+ *
+ * @param {Boolean} justVisible
+ * @param {Boolean} triggerOnSelectAll
+ */
+ selectAll: function (justVisible, triggerOnSelectAll) {
+ if (!this.options.multiple) {
+ // In single selection mode only one option can be selected at a time
+ return;
+ }
+
+ // Record all changes, i.e., options selected that were not selected before.
+ var selected = [];
+ justVisible = typeof justVisible === 'undefined' ? true : justVisible;
+
+ if (justVisible) {
+ var visibleOptions = $(".multiselect-option:not(.disabled):not(.multiselect-filter-hidden)", this.$popupContainer);
+ $('input:enabled', visibleOptions).prop('checked', true);
+ visibleOptions.addClass(this.options.selectedClass);
+
+ $('input:enabled', visibleOptions).each($.proxy(function (index, element) {
+ var value = $(element).val();
+ var option = this.getOptionByValue(value);
+ if (!$(option).prop('selected')) {
+ selected.push(option);
+ }
+ $(option).prop('selected', true);
+ }, this));
+ }
+ else {
+ var allOptions = $(".multiselect-option:not(.disabled)", this.$popupContainer);
+ $('input:enabled', allOptions).prop('checked', true);
+ allOptions.addClass(this.options.selectedClass);
+
+ $('input:enabled', allOptions).each($.proxy(function (index, element) {
+ var value = $(element).val();
+ var option = this.getOptionByValue(value);
+ if (!$(option).prop('selected')) {
+ selected.push(option);
+ }
+ $(option).prop('selected', true);
+ }, this));
+ }
+
+ $('.multiselect-option input[value="' + this.options.selectAllValue + '"]', this.$popupContainer).prop('checked', true);
+
+ if (this.options.enableClickableOptGroups && this.options.multiple) {
+ this.updateOptGroups();
+ }
+
+ this.updateButtonText();
+ this.updateSelectAll();
+
+ if (triggerOnSelectAll) {
+ this.options.onSelectAll(selected);
+ }
+ },
+
+ /**
+ * Deselects all options.
+ *
+ * If justVisible is true or not specified, only visible options are deselected.
+ *
+ * @param {Boolean} justVisible
+ */
+ deselectAll: function (justVisible, triggerOnDeselectAll) {
+ if (!this.options.multiple) {
+ // In single selection mode at least on option needs to be selected
+ return;
+ }
+
+ // Record changes, i.e., those options that are deselected but were not deselected before.
+ var deselected = [];
+ justVisible = typeof justVisible === 'undefined' ? true : justVisible;
+
+ if (justVisible) {
+ var visibleOptions = $(".multiselect-option:not(.disabled):not(.multiselect-filter-hidden)", this.$popupContainer);
+ $('input[type="checkbox"]:enabled', visibleOptions).prop('checked', false);
+ visibleOptions.removeClass(this.options.selectedClass);
+
+ $('input[type="checkbox"]:enabled', visibleOptions).each($.proxy(function (index, element) {
+ var value = $(element).val();
+ var option = this.getOptionByValue(value);
+ if ($(option).prop('selected')) {
+ deselected.push(option);
+ }
+ $(option).prop('selected', false);
+ }, this));
+ }
+ else {
+ var allOptions = $(".multiselect-option:not(.disabled):not(.multiselect-group)", this.$popupContainer);
+ $('input[type="checkbox"]:enabled', allOptions).prop('checked', false);
+ allOptions.removeClass(this.options.selectedClass);
+
+ $('input[type="checkbox"]:enabled', allOptions).each($.proxy(function (index, element) {
+ var value = $(element).val();
+ var option = this.getOptionByValue(value);
+ if ($(option).prop('selected')) {
+ deselected.push(option);
+ }
+ $(option).prop('selected', false);
+ }, this));
+ }
+
+ $('.multiselect-all input[value="' + this.options.selectAllValue + '"]', this.$popupContainer).prop('checked', false);
+
+ if (this.options.enableClickableOptGroups && this.options.multiple) {
+ this.updateOptGroups();
+ }
+
+ this.updateButtonText();
+ this.updateSelectAll();
+
+ if (triggerOnDeselectAll) {
+ this.options.onDeselectAll(deselected);
+ }
+ },
+
+ /**
+ * Rebuild the plugin.
+ *
+ * Rebuilds the dropdown, the filter and the select all option.
+ */
+ rebuild: function () {
+ this.$popupContainer.html('');
+
+ // Important to distinguish between radios and checkboxes.
+ this.options.multiple = this.$select.attr('multiple') === "multiple";
+
+ this.buildSelectAll();
+ this.buildDropdownOptions();
+ this.buildFilter();
+ this.buildButtons();
+
+ this.updateButtonText();
+ this.updateSelectAll(true);
+
+ if (this.options.enableClickableOptGroups && this.options.multiple) {
+ this.updateOptGroups();
+ }
+
+ if (this.options.disableIfEmpty) {
+ if ($('option', this.$select).length <= 0) {
+ if (!this.$select.prop('disabled')) {
+ this.disable(true);
+ }
+ }
+ else if (this.$select.data("disabled-by-option")) {
+ this.enable();
+ }
+ }
+
+ if (this.options.dropRight) {
+ this.$container.addClass('dropright');
+ }
+ else if (this.options.dropUp) {
+ this.$container.addClass('dropup');
+ }
+
+ if (this.options.widthSynchronizationMode !== 'never') {
+ this.synchronizeButtonAndPopupWidth();
+ }
+ },
+
+ /**
+ * The provided data will be used to build the dropdown.
+ */
+ dataprovider: function (dataprovider) {
+
+ var groupCounter = 0;
+ var $select = this.$select.empty();
+
+ $.each(dataprovider, function (index, option) {
+ var $tag;
+
+ if ($.isArray(option.children)) { // create optiongroup tag
+ groupCounter++;
+
+ $tag = $(' ').attr({
+ label: option.label || 'Group ' + groupCounter,
+ disabled: !!option.disabled,
+ value: option.value
+ });
+
+ forEach(option.children, function (subOption) { // add children option tags
+ var attributes = {
+ value: subOption.value,
+ label: subOption.label || subOption.value,
+ title: subOption.title,
+ selected: !!subOption.selected,
+ disabled: !!subOption.disabled
+ };
+
+ //Loop through attributes object and add key-value for each attribute
+ for (var key in subOption.attributes) {
+ attributes['data-' + key] = subOption.attributes[key];
+ }
+ //Append original attributes + new data attributes to option
+ $tag.append($(' ').attr(attributes));
+ });
+ }
+ else {
+
+ var attributes = {
+ 'value': option.value,
+ 'label': option.label || option.value,
+ 'title': option.title,
+ 'class': option['class'],
+ 'selected': !!option['selected'],
+ 'disabled': !!option['disabled']
+ };
+ //Loop through attributes object and add key-value for each attribute
+ for (var key in option.attributes) {
+ attributes['data-' + key] = option.attributes[key];
+ }
+ //Append original attributes + new data attributes to option
+ $tag = $(' ').attr(attributes);
+
+ $tag.text(option.label || option.value);
+ }
+
+ $select.append($tag);
+ });
+
+ this.rebuild();
+ },
+
+ /**
+ * Enable the multiselect.
+ */
+ enable: function () {
+ this.$select.prop('disabled', false);
+ this.$button.prop('disabled', false)
+ .removeClass('disabled');
+
+ this.updateButtonText();
+ },
+
+ /**
+ * Disable the multiselect.
+ */
+ disable: function (disableByOption) {
+ this.$select.prop('disabled', true);
+ this.$button.prop('disabled', true)
+ .addClass('disabled');
+
+ if (disableByOption) {
+ this.$select.data("disabled-by-option", true);
+ }
+ else {
+ this.$select.data("disabled-by-option", null);
+ }
+
+ this.updateButtonText();
+ },
+
+ /**
+ * Set the options.
+ *
+ * @param {Array} options
+ */
+ setOptions: function (options) {
+ this.options = this.mergeOptions(options);
+ },
+
+ /**
+ * Merges the given options with the default options.
+ *
+ * @param {Array} options
+ * @returns {Array}
+ */
+ mergeOptions: function (options) {
+ return $.extend(true, {}, this.defaults, this.options, options);
+ },
+
+ /**
+ * Checks whether a select all checkbox is present.
+ *
+ * @returns {Boolean}
+ */
+ hasSelectAll: function () {
+ return $('.multiselect-all', this.$popupContainer).length > 0;
+ },
+
+ /**
+ * Update opt groups.
+ */
+ updateOptGroups: function () {
+ var $groups = $('.multiselect-group', this.$popupContainer)
+ var selectedClass = this.options.selectedClass;
+
+ $groups.each(function () {
+ var $options = $(this).nextUntil('.multiselect-group')
+ .not('.multiselect-filter-hidden')
+ .not('.disabled');
+
+ var checked = true;
+ $options.each(function () {
+ var $input = $('input', this);
+
+ if (!$input.prop('checked')) {
+ checked = false;
+ }
+ });
+
+ if (selectedClass) {
+ if (checked) {
+ $(this).addClass(selectedClass);
+ }
+ else {
+ $(this).removeClass(selectedClass);
+ }
+ }
+
+ $('input', this).prop('checked', checked);
+ });
+ },
+
+ /**
+ * Updates the select all checkbox based on the currently displayed and selected checkboxes.
+ */
+ updateSelectAll: function (notTriggerOnSelectAll) {
+ if (this.hasSelectAll()) {
+ var allBoxes = $(".multiselect-option:not(.multiselect-filter-hidden):not(.multiselect-group):not(.disabled) input:enabled", this.$popupContainer);
+ var allBoxesLength = allBoxes.length;
+ var checkedBoxesLength = allBoxes.filter(":checked").length;
+ var selectAllItem = $(".multiselect-all", this.$popupContainer);
+ var selectAllInput = selectAllItem.find("input");
+
+ if (checkedBoxesLength > 0 && checkedBoxesLength === allBoxesLength) {
+ selectAllInput.prop("checked", true);
+ selectAllItem.addClass(this.options.selectedClass);
+ }
+ else {
+ selectAllInput.prop("checked", false);
+ selectAllItem.removeClass(this.options.selectedClass);
+ }
+ }
+ },
+
+ /**
+ * Update the button text and its title based on the currently selected options.
+ */
+ updateButtonText: function () {
+ var options = this.getSelected();
+
+ // First update the displayed button text.
+ if (this.options.enableHTML) {
+ $('.multiselect .multiselect-selected-text', this.$container).html(this.options.buttonText(options, this.$select));
+ }
+ else {
+ $('.multiselect .multiselect-selected-text', this.$container).text(this.options.buttonText(options, this.$select));
+ }
+
+ // Now update the title attribute of the button.
+ $('.multiselect', this.$container).attr('title', this.options.buttonTitle(options, this.$select));
+ this.$button.trigger('change');
+ },
+
+ /**
+ * Get all selected options.
+ *
+ * @returns {jQUery}
+ */
+ getSelected: function () {
+ return $('option', this.$select).filter(":selected");
+ },
+
+ /**
+ * Gets a select option by its value.
+ *
+ * @param {String} value
+ * @returns {jQuery}
+ */
+ getOptionByValue: function (value) {
+
+ var options = $('option', this.$select);
+ var valueToCompare = value.toString();
+
+ for (var i = 0; i < options.length; i = i + 1) {
+ var option = options[i];
+ if (option.value === valueToCompare) {
+ return $(option);
+ }
+ }
+ },
+
+ /**
+ * Get the input (radio/checkbox) by its value.
+ *
+ * @param {String} value
+ * @returns {jQuery}
+ */
+ getInputByValue: function (value) {
+
+ var checkboxes = $('.multiselect-option input:not(.multiselect-search)', this.$popupContainer);
+ var valueToCompare = value.toString();
+
+ for (var i = 0; i < checkboxes.length; i = i + 1) {
+ var checkbox = checkboxes[i];
+ if (checkbox.value === valueToCompare) {
+ return $(checkbox);
+ }
+ }
+ },
+
+ /**
+ * Used for knockout integration.
+ */
+ updateOriginalOptions: function () {
+ this.originalOptions = this.$select.clone()[0].options;
+ },
+
+ asyncFunction: function (callback, timeout, self) {
+ var args = Array.prototype.slice.call(arguments, 3);
+ return setTimeout(function () {
+ callback.apply(self || window, args);
+ }, timeout);
+ },
+
+ setAllSelectedText: function (allSelectedText) {
+ this.options.allSelectedText = allSelectedText;
+ this.updateButtonText();
+ },
+
+ isFirefox: function () {
+ var firefoxIdentifier = 'firefox';
+ var valueNotFoundIndex = -1;
+
+ if (navigator && navigator.userAgent) {
+ return navigator.userAgent.toLocaleLowerCase().indexOf(firefoxIdentifier) > valueNotFoundIndex;
+ }
+
+ return false;
+ }
+ };
+
+ jQuery.fn.multiselect = function (option, parameter, extraOptions) {
+ return this.each(function () {
+ var data = $(this).data('multiselect');
+ var options = typeof option === 'object' && option;
+
+ // Initialize the multiselect.
+ if (!data) {
+ data = new Multiselect(this, options);
+ $(this).data('multiselect', data);
+ }
+
+ // Call multiselect method.
+ if (typeof option === 'string') {
+ data[option](parameter, extraOptions);
+
+ if (option === 'destroy') {
+ $(this).data('multiselect', false);
+ }
+ }
+ });
+ };
+
+ jQuery.fn.multiselect.Constructor = Multiselect;
+
+ jQuery(function () {
+ jQuery("select[data-role=multiselect]").multiselect();
+ });
+
+});
diff --git a/src/assets/plugins/bootstrap-select/css/bootstrap-select.css b/src/assets/plugins/bootstrap-select/css/bootstrap-select.css
new file mode 100644
index 0000000..ce5066d
--- /dev/null
+++ b/src/assets/plugins/bootstrap-select/css/bootstrap-select.css
@@ -0,0 +1,337 @@
+/*!
+ * Bootstrap-select v1.10.0 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2016 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+
+select.bs-select-hidden,
+select.selectpicker {
+ display: none !important;
+}
+
+.bootstrap-select {
+ width: 220px \0;
+ /*IE9 and below*/
+}
+
+.bootstrap-select>.dropdown-toggle {
+ width: 100%;
+ padding-right: 25px;
+ z-index: 1;
+}
+
+.bootstrap-select>select {
+ position: absolute !important;
+ bottom: 0;
+ left: 50%;
+ display: block !important;
+ width: 0.5px !important;
+ height: 100% !important;
+ padding: 0 !important;
+ opacity: 0 !important;
+ border: none;
+}
+
+.bootstrap-select>select.mobile-device {
+ top: 0;
+ left: 0;
+ display: block !important;
+ width: 100% !important;
+ z-index: 2;
+}
+
+.has-error .bootstrap-select .dropdown-toggle,
+.error .bootstrap-select .dropdown-toggle {
+ border-color: #b94a48;
+}
+
+.bootstrap-select.fit-width {
+ width: auto !important;
+}
+
+.bootstrap-select:not([class*="col-"]):not([class*="form-control"]):not(.input-group-btn) {
+ width: 220px;
+}
+
+.bootstrap-select .dropdown-toggle:focus {
+ outline: thin dotted #333333 !important;
+ outline: 5px auto -webkit-focus-ring-color !important;
+ outline-offset: -2px;
+}
+
+.bootstrap-select.form-control {
+ margin-bottom: 0;
+ padding: 0;
+ border: none;
+}
+
+.bootstrap-select.form-control:not([class*="col-"]) {
+ width: 100%;
+}
+
+.bootstrap-select.form-control.input-group-btn {
+ z-index: auto;
+}
+
+.bootstrap-select.btn-group:not(.input-group-btn),
+.bootstrap-select.btn-group[class*="col-"] {
+ float: none;
+ display: inline-block;
+ margin-left: 0;
+}
+
+.bootstrap-select.btn-group.dropdown-menu-right,
+.bootstrap-select.btn-group[class*="col-"].dropdown-menu-right,
+.row .bootstrap-select.btn-group[class*="col-"].dropdown-menu-right {
+ float: right;
+}
+
+.form-inline .bootstrap-select.btn-group,
+.form-horizontal .bootstrap-select.btn-group,
+.form-group .bootstrap-select.btn-group {
+ margin-bottom: 0;
+}
+
+.form-group-lg .bootstrap-select.btn-group.form-control,
+.form-group-sm .bootstrap-select.btn-group.form-control {
+ padding: 0;
+}
+
+.form-inline .bootstrap-select.btn-group .form-control {
+ width: 100%;
+}
+
+.bootstrap-select.btn-group.disabled,
+.bootstrap-select.btn-group>.disabled {
+ cursor: not-allowed;
+}
+
+.bootstrap-select.btn-group.disabled:focus,
+.bootstrap-select.btn-group>.disabled:focus {
+ outline: none !important;
+}
+
+.bootstrap-select.btn-group.bs-container {
+ position: absolute;
+}
+
+.bootstrap-select.btn-group.bs-container .dropdown-menu {
+ z-index: 1060;
+}
+
+.bootstrap-select.btn-group .dropdown-toggle .filter-option {
+ display: inline-block;
+ overflow: hidden;
+ width: 100%;
+ text-align: left;
+}
+
+.bootstrap-select.btn-group .dropdown-toggle .caret {
+ position: absolute;
+ top: 50%;
+ right: 12px;
+ margin-top: -2px;
+ vertical-align: middle;
+}
+
+.bootstrap-select.btn-group[class*="col-"] .dropdown-toggle {
+ width: 100%;
+}
+
+.bootstrap-select.btn-group .dropdown-menu {
+ min-width: 100%;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+
+.bootstrap-select.btn-group .dropdown-menu.inner {
+ position: static;
+ float: none;
+ border: 0;
+ padding: 0;
+ margin: 0;
+ border-radius: 0;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+}
+
+.bootstrap-select.btn-group .dropdown-menu li {
+ position: relative;
+}
+
+.bootstrap-select.btn-group .dropdown-menu li.active small {
+ color: #fff;
+}
+
+.bootstrap-select.btn-group .dropdown-menu li.disabled a {
+ cursor: not-allowed;
+}
+
+.bootstrap-select.btn-group .dropdown-menu li a {
+ cursor: pointer;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+.bootstrap-select.btn-group .dropdown-menu li a.opt {
+ position: relative;
+ padding-left: 2.25em;
+}
+
+.bootstrap-select.btn-group .dropdown-menu li a span.check-mark {
+ display: none;
+}
+
+.bootstrap-select.btn-group .dropdown-menu li a span.text {
+ display: inline-block;
+}
+
+.bootstrap-select.btn-group .dropdown-menu li small {
+ padding-left: 0.5em;
+}
+
+.bootstrap-select.btn-group .dropdown-menu .notify {
+ position: absolute;
+ bottom: 5px;
+ width: 96%;
+ margin: 0 2%;
+ min-height: 26px;
+ padding: 3px 5px;
+ background: #f5f5f5;
+ border: 1px solid #e3e3e3;
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+ pointer-events: none;
+ opacity: 0.9;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+
+.bootstrap-select.btn-group .no-results {
+ padding: 3px;
+ background: #f5f5f5;
+ margin: 0 5px;
+ white-space: nowrap;
+}
+
+.bootstrap-select.btn-group.fit-width .dropdown-toggle .filter-option {
+ position: static;
+}
+
+.bootstrap-select.btn-group.fit-width .dropdown-toggle .caret {
+ position: static;
+ top: auto;
+ margin-top: -1px;
+}
+
+.bootstrap-select.btn-group.show-tick .dropdown-menu li.selected a span.check-mark {
+ position: absolute;
+ display: inline-block;
+ right: 15px;
+ margin-top: 5px;
+}
+
+.bootstrap-select.btn-group.show-tick .dropdown-menu li a span.text {
+ margin-right: 34px;
+}
+
+.bootstrap-select.show-menu-arrow.open>.dropdown-toggle {
+ z-index: 1061;
+}
+
+.bootstrap-select.show-menu-arrow .dropdown-toggle:before {
+ content: '';
+ border-left: 7px solid transparent;
+ border-right: 7px solid transparent;
+ border-bottom: 7px solid rgba(204, 204, 204, 0.2);
+ position: absolute;
+ bottom: -4px;
+ left: 9px;
+ display: none;
+}
+
+.bootstrap-select.show-menu-arrow .dropdown-toggle:after {
+ content: '';
+ border-left: 6px solid transparent;
+ border-right: 6px solid transparent;
+ border-bottom: 6px solid white;
+ position: absolute;
+ bottom: -4px;
+ left: 10px;
+ display: none;
+}
+
+.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle:before {
+ bottom: auto;
+ top: -3px;
+ border-top: 7px solid rgba(204, 204, 204, 0.2);
+ border-bottom: 0;
+}
+
+.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle:after {
+ bottom: auto;
+ top: -3px;
+ border-top: 6px solid white;
+ border-bottom: 0;
+}
+
+.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle:before {
+ right: 12px;
+ left: auto;
+}
+
+.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle:after {
+ right: 13px;
+ left: auto;
+}
+
+.bootstrap-select.show-menu-arrow.open>.dropdown-toggle:before,
+.bootstrap-select.show-menu-arrow.open>.dropdown-toggle:after {
+ display: block;
+}
+
+.bs-searchbox,
+.bs-actionsbox,
+.bs-donebutton {
+ padding: 4px 8px;
+}
+
+.bs-actionsbox {
+ width: 100%;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+
+.bs-actionsbox .btn-group button {
+ width: 50%;
+}
+
+.bs-donebutton {
+ float: left;
+ width: 100%;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+
+.bs-donebutton .btn-group button {
+ width: 100%;
+}
+
+.bs-searchbox+.bs-actionsbox {
+ padding: 0 8px 4px;
+}
+
+.bs-searchbox .form-control {
+ margin-bottom: 0;
+ width: 100%;
+ float: none;
+}
+
+/*# sourceMappingURL=bootstrap-select.css.map */
\ No newline at end of file
diff --git a/src/assets/plugins/bootstrap-select/js/bootstrap-select.js b/src/assets/plugins/bootstrap-select/js/bootstrap-select.js
new file mode 100644
index 0000000..a4301c8
--- /dev/null
+++ b/src/assets/plugins/bootstrap-select/js/bootstrap-select.js
@@ -0,0 +1,1738 @@
+/*!
+ * Bootstrap-select v1.10.0 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2016 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+
+(function (root, factory) {
+ var define;
+ if (typeof define === 'function' && define.amd) {
+ // AMD. Register as an anonymous module unless amdModuleId is set
+ define(["jquery"], function (a0) {
+ return (factory(a0));
+ });
+ } else if (typeof exports === 'object') {
+ // Node. Does not work with strict CommonJS, but
+ // only CommonJS-like environments that support module.exports,
+ // like Node.
+ module.exports = factory(require("jquery"));
+ } else {
+ factory(jQuery);
+ }
+}(this, function (jQuery) {
+
+ (function ($) {
+ 'use strict';
+
+ //
+ if (!String.prototype.includes) {
+ (function () {
+ 'use strict'; // needed to support `apply`/`call` with `undefined`/`null`
+ var toString = {}.toString;
+ var defineProperty = (function () {
+ // IE 8 only supports `Object.defineProperty` on DOM elements
+ try {
+ var object = {};
+ var $defineProperty = Object.defineProperty;
+ var result = $defineProperty(object, object, object) && $defineProperty;
+ } catch (error) {
+ console.error(error);
+ }
+ return result;
+ }());
+ var indexOf = ''.indexOf;
+ var includes = function (search) {
+ if (this == null) {
+ throw new TypeError();
+ }
+ var string = String(this);
+ if (search && toString.call(search) == '[object RegExp]') {
+ throw new TypeError();
+ }
+ var stringLength = string.length;
+ var searchString = String(search);
+ var searchLength = searchString.length;
+ var position = arguments.length > 1 ? arguments[1] : undefined;
+ // `ToInteger`
+ var pos = position ? Number(position) : 0;
+ if (pos != pos) { // better `isNaN`
+ pos = 0;
+ }
+ var start = Math.min(Math.max(pos, 0), stringLength);
+ // Avoid the `indexOf` call if no match is possible
+ if (searchLength + start > stringLength) {
+ return false;
+ }
+ return indexOf.call(string, searchString, pos) != -1;
+ };
+ if (defineProperty) {
+ defineProperty(String.prototype, 'includes', {
+ 'value': includes,
+ 'configurable': true,
+ 'writable': true
+ });
+ } else {
+ String.prototype.includes = includes;
+ }
+ }());
+ }
+
+ if (!String.prototype.startsWith) {
+ (function () {
+ 'use strict'; // needed to support `apply`/`call` with `undefined`/`null`
+ var defineProperty = (function () {
+ // IE 8 only supports `Object.defineProperty` on DOM elements
+ try {
+ var object = {};
+ var $defineProperty = Object.defineProperty;
+ var result = $defineProperty(object, object, object) && $defineProperty;
+ } catch (error) {
+ console.error(error);
+ }
+ return result;
+ }());
+ var toString = {}.toString;
+ var startsWith = function (search) {
+ if (this == null) {
+ throw new TypeError();
+ }
+ var string = String(this);
+ if (search && toString.call(search) == '[object RegExp]') {
+ throw new TypeError();
+ }
+ var stringLength = string.length;
+ var searchString = String(search);
+ var searchLength = searchString.length;
+ var position = arguments.length > 1 ? arguments[1] : undefined;
+ // `ToInteger`
+ var pos = position ? Number(position) : 0;
+ if (pos != pos) { // better `isNaN`
+ pos = 0;
+ }
+ var start = Math.min(Math.max(pos, 0), stringLength);
+ // Avoid the `indexOf` call if no match is possible
+ if (searchLength + start > stringLength) {
+ return false;
+ }
+ var index = -1;
+ while (++index < searchLength) {
+ if (string.charCodeAt(start + index) != searchString.charCodeAt(index)) {
+ return false;
+ }
+ }
+ return true;
+ };
+ if (defineProperty) {
+ defineProperty(String.prototype, 'startsWith', {
+ 'value': startsWith,
+ 'configurable': true,
+ 'writable': true
+ });
+ } else {
+ String.prototype.startsWith = startsWith;
+ }
+ }());
+ }
+
+ if (!Object.keys) {
+ Object.keys = function (
+ o, // object
+ k, // key
+ r // result array
+ ) {
+ // initialize object and result
+ r = [];
+ // iterate over object keys
+ for (k in o)
+ // fill result array with non-prototypical keys
+ r.hasOwnProperty.call(o, k) && r.push(k);
+ // return result
+ return r;
+ };
+ }
+
+ $.fn.triggerNative = function (eventName) {
+ var el = this[0],
+ event;
+
+ if (el.dispatchEvent) {
+ if (typeof Event === 'function') {
+ // For modern browsers
+ event = new Event(eventName, {
+ bubbles: true
+ });
+ } else {
+ // For IE since it doesn't support Event constructor
+ event = document.createEvent('Event');
+ event.initEvent(eventName, true, false);
+ }
+
+ el.dispatchEvent(event);
+ } else {
+ if (el.fireEvent) {
+ event = document.createEventObject();
+ event.eventType = eventName;
+ el.fireEvent('on' + eventName, event);
+ }
+
+ this.trigger(eventName);
+ }
+ };
+ //
+
+ // Case insensitive contains search
+ $.expr[':'].icontains = function (obj, index, meta) {
+ var $obj = $(obj);
+ var haystack = ($obj.data('tokens') || $obj.text()).toUpperCase();
+ return haystack.includes(meta[3].toUpperCase());
+ };
+
+ // Case insensitive begins search
+ $.expr[':'].ibegins = function (obj, index, meta) {
+ var $obj = $(obj);
+ var haystack = ($obj.data('tokens') || $obj.text()).toUpperCase();
+ return haystack.startsWith(meta[3].toUpperCase());
+ };
+
+ // Case and accent insensitive contains search
+ $.expr[':'].aicontains = function (obj, index, meta) {
+ var $obj = $(obj);
+ var haystack = ($obj.data('tokens') || $obj.data('normalizedText') || $obj.text()).toUpperCase();
+ return haystack.includes(meta[3].toUpperCase());
+ };
+
+ // Case and accent insensitive begins search
+ $.expr[':'].aibegins = function (obj, index, meta) {
+ var $obj = $(obj);
+ var haystack = ($obj.data('tokens') || $obj.data('normalizedText') || $obj.text()).toUpperCase();
+ return haystack.startsWith(meta[3].toUpperCase());
+ };
+
+ /**
+ * Remove all diatrics from the given text.
+ * @access private
+ * @param {String} text
+ * @returns {String}
+ */
+ function normalizeToBase(text) {
+ var rExps = [
+ { re: /[\xC0-\xC6]/g, ch: "A" },
+ { re: /[\xE0-\xE6]/g, ch: "a" },
+ { re: /[\xC8-\xCB]/g, ch: "E" },
+ { re: /[\xE8-\xEB]/g, ch: "e" },
+ { re: /[\xCC-\xCF]/g, ch: "I" },
+ { re: /[\xEC-\xEF]/g, ch: "i" },
+ { re: /[\xD2-\xD6]/g, ch: "O" },
+ { re: /[\xF2-\xF6]/g, ch: "o" },
+ { re: /[\xD9-\xDC]/g, ch: "U" },
+ { re: /[\xF9-\xFC]/g, ch: "u" },
+ { re: /[\xC7-\xE7]/g, ch: "c" },
+ { re: /[\xD1]/g, ch: "N" },
+ { re: /[\xF1]/g, ch: "n" }
+ ];
+ $.each(rExps, function () {
+ text = text.replace(this.re, this.ch);
+ });
+ return text;
+ }
+
+
+ function htmlEscape(html) {
+ var escapeMap = {
+ '&': '&',
+ '<': '<',
+ '>': '>',
+ '"': '"',
+ "'": ''',
+ '`': '`'
+ };
+ var source = '(?:' + Object.keys(escapeMap).join('|') + ')',
+ testRegexp = new RegExp(source),
+ replaceRegexp = new RegExp(source, 'g'),
+ string = html == null ? '' : '' + html;
+ return testRegexp.test(string) ? string.replace(replaceRegexp, function (match) {
+ return escapeMap[match];
+ }) : string;
+ }
+
+ var Selectpicker = function (element, options, e) {
+ if (e) {
+ e.stopPropagation();
+ e.preventDefault();
+ }
+
+ this.$element = $(element);
+ this.$newElement = null;
+ this.$button = null;
+ this.$menu = null;
+ this.$lis = null;
+ this.options = options;
+
+ // If we have no title yet, try to pull it from the html title attribute (jQuery doesnt' pick it up as it's not a
+ // data-attribute)
+ if (this.options.title === null) {
+ this.options.title = this.$element.attr('title');
+ }
+
+ //Expose public methods
+ this.val = Selectpicker.prototype.val;
+ this.render = Selectpicker.prototype.render;
+ this.refresh = Selectpicker.prototype.refresh;
+ this.setStyle = Selectpicker.prototype.setStyle;
+ this.selectAll = Selectpicker.prototype.selectAll;
+ this.deselectAll = Selectpicker.prototype.deselectAll;
+ this.destroy = Selectpicker.prototype.destroy;
+ this.remove = Selectpicker.prototype.remove;
+ this.show = Selectpicker.prototype.show;
+ this.hide = Selectpicker.prototype.hide;
+
+ this.init();
+ };
+
+ Selectpicker.VERSION = '1.10.0';
+
+ // part of this is duplicated in i18n/defaults-en_US.js. Make sure to update both.
+ Selectpicker.DEFAULTS = {
+ noneSelectedText: 'Nothing selected',
+ noneResultsText: 'No results matched {0}',
+ countSelectedText: function (numSelected, numTotal) {
+ return (numSelected == 1) ? "{0} item selected" : "{0} items selected";
+ },
+ maxOptionsText: function (numAll, numGroup) {
+ return [
+ (numAll == 1) ? 'Limit reached ({n} item max)' : 'Limit reached ({n} items max)',
+ (numGroup == 1) ? 'Group limit reached ({n} item max)' : 'Group limit reached ({n} items max)'
+ ];
+ },
+ selectAllText: 'Select All',
+ deselectAllText: 'Deselect All',
+ doneButton: false,
+ doneButtonText: 'Close',
+ multipleSeparator: ', ',
+ styleBase: 'btn',
+ style: 'btn-default',
+ size: 'auto',
+ title: null,
+ selectedTextFormat: 'values',
+ width: false,
+ container: false,
+ hideDisabled: false,
+ showSubtext: false,
+ showIcon: true,
+ showContent: true,
+ dropupAuto: true,
+ header: false,
+ liveSearch: false,
+ liveSearchPlaceholder: null,
+ liveSearchNormalize: false,
+ liveSearchStyle: 'contains',
+ actionsBox: false,
+ iconBase: 'glyphicon',
+ tickIcon: 'glyphicon-ok',
+ showTick: false,
+ template: {
+ caret: ' '
+ },
+ maxOptions: false,
+ mobile: false,
+ selectOnTab: false,
+ dropdownAlignRight: false
+ };
+
+ Selectpicker.prototype = {
+
+ constructor: Selectpicker,
+
+ init: function () {
+ var that = this,
+ id = this.$element.attr('id');
+
+ this.$element.addClass('bs-select-hidden');
+
+ // store originalIndex (key) and newIndex (value) in this.liObj for fast accessibility
+ // allows us to do this.$lis.eq(that.liObj[index]) instead of this.$lis.filter('[data-original-index="' + index + '"]')
+ this.liObj = {};
+ this.multiple = this.$element.prop('multiple');
+ this.autofocus = this.$element.prop('autofocus');
+ this.$newElement = this.createView();
+ this.$element
+ .after(this.$newElement)
+ .appendTo(this.$newElement);
+ this.$button = this.$newElement.children('button');
+ this.$menu = this.$newElement.children('.dropdown-menu');
+ this.$menuInner = this.$menu.children('.inner');
+ this.$searchbox = this.$menu.find('input');
+
+ this.$element.removeClass('bs-select-hidden');
+
+ if (this.options.dropdownAlignRight)
+ this.$menu.addClass('dropdown-menu-right');
+
+ if (typeof id !== 'undefined') {
+ this.$button.attr('data-id', id);
+ $('label[for="' + id + '"]').click(function (e) {
+ e.preventDefault();
+ that.$button.focus();
+ });
+ }
+
+ this.checkDisabled();
+ this.clickListener();
+ if (this.options.liveSearch) this.liveSearchListener();
+ this.render();
+ this.setStyle();
+ this.setWidth();
+ if (this.options.container) this.selectPosition();
+ this.$menu.data('this', this);
+ this.$newElement.data('this', this);
+ if (this.options.mobile) this.mobile();
+
+ this.$newElement.on({
+ 'hide.bs.dropdown': function (e) {
+ that.$element.trigger('hide.bs.select', e);
+ },
+ 'hidden.bs.dropdown': function (e) {
+ that.$element.trigger('hidden.bs.select', e);
+ },
+ 'show.bs.dropdown': function (e) {
+ that.$element.trigger('show.bs.select', e);
+ },
+ 'shown.bs.dropdown': function (e) {
+ that.$element.trigger('shown.bs.select', e);
+ }
+ });
+
+ if (that.$element[0].hasAttribute('required')) {
+ this.$element.on('invalid', function () {
+ that.$button
+ .addClass('bs-invalid')
+ .focus();
+
+ that.$element.on({
+ 'focus.bs.select': function () {
+ that.$button.focus();
+ that.$element.off('focus.bs.select');
+ },
+ 'shown.bs.select': function () {
+ that.$element
+ .val(that.$element.val()) // set the value to hide the validation message in Chrome when menu is opened
+ .off('shown.bs.select');
+ },
+ 'rendered.bs.select': function () {
+ // if select is no longer invalid, remove the bs-invalid class
+ if (this.validity.valid) that.$button.removeClass('bs-invalid');
+ that.$element.off('rendered.bs.select');
+ }
+ });
+
+ });
+ }
+
+ setTimeout(function () {
+ that.$element.trigger('loaded.bs.select');
+ });
+ },
+
+ createDropdown: function () {
+ // Options
+ // If we are multiple or showTick option is set, then add the show-tick class
+ var showTick = (this.multiple || this.options.showTick) ? ' show-tick' : '',
+ inputGroup = this.$element.parent().hasClass('input-group') ? ' input-group-btn' : '',
+ autofocus = this.autofocus ? ' autofocus' : '';
+ // Elements
+ var header = this.options.header ? '× ' + this.options.header + '
' : '';
+ var searchbox = this.options.liveSearch ?
+ '' +
+ ' ' +
+ '
'
+ : '';
+ var actionsbox = this.multiple && this.options.actionsBox ?
+ '' +
+ '
' +
+ '' +
+ this.options.selectAllText +
+ ' ' +
+ '' +
+ this.options.deselectAllText +
+ ' ' +
+ '
' +
+ '
'
+ : '';
+ var donebutton = this.multiple && this.options.doneButton ?
+ ''
+ : '';
+ var drop =
+ '' +
+ '' +
+ ' ' +
+ '' +
+ this.options.template.caret +
+ ' ' +
+ ' ' +
+ '' +
+ '
';
+
+ return $(drop);
+ },
+
+ createView: function () {
+ var $drop = this.createDropdown(),
+ li = this.createLi();
+
+ $drop.find('ul')[0].innerHTML = li;
+ return $drop;
+ },
+
+ reloadLi: function () {
+ //Remove all children.
+ this.destroyLi();
+ //Re build
+ var li = this.createLi();
+ this.$menuInner[0].innerHTML = li;
+ },
+
+ destroyLi: function () {
+ this.$menu.find('li').remove();
+ },
+
+ createLi: function () {
+ var that = this,
+ _li = [],
+ optID = 0,
+ titleOption = document.createElement('option'),
+ liIndex = -1; // increment liIndex whenever a new element is created to ensure liObj is correct
+
+ // Helper functions
+ /**
+ * @param content
+ * @param [index]
+ * @param [classes]
+ * @param [optgroup]
+ * @returns {string}
+ */
+ var generateLI = function (content, index, classes, optgroup) {
+ return ' ' + content + ' ';
+ };
+
+ /**
+ * @param text
+ * @param [classes]
+ * @param [inline]
+ * @param [tokens]
+ * @returns {string}
+ */
+ var generateA = function (text, classes, inline, tokens) {
+ return '' + text +
+ ' ' +
+ ' ';
+ };
+
+ if (this.options.title && !this.multiple) {
+ // this option doesn't create a new element, but does add a new option, so liIndex is decreased
+ // since liObj is recalculated on every refresh, liIndex needs to be decreased even if the titleOption is already appended
+ liIndex--;
+
+ if (!this.$element.find('.bs-title-option').length) {
+ // Use native JS to prepend option (faster)
+ var element = this.$element[0];
+ titleOption.className = 'bs-title-option';
+ titleOption.appendChild(document.createTextNode(this.options.title));
+ titleOption.value = '';
+ element.insertBefore(titleOption, element.firstChild);
+ // Check if selected attribute is already set on an option. If not, select the titleOption option.
+ if ($(element.options[element.selectedIndex]).attr('selected') === undefined) titleOption.selected = true;
+ }
+ }
+
+ this.$element.find('option').each(function (index) {
+ var $this = $(this);
+
+ liIndex++;
+
+ if ($this.hasClass('bs-title-option')) return;
+
+ // Get the class and text for the option
+ var optionClass = this.className || '',
+ inline = this.style.cssText,
+ text = $this.data('content') ? $this.data('content') : $this.html(),
+ tokens = $this.data('tokens') ? $this.data('tokens') : null,
+ subtext = typeof $this.data('subtext') !== 'undefined' ? '' + $this.data('subtext') + ' ' : '',
+ icon = typeof $this.data('icon') !== 'undefined' ? ' ' : '',
+ isOptgroup = this.parentNode.tagName === 'OPTGROUP',
+ isDisabled = this.disabled || (isOptgroup && this.parentNode.disabled);
+
+ if (icon !== '' && isDisabled) {
+ icon = '' + icon + ' ';
+ }
+
+ if (that.options.hideDisabled && isDisabled && !isOptgroup) {
+ liIndex--;
+ return;
+ }
+
+ if (!$this.data('content')) {
+ // Prepend any icon and append any subtext to the main text.
+ text = icon + '' + text + subtext + ' ';
+ }
+
+ if (isOptgroup && $this.data('divider') !== true) {
+ var optGroupClass = ' ' + this.parentNode.className || '';
+
+ if ($this.index() === 0) { // Is it the first option of the optgroup?
+ optID += 1;
+
+ // Get the opt group label
+ var label = this.parentNode.label,
+ labelSubtext = typeof $this.parent().data('subtext') !== 'undefined' ? '' + $this.parent().data('subtext') + ' ' : '',
+ labelIcon = $this.parent().data('icon') ? ' ' : '';
+
+ label = labelIcon + '' + label + labelSubtext + ' ';
+
+ if (index !== 0 && _li.length > 0) { // Is it NOT the first option of the select && are there elements in the dropdown?
+ liIndex++;
+ _li.push(generateLI('', null, 'divider', optID + 'div'));
+ }
+ liIndex++;
+ _li.push(generateLI(label, null, 'dropdown-header' + optGroupClass, optID));
+ }
+
+ if (that.options.hideDisabled && isDisabled) {
+ liIndex--;
+ return;
+ }
+
+ _li.push(generateLI(generateA(text, 'opt ' + optionClass + optGroupClass, inline, tokens), index, '', optID));
+ } else if ($this.data('divider') === true) {
+ _li.push(generateLI('', index, 'divider'));
+ } else if ($this.data('hidden') === true) {
+ _li.push(generateLI(generateA(text, optionClass, inline, tokens), index, 'hidden is-hidden'));
+ } else {
+ if (this.previousElementSibling && this.previousElementSibling.tagName === 'OPTGROUP') {
+ liIndex++;
+ _li.push(generateLI('', null, 'divider', optID + 'div'));
+ }
+ _li.push(generateLI(generateA(text, optionClass, inline, tokens), index));
+ }
+
+ that.liObj[index] = liIndex;
+ });
+
+ //If we are not multiple, we don't have a selected item, and we don't have a title, select the first element so something is set in the button
+ if (!this.multiple && this.$element.find('option:selected').length === 0 && !this.options.title) {
+ this.$element.find('option').eq(0).prop('selected', true).attr('selected', 'selected');
+ }
+
+ return _li.join('');
+ },
+
+ findLis: function () {
+ if (this.$lis == null) this.$lis = this.$menu.find('li');
+ return this.$lis;
+ },
+
+ /**
+ * @param [updateLi] defaults to true
+ */
+ render: function (updateLi) {
+ var that = this,
+ notDisabled;
+
+ //Update the LI to match the SELECT
+ if (updateLi !== false) {
+ this.$element.find('option').each(function (index) {
+ var $lis = that.findLis().eq(that.liObj[index]);
+
+ that.setDisabled(index, this.disabled || this.parentNode.tagName === 'OPTGROUP' && this.parentNode.disabled, $lis);
+ that.setSelected(index, this.selected, $lis);
+ });
+ }
+
+ this.tabIndex();
+
+ var selectedItems = this.$element.find('option').map(function () {
+ if (this.selected) {
+ if (that.options.hideDisabled && (this.disabled || this.parentNode.tagName === 'OPTGROUP' && this.parentNode.disabled)) return;
+
+ var $this = $(this),
+ icon = $this.data('icon') && that.options.showIcon ? ' ' : '',
+ subtext;
+
+ if (that.options.showSubtext && $this.data('subtext') && !that.multiple) {
+ subtext = ' ' + $this.data('subtext') + ' ';
+ } else {
+ subtext = '';
+ }
+ if (typeof $this.attr('title') !== 'undefined') {
+ return $this.attr('title');
+ } else if ($this.data('content') && that.options.showContent) {
+ return $this.data('content');
+ } else {
+ return icon + $this.html() + subtext;
+ }
+ }
+ }).toArray();
+
+ //Fixes issue in IE10 occurring when no default option is selected and at least one option is disabled
+ //Convert all the values into a comma delimited string
+ var title = !this.multiple ? selectedItems[0] : selectedItems.join(this.options.multipleSeparator);
+
+ //If this is multi select, and the selectText type is count, the show 1 of 2 selected etc..
+ if (this.multiple && this.options.selectedTextFormat.indexOf('count') > -1) {
+ var max = this.options.selectedTextFormat.split('>');
+ if ((max.length > 1 && selectedItems.length > max[1]) || (max.length == 1 && selectedItems.length >= 2)) {
+ notDisabled = this.options.hideDisabled ? ', [disabled]' : '';
+ var totalCount = this.$element.find('option').not('[data-divider="true"], [data-hidden="true"]' + notDisabled).length,
+ tr8nText = (typeof this.options.countSelectedText === 'function') ? this.options.countSelectedText(selectedItems.length, totalCount) : this.options.countSelectedText;
+ title = tr8nText.replace('{0}', selectedItems.length.toString()).replace('{1}', totalCount.toString());
+ }
+ }
+
+ if (this.options.title == undefined) {
+ this.options.title = this.$element.attr('title');
+ }
+
+ if (this.options.selectedTextFormat == 'static') {
+ title = this.options.title;
+ }
+
+ //If we dont have a title, then use the default, or if nothing is set at all, use the not selected text
+ if (!title) {
+ title = typeof this.options.title !== 'undefined' ? this.options.title : this.options.noneSelectedText;
+ }
+
+ //strip all html-tags and trim the result
+ this.$button.attr('title', $.trim(title.replace(/<[^>]*>?/g, '')));
+ this.$button.children('.filter-option').html(title);
+
+ this.$element.trigger('rendered.bs.select');
+ },
+
+ /**
+ * @param [style]
+ * @param [status]
+ */
+ setStyle: function (style, status) {
+ if (this.$element.attr('class')) {
+ this.$newElement.addClass(this.$element.attr('class').replace(/selectpicker|mobile-device|bs-select-hidden|validate\[.*\]/gi, ''));
+ }
+
+ var buttonClass = style ? style : this.options.style;
+
+ if (status == 'add') {
+ this.$button.addClass(buttonClass);
+ } else if (status == 'remove') {
+ this.$button.removeClass(buttonClass);
+ } else {
+ this.$button.removeClass(this.options.style);
+ this.$button.addClass(buttonClass);
+ }
+ },
+
+ liHeight: function (refresh) {
+ if (!refresh && (this.options.size === false || this.sizeInfo)) return;
+
+ var newElement = document.createElement('div'),
+ menu = document.createElement('div'),
+ menuInner = document.createElement('ul'),
+ divider = document.createElement('li'),
+ li = document.createElement('li'),
+ a = document.createElement('a'),
+ text = document.createElement('span'),
+ header = this.options.header && this.$menu.find('.popover-title').length > 0 ? this.$menu.find('.popover-title')[0].cloneNode(true) : null,
+ search = this.options.liveSearch ? document.createElement('div') : null,
+ actions = this.options.actionsBox && this.multiple && this.$menu.find('.bs-actionsbox').length > 0 ? this.$menu.find('.bs-actionsbox')[0].cloneNode(true) : null,
+ doneButton = this.options.doneButton && this.multiple && this.$menu.find('.bs-donebutton').length > 0 ? this.$menu.find('.bs-donebutton')[0].cloneNode(true) : null;
+
+ text.className = 'text';
+ newElement.className = this.$menu[0].parentNode.className + ' open';
+ menu.className = 'dropdown-menu open';
+ menuInner.className = 'dropdown-menu inner';
+ divider.className = 'divider';
+
+ text.appendChild(document.createTextNode('Inner text'));
+ a.appendChild(text);
+ li.appendChild(a);
+ menuInner.appendChild(li);
+ menuInner.appendChild(divider);
+ if (header) menu.appendChild(header);
+ if (search) {
+ // create a span instead of input as creating an input element is slower
+ var input = document.createElement('span');
+ search.className = 'bs-searchbox';
+ input.className = 'form-control';
+ search.appendChild(input);
+ menu.appendChild(search);
+ }
+ if (actions) menu.appendChild(actions);
+ menu.appendChild(menuInner);
+ if (doneButton) menu.appendChild(doneButton);
+ newElement.appendChild(menu);
+
+ document.body.appendChild(newElement);
+
+ var liHeight = a.offsetHeight,
+ headerHeight = header ? header.offsetHeight : 0,
+ searchHeight = search ? search.offsetHeight : 0,
+ actionsHeight = actions ? actions.offsetHeight : 0,
+ doneButtonHeight = doneButton ? doneButton.offsetHeight : 0,
+ dividerHeight = $(divider).outerHeight(true),
+ // fall back to jQuery if getComputedStyle is not supported
+ menuStyle = typeof getComputedStyle === 'function' ? getComputedStyle(menu) : false,
+ $menu = menuStyle ? null : $(menu),
+ menuPadding = parseInt(menuStyle ? menuStyle.paddingTop : $menu.css('paddingTop')) +
+ parseInt(menuStyle ? menuStyle.paddingBottom : $menu.css('paddingBottom')) +
+ parseInt(menuStyle ? menuStyle.borderTopWidth : $menu.css('borderTopWidth')) +
+ parseInt(menuStyle ? menuStyle.borderBottomWidth : $menu.css('borderBottomWidth')),
+ menuExtras = menuPadding +
+ parseInt(menuStyle ? menuStyle.marginTop : $menu.css('marginTop')) +
+ parseInt(menuStyle ? menuStyle.marginBottom : $menu.css('marginBottom')) + 2;
+
+ document.body.removeChild(newElement);
+
+ this.sizeInfo = {
+ liHeight: liHeight,
+ headerHeight: headerHeight,
+ searchHeight: searchHeight,
+ actionsHeight: actionsHeight,
+ doneButtonHeight: doneButtonHeight,
+ dividerHeight: dividerHeight,
+ menuPadding: menuPadding,
+ menuExtras: menuExtras
+ };
+ },
+
+ setSize: function () {
+ this.findLis();
+ this.liHeight();
+
+ if (this.options.header) this.$menu.css('padding-top', 0);
+ if (this.options.size === false) return;
+
+ var that = this,
+ $menu = this.$menu,
+ $menuInner = this.$menuInner,
+ $window = $(window),
+ selectHeight = this.$newElement[0].offsetHeight,
+ liHeight = this.sizeInfo['liHeight'],
+ headerHeight = this.sizeInfo['headerHeight'],
+ searchHeight = this.sizeInfo['searchHeight'],
+ actionsHeight = this.sizeInfo['actionsHeight'],
+ doneButtonHeight = this.sizeInfo['doneButtonHeight'],
+ divHeight = this.sizeInfo['dividerHeight'],
+ menuPadding = this.sizeInfo['menuPadding'],
+ menuExtras = this.sizeInfo['menuExtras'],
+ notDisabled = this.options.hideDisabled ? '.disabled' : '',
+ menuHeight,
+ getHeight,
+ selectOffsetTop,
+ selectOffsetBot,
+ posVert = function () {
+ selectOffsetTop = that.$newElement.offset().top - $window.scrollTop();
+ selectOffsetBot = $window.height() - selectOffsetTop - selectHeight;
+ };
+
+ posVert();
+
+ if (this.options.size === 'auto') {
+ var getSize = function () {
+ var minHeight,
+ hasClass = function (className, include) {
+ return function (element) {
+ if (include) {
+ return (element.classList ? element.classList.contains(className) : $(element).hasClass(className));
+ } else {
+ return !(element.classList ? element.classList.contains(className) : $(element).hasClass(className));
+ }
+ };
+ },
+ lis = that.$menuInner[0].getElementsByTagName('li'),
+ lisVisible = Array.prototype.filter ? Array.prototype.filter.call(lis, hasClass('hidden', false)) : that.$lis.not('.hidden'),
+ optGroup = Array.prototype.filter ? Array.prototype.filter.call(lisVisible, hasClass('dropdown-header', true)) : lisVisible.filter('.dropdown-header');
+
+ posVert();
+ menuHeight = selectOffsetBot - menuExtras;
+
+ if (that.options.container) {
+ if (!$menu.data('height')) $menu.data('height', $menu.height());
+ getHeight = $menu.data('height');
+ } else {
+ getHeight = $menu.height();
+ }
+
+ if (that.options.dropupAuto) {
+ that.$newElement.toggleClass('dropup', selectOffsetTop > selectOffsetBot && (menuHeight - menuExtras) < getHeight);
+ }
+ if (that.$newElement.hasClass('dropup')) {
+ menuHeight = selectOffsetTop - menuExtras;
+ }
+
+ if ((lisVisible.length + optGroup.length) > 3) {
+ minHeight = liHeight * 3 + menuExtras - 2;
+ } else {
+ minHeight = 0;
+ }
+
+ $menu.css({
+ 'max-height': menuHeight + 'px',
+ 'overflow': 'hidden',
+ 'min-height': minHeight + headerHeight + searchHeight + actionsHeight + doneButtonHeight + 'px'
+ });
+ $menuInner.css({
+ 'max-height': menuHeight - headerHeight - searchHeight - actionsHeight - doneButtonHeight - menuPadding + 'px',
+ 'overflow-y': 'auto',
+ 'min-height': Math.max(minHeight - menuPadding, 0) + 'px'
+ });
+ };
+ getSize();
+ this.$searchbox.off('input.getSize propertychange.getSize').on('input.getSize propertychange.getSize', getSize);
+ $window.off('resize.getSize scroll.getSize').on('resize.getSize scroll.getSize', getSize);
+ } else if (this.options.size && this.options.size != 'auto' && this.$lis.not(notDisabled).length > this.options.size) {
+ var optIndex = this.$lis.not('.divider').not(notDisabled).children().slice(0, this.options.size).last().parent().index(),
+ divLength = this.$lis.slice(0, optIndex + 1).filter('.divider').length;
+ menuHeight = liHeight * this.options.size + divLength * divHeight + menuPadding;
+
+ if (that.options.container) {
+ if (!$menu.data('height')) $menu.data('height', $menu.height());
+ getHeight = $menu.data('height');
+ } else {
+ getHeight = $menu.height();
+ }
+
+ if (that.options.dropupAuto) {
+ //noinspection JSUnusedAssignment
+ this.$newElement.toggleClass('dropup', selectOffsetTop > selectOffsetBot && (menuHeight - menuExtras) < getHeight);
+ }
+ $menu.css({
+ 'max-height': menuHeight + headerHeight + searchHeight + actionsHeight + doneButtonHeight + 'px',
+ 'overflow': 'hidden',
+ 'min-height': ''
+ });
+ $menuInner.css({
+ 'max-height': menuHeight - menuPadding + 'px',
+ 'overflow-y': 'auto',
+ 'min-height': ''
+ });
+ }
+ },
+
+ setWidth: function () {
+ if (this.options.width === 'auto') {
+ this.$menu.css('min-width', '0');
+
+ // Get correct width if element is hidden
+ var $selectClone = this.$menu.parent().clone().appendTo('body'),
+ $selectClone2 = this.options.container ? this.$newElement.clone().appendTo('body') : $selectClone,
+ ulWidth = $selectClone.children('.dropdown-menu').outerWidth(),
+ btnWidth = $selectClone2.css('width', 'auto').children('button').outerWidth();
+
+ $selectClone.remove();
+ $selectClone2.remove();
+
+ // Set width to whatever's larger, button title or longest option
+ this.$newElement.css('width', Math.max(ulWidth, btnWidth) + 'px');
+ } else if (this.options.width === 'fit') {
+ // Remove inline min-width so width can be changed from 'auto'
+ this.$menu.css('min-width', '');
+ this.$newElement.css('width', '').addClass('fit-width');
+ } else if (this.options.width) {
+ // Remove inline min-width so width can be changed from 'auto'
+ this.$menu.css('min-width', '');
+ this.$newElement.css('width', this.options.width);
+ } else {
+ // Remove inline min-width/width so width can be changed
+ this.$menu.css('min-width', '');
+ this.$newElement.css('width', '');
+ }
+ // Remove fit-width class if width is changed programmatically
+ if (this.$newElement.hasClass('fit-width') && this.options.width !== 'fit') {
+ this.$newElement.removeClass('fit-width');
+ }
+ },
+
+ selectPosition: function () {
+ this.$bsContainer = $('
');
+
+ var that = this,
+ pos,
+ actualHeight,
+ getPlacement = function ($element) {
+ that.$bsContainer.addClass($element.attr('class').replace(/form-control|fit-width/gi, '')).toggleClass('dropup', $element.hasClass('dropup'));
+ pos = $element.offset();
+ actualHeight = $element.hasClass('dropup') ? 0 : $element[0].offsetHeight;
+ that.$bsContainer.css({
+ 'top': pos.top + actualHeight,
+ 'left': pos.left,
+ 'width': $element[0].offsetWidth
+ });
+ };
+
+ this.$button.on('click', function () {
+ var $this = $(this);
+
+ if (that.isDisabled()) {
+ return;
+ }
+
+ getPlacement(that.$newElement);
+
+ that.$bsContainer
+ .appendTo(that.options.container)
+ .toggleClass('open', !$this.hasClass('open'))
+ .append(that.$menu);
+ });
+
+ $(window).on('resize scroll', function () {
+ getPlacement(that.$newElement);
+ });
+
+ this.$element.on('hide.bs.select', function () {
+ that.$menu.data('height', that.$menu.height());
+ that.$bsContainer.detach();
+ });
+ },
+
+ setSelected: function (index, selected, $lis) {
+ if (!$lis) {
+ $lis = this.findLis().eq(this.liObj[index]);
+ }
+
+ $lis.toggleClass('selected', selected);
+ },
+
+ setDisabled: function (index, disabled, $lis) {
+ if (!$lis) {
+ $lis = this.findLis().eq(this.liObj[index]);
+ }
+
+ if (disabled) {
+ $lis.addClass('disabled').children('a').attr('href', '#').attr('tabindex', -1);
+ } else {
+ $lis.removeClass('disabled').children('a').removeAttr('href').attr('tabindex', 0);
+ }
+ },
+
+ isDisabled: function () {
+ return this.$element[0].disabled;
+ },
+
+ checkDisabled: function () {
+ var that = this;
+
+ if (this.isDisabled()) {
+ this.$newElement.addClass('disabled');
+ this.$button.addClass('disabled').attr('tabindex', -1);
+ } else {
+ if (this.$button.hasClass('disabled')) {
+ this.$newElement.removeClass('disabled');
+ this.$button.removeClass('disabled');
+ }
+
+ if (this.$button.attr('tabindex') == -1 && !this.$element.data('tabindex')) {
+ this.$button.removeAttr('tabindex');
+ }
+ }
+
+ this.$button.click(function () {
+ return !that.isDisabled();
+ });
+ },
+
+ tabIndex: function () {
+ if (this.$element.data('tabindex') !== this.$element.attr('tabindex') &&
+ (this.$element.attr('tabindex') !== -98 && this.$element.attr('tabindex') !== '-98')) {
+ this.$element.data('tabindex', this.$element.attr('tabindex'));
+ this.$button.attr('tabindex', this.$element.data('tabindex'));
+ }
+
+ this.$element.attr('tabindex', -98);
+ },
+
+ clickListener: function () {
+ var that = this,
+ $document = $(document);
+
+ this.$newElement.on('touchstart.dropdown', '.dropdown-menu', function (e) {
+ e.stopPropagation();
+ });
+
+ $document.data('spaceSelect', false);
+
+ this.$button.on('keyup', function (e) {
+ if (/(32)/.test(e.keyCode.toString(10)) && $document.data('spaceSelect')) {
+ e.preventDefault();
+ $document.data('spaceSelect', false);
+ }
+ });
+
+ this.$button.on('click', function () {
+ that.setSize();
+ });
+
+ this.$element.on('shown.bs.select', function () {
+ if (!that.options.liveSearch && !that.multiple) {
+ that.$menuInner.find('.selected a').focus();
+ } else if (!that.multiple) {
+ var selectedIndex = that.liObj[that.$element[0].selectedIndex];
+
+ if (typeof selectedIndex !== 'number' || that.options.size === false) return;
+
+ // scroll to selected option
+ var offset = that.$lis.eq(selectedIndex)[0].offsetTop - that.$menuInner[0].offsetTop;
+ offset = offset - that.$menuInner[0].offsetHeight / 2 + that.sizeInfo.liHeight / 2;
+ that.$menuInner[0].scrollTop = offset;
+ }
+ });
+
+ this.$menuInner.on('click', 'li a', function (e) {
+ var $this = $(this),
+ clickedIndex = $this.parent().data('originalIndex'),
+ prevValue = that.$element.val(),
+ prevIndex = that.$element.prop('selectedIndex');
+
+ // Don't close on multi choice menu
+ if (that.multiple) {
+ e.stopPropagation();
+ }
+
+ e.preventDefault();
+
+ //Don't run if we have been disabled
+ if (!that.isDisabled() && !$this.parent().hasClass('disabled')) {
+ var $options = that.$element.find('option'),
+ $option = $options.eq(clickedIndex),
+ state = $option.prop('selected'),
+ $optgroup = $option.parent('optgroup'),
+ maxOptions = that.options.maxOptions,
+ maxOptionsGrp = $optgroup.data('maxOptions') || false;
+
+ if (!that.multiple) { // Deselect all others if not multi select box
+ $options.prop('selected', false);
+ $option.prop('selected', true);
+ that.$menuInner.find('.selected').removeClass('selected');
+ that.setSelected(clickedIndex, true);
+ } else { // Toggle the one we have chosen if we are multi select.
+ $option.prop('selected', !state);
+ that.setSelected(clickedIndex, !state);
+ $this.blur();
+
+ if (maxOptions !== false || maxOptionsGrp !== false) {
+ var maxReached = maxOptions < $options.filter(':selected').length,
+ maxReachedGrp = maxOptionsGrp < $optgroup.find('option:selected').length;
+
+ if ((maxOptions && maxReached) || (maxOptionsGrp && maxReachedGrp)) {
+ if (maxOptions && maxOptions == 1) {
+ $options.prop('selected', false);
+ $option.prop('selected', true);
+ that.$menuInner.find('.selected').removeClass('selected');
+ that.setSelected(clickedIndex, true);
+ } else if (maxOptionsGrp && maxOptionsGrp == 1) {
+ $optgroup.find('option:selected').prop('selected', false);
+ $option.prop('selected', true);
+ var optgroupID = $this.parent().data('optgroup');
+ that.$menuInner.find('[data-optgroup="' + optgroupID + '"]').removeClass('selected');
+ that.setSelected(clickedIndex, true);
+ } else {
+ var maxOptionsArr = (typeof that.options.maxOptionsText === 'function') ?
+ that.options.maxOptionsText(maxOptions, maxOptionsGrp) : that.options.maxOptionsText,
+ maxTxt = maxOptionsArr[0].replace('{n}', maxOptions),
+ maxTxtGrp = maxOptionsArr[1].replace('{n}', maxOptionsGrp),
+ $notify = $('
');
+ // If {var} is set in array, replace it
+ /** @deprecated */
+ if (maxOptionsArr[2]) {
+ maxTxt = maxTxt.replace('{var}', maxOptionsArr[2][maxOptions > 1 ? 0 : 1]);
+ maxTxtGrp = maxTxtGrp.replace('{var}', maxOptionsArr[2][maxOptionsGrp > 1 ? 0 : 1]);
+ }
+
+ $option.prop('selected', false);
+
+ that.$menu.append($notify);
+
+ if (maxOptions && maxReached) {
+ $notify.append($('' + maxTxt + '
'));
+ that.$element.trigger('maxReached.bs.select');
+ }
+
+ if (maxOptionsGrp && maxReachedGrp) {
+ $notify.append($('' + maxTxtGrp + '
'));
+ that.$element.trigger('maxReachedGrp.bs.select');
+ }
+
+ setTimeout(function () {
+ that.setSelected(clickedIndex, false);
+ }, 10);
+
+ $notify.delay(750).fadeOut(300, function () {
+ $(this).remove();
+ });
+ }
+ }
+ }
+ }
+
+ if (!that.multiple) {
+ that.$button.focus();
+ } else if (that.options.liveSearch) {
+ that.$searchbox.focus();
+ }
+
+ // Trigger select 'change'
+ if ((prevValue != that.$element.val() && that.multiple) || (prevIndex != that.$element.prop('selectedIndex') && !that.multiple)) {
+ // $option.prop('selected') is current option state (selected/unselected). state is previous option state.
+ that.$element
+ .trigger('changed.bs.select', [clickedIndex, $option.prop('selected'), state])
+ .triggerNative('change');
+ }
+ }
+ });
+
+ this.$menu.on('click', 'li.disabled a, .popover-title, .popover-title :not(.close)', function (e) {
+ if (e.currentTarget == this) {
+ e.preventDefault();
+ e.stopPropagation();
+ if (that.options.liveSearch && !$(e.target).hasClass('close')) {
+ that.$searchbox.focus();
+ } else {
+ that.$button.focus();
+ }
+ }
+ });
+
+ this.$menuInner.on('click', '.divider, .dropdown-header', function (e) {
+ e.preventDefault();
+ e.stopPropagation();
+ if (that.options.liveSearch) {
+ that.$searchbox.focus();
+ } else {
+ that.$button.focus();
+ }
+ });
+
+ this.$menu.on('click', '.popover-title .close', function () {
+ that.$button.click();
+ });
+
+ this.$searchbox.on('click', function (e) {
+ e.stopPropagation();
+ });
+
+ this.$menu.on('click', '.actions-btn', function (e) {
+ if (that.options.liveSearch) {
+ that.$searchbox.focus();
+ } else {
+ that.$button.focus();
+ }
+
+ e.preventDefault();
+ e.stopPropagation();
+
+ if ($(this).hasClass('bs-select-all')) {
+ that.selectAll();
+ } else {
+ that.deselectAll();
+ }
+ });
+
+ this.$element.change(function () {
+ that.render(false);
+ });
+ },
+
+ liveSearchListener: function () {
+ var that = this,
+ $no_results = $(' ');
+
+ this.$button.on('click.dropdown.data-api touchstart.dropdown.data-api', function () {
+ that.$menuInner.find('.active').removeClass('active');
+ if (!that.$searchbox.val()) {
+ that.$searchbox.val('');
+ that.$lis.not('.is-hidden').removeClass('hidden');
+ if (!$no_results.parent().length) $no_results.remove();
+ }
+ if (!that.multiple) that.$menuInner.find('.selected').addClass('active');
+ setTimeout(function () {
+ that.$searchbox.focus();
+ }, 10);
+ });
+
+ this.$searchbox.on('click.dropdown.data-api focus.dropdown.data-api touchend.dropdown.data-api', function (e) {
+ e.stopPropagation();
+ });
+
+ this.$searchbox.on('input propertychange', function () {
+ if (that.$searchbox.val()) {
+ var $searchBase = that.$lis.not('.is-hidden').removeClass('hidden').children('a');
+ if (that.options.liveSearchNormalize) {
+ $searchBase = $searchBase.not(':a' + that._searchStyle() + '("' + normalizeToBase(that.$searchbox.val()) + '")');
+ } else {
+ $searchBase = $searchBase.not(':' + that._searchStyle() + '("' + that.$searchbox.val() + '")');
+ }
+ $searchBase.parent().addClass('hidden');
+
+ that.$lis.filter('.dropdown-header').each(function () {
+ var $this = $(this),
+ optgroup = $this.data('optgroup');
+
+ if (that.$lis.filter('[data-optgroup=' + optgroup + ']').not($this).not('.hidden').length === 0) {
+ $this.addClass('hidden');
+ that.$lis.filter('[data-optgroup=' + optgroup + 'div]').addClass('hidden');
+ }
+ });
+
+ var $lisVisible = that.$lis.not('.hidden');
+
+ // hide divider if first or last visible, or if followed by another divider
+ $lisVisible.each(function (index) {
+ var $this = $(this);
+
+ if ($this.hasClass('divider') && (
+ $this.index() === $lisVisible.first().index() ||
+ $this.index() === $lisVisible.last().index() ||
+ $lisVisible.eq(index + 1).hasClass('divider'))) {
+ $this.addClass('hidden');
+ }
+ });
+
+ if (!that.$lis.not('.hidden, .no-results').length) {
+ if (!$no_results.parent().length) {
+ $no_results.remove();
+ }
+ $no_results.html(that.options.noneResultsText.replace('{0}', '"' + htmlEscape(that.$searchbox.val()) + '"')).show();
+ that.$menuInner.append($no_results);
+ } else if (!$no_results.parent().length) {
+ $no_results.remove();
+ }
+ } else {
+ that.$lis.not('.is-hidden').removeClass('hidden');
+ if (!$no_results.parent().length) {
+ $no_results.remove();
+ }
+ }
+
+ that.$lis.filter('.active').removeClass('active');
+ if (that.$searchbox.val()) that.$lis.not('.hidden, .divider, .dropdown-header').eq(0).addClass('active').children('a').focus();
+ $(this).focus();
+ });
+ },
+
+ _searchStyle: function () {
+ var styles = {
+ begins: 'ibegins',
+ startsWith: 'ibegins'
+ };
+
+ return styles[this.options.liveSearchStyle] || 'icontains';
+ },
+
+ val: function (value) {
+ if (typeof value !== 'undefined') {
+ this.$element.val(value);
+ this.render();
+
+ return this.$element;
+ } else {
+ return this.$element.val();
+ }
+ },
+
+ changeAll: function (status) {
+ if (typeof status === 'undefined') status = true;
+
+ this.findLis();
+
+ var $options = this.$element.find('option'),
+ $lisVisible = this.$lis.not('.divider, .dropdown-header, .disabled, .hidden').toggleClass('selected', status),
+ lisVisLen = $lisVisible.length,
+ selectedOptions = [];
+
+ for (var i = 0; i < lisVisLen; i++) {
+ var origIndex = $lisVisible[i].getAttribute('data-original-index');
+ selectedOptions[selectedOptions.length] = $options.eq(origIndex)[0];
+ }
+
+ $(selectedOptions).prop('selected', status);
+
+ this.render(false);
+
+ this.$element
+ .trigger('changed.bs.select')
+ .triggerNative('change');
+ },
+
+ selectAll: function () {
+ return this.changeAll(true);
+ },
+
+ deselectAll: function () {
+ return this.changeAll(false);
+ },
+
+ toggle: function (e) {
+ e = e || window.event;
+
+ if (e) e.stopPropagation();
+
+ this.$button.trigger('click');
+ },
+
+ keydown: function (e) {
+ var $this = $(this),
+ $parent = $this.is('input') ? $this.parent().parent() : $this.parent(),
+ $items,
+ that = $parent.data('this'),
+ index,
+ next,
+ first,
+ last,
+ prev,
+ nextPrev,
+ prevIndex,
+ isActive,
+ selector = ':not(.disabled, .hidden, .dropdown-header, .divider)',
+ keyCodeMap = {
+ 32: ' ',
+ 48: '0',
+ 49: '1',
+ 50: '2',
+ 51: '3',
+ 52: '4',
+ 53: '5',
+ 54: '6',
+ 55: '7',
+ 56: '8',
+ 57: '9',
+ 59: ';',
+ 65: 'a',
+ 66: 'b',
+ 67: 'c',
+ 68: 'd',
+ 69: 'e',
+ 70: 'f',
+ 71: 'g',
+ 72: 'h',
+ 73: 'i',
+ 74: 'j',
+ 75: 'k',
+ 76: 'l',
+ 77: 'm',
+ 78: 'n',
+ 79: 'o',
+ 80: 'p',
+ 81: 'q',
+ 82: 'r',
+ 83: 's',
+ 84: 't',
+ 85: 'u',
+ 86: 'v',
+ 87: 'w',
+ 88: 'x',
+ 89: 'y',
+ 90: 'z',
+ 96: '0',
+ 97: '1',
+ 98: '2',
+ 99: '3',
+ 100: '4',
+ 101: '5',
+ 102: '6',
+ 103: '7',
+ 104: '8',
+ 105: '9'
+ };
+
+ if (that.options.liveSearch) $parent = $this.parent().parent();
+
+ if (that.options.container) $parent = that.$menu;
+
+ $items = $('[role=menu] li', $parent);
+
+ isActive = that.$newElement.hasClass('open');
+
+ if (!isActive && (e.keyCode >= 48 && e.keyCode <= 57 || e.keyCode >= 96 && e.keyCode <= 105 || e.keyCode >= 65 && e.keyCode <= 90)) {
+ if (!that.options.container) {
+ that.setSize();
+ that.$menu.parent().addClass('open');
+ isActive = true;
+ } else {
+ that.$button.trigger('click');
+ }
+ that.$searchbox.focus();
+ }
+
+ if (that.options.liveSearch) {
+ if (/(^9$|27)/.test(e.keyCode.toString(10)) && isActive && that.$menu.find('.active').length === 0) {
+ e.preventDefault();
+ that.$menu.parent().removeClass('open');
+ if (that.options.container) that.$newElement.removeClass('open');
+ that.$button.focus();
+ }
+ // $items contains li elements when liveSearch is enabled
+ $items = $('[role=menu] li' + selector, $parent);
+ if (!$this.val() && !/(38|40)/.test(e.keyCode.toString(10))) {
+ if ($items.filter('.active').length === 0) {
+ $items = that.$menuInner.find('li');
+ if (that.options.liveSearchNormalize) {
+ $items = $items.filter(':a' + that._searchStyle() + '(' + normalizeToBase(keyCodeMap[e.keyCode]) + ')');
+ } else {
+ $items = $items.filter(':' + that._searchStyle() + '(' + keyCodeMap[e.keyCode] + ')');
+ }
+ }
+ }
+ }
+
+ if (!$items.length) return;
+
+ if (/(38|40)/.test(e.keyCode.toString(10))) {
+ index = $items.index($items.find('a').filter(':focus').parent());
+ first = $items.filter(selector).first().index();
+ last = $items.filter(selector).last().index();
+ next = $items.eq(index).nextAll(selector).eq(0).index();
+ prev = $items.eq(index).prevAll(selector).eq(0).index();
+ nextPrev = $items.eq(next).prevAll(selector).eq(0).index();
+
+ if (that.options.liveSearch) {
+ $items.each(function (i) {
+ if (!$(this).hasClass('disabled')) {
+ $(this).data('index', i);
+ }
+ });
+ index = $items.index($items.filter('.active'));
+ first = $items.first().data('index');
+ last = $items.last().data('index');
+ next = $items.eq(index).nextAll().eq(0).data('index');
+ prev = $items.eq(index).prevAll().eq(0).data('index');
+ nextPrev = $items.eq(next).prevAll().eq(0).data('index');
+ }
+
+ prevIndex = $this.data('prevIndex');
+
+ if (e.keyCode == 38) {
+ if (that.options.liveSearch) index--;
+ if (index != nextPrev && index > prev) index = prev;
+ if (index < first) index = first;
+ if (index == prevIndex) index = last;
+ } else if (e.keyCode == 40) {
+ if (that.options.liveSearch) index++;
+ if (index == -1) index = 0;
+ if (index != nextPrev && index < next) index = next;
+ if (index > last) index = last;
+ if (index == prevIndex) index = first;
+ }
+
+ $this.data('prevIndex', index);
+
+ if (!that.options.liveSearch) {
+ $items.eq(index).children('a').focus();
+ } else {
+ e.preventDefault();
+ if (!$this.hasClass('dropdown-toggle')) {
+ $items.removeClass('active').eq(index).addClass('active').children('a').focus();
+ $this.focus();
+ }
+ }
+
+ } else if (!$this.is('input')) {
+ var keyIndex = [],
+ count,
+ prevKey;
+
+ $items.each(function () {
+ if (!$(this).hasClass('disabled')) {
+ if ($.trim($(this).children('a').text().toLowerCase()).substring(0, 1) == keyCodeMap[e.keyCode]) {
+ keyIndex.push($(this).index());
+ }
+ }
+ });
+
+ count = $(document).data('keycount');
+ count++;
+ $(document).data('keycount', count);
+
+ prevKey = $.trim($(':focus').text().toLowerCase()).substring(0, 1);
+
+ if (prevKey != keyCodeMap[e.keyCode]) {
+ count = 1;
+ $(document).data('keycount', count);
+ } else if (count >= keyIndex.length) {
+ $(document).data('keycount', 0);
+ if (count > keyIndex.length) count = 1;
+ }
+
+ $items.eq(keyIndex[count - 1]).children('a').focus();
+ }
+
+ // Select focused option if "Enter", "Spacebar" or "Tab" (when selectOnTab is true) are pressed inside the menu.
+ if ((/(13|32)/.test(e.keyCode.toString(10)) || (/(^9$)/.test(e.keyCode.toString(10)) && that.options.selectOnTab)) && isActive) {
+ if (!/(32)/.test(e.keyCode.toString(10))) e.preventDefault();
+ if (!that.options.liveSearch) {
+ var elem = $(':focus');
+ elem.click();
+ // Bring back focus for multiselects
+ elem.focus();
+ // Prevent screen from scrolling if the user hit the spacebar
+ e.preventDefault();
+ // Fixes spacebar selection of dropdown items in FF & IE
+ $(document).data('spaceSelect', true);
+ } else if (!/(32)/.test(e.keyCode.toString(10))) {
+ that.$menuInner.find('.active a').click();
+ $this.focus();
+ }
+ $(document).data('keycount', 0);
+ }
+
+ if ((/(^9$|27)/.test(e.keyCode.toString(10)) && isActive && (that.multiple || that.options.liveSearch)) || (/(27)/.test(e.keyCode.toString(10)) && !isActive)) {
+ that.$menu.parent().removeClass('open');
+ if (that.options.container) that.$newElement.removeClass('open');
+ that.$button.focus();
+ }
+ },
+
+ mobile: function () {
+ this.$element.addClass('mobile-device');
+ },
+
+ refresh: function () {
+ this.$lis = null;
+ this.liObj = {};
+ this.reloadLi();
+ this.render();
+ this.checkDisabled();
+ this.liHeight(true);
+ this.setStyle();
+ this.setWidth();
+ if (this.$lis) this.$searchbox.trigger('propertychange');
+
+ this.$element.trigger('refreshed.bs.select');
+ },
+
+ hide: function () {
+ this.$newElement.hide();
+ },
+
+ show: function () {
+ this.$newElement.show();
+ },
+
+ remove: function () {
+ this.$newElement.remove();
+ this.$element.remove();
+ },
+
+ destroy: function () {
+ this.$newElement.before(this.$element).remove();
+
+ if (this.$bsContainer) {
+ this.$bsContainer.remove();
+ } else {
+ this.$menu.remove();
+ }
+
+ this.$element
+ .off('.bs.select')
+ .removeData('selectpicker')
+ .removeClass('bs-select-hidden selectpicker');
+ }
+ };
+
+ // SELECTPICKER PLUGIN DEFINITION
+ // ==============================
+ function Plugin(option, event) {
+ // get the args of the outer function..
+ var args = arguments;
+ // The arguments of the function are explicitly re-defined from the argument list, because the shift causes them
+ // to get lost/corrupted in android 2.3 and IE9 #715 #775
+ var _option = option,
+ _event = event;
+ [].shift.apply(args);
+
+ var value;
+ var chain = this.each(function () {
+ var $this = $(this);
+ if ($this.is('select')) {
+ var data = $this.data('selectpicker'),
+ options = typeof _option == 'object' && _option;
+
+ if (!data) {
+ var config = $.extend({}, Selectpicker.DEFAULTS, $.fn.selectpicker.defaults || {}, $this.data(), options);
+ config.template = $.extend({}, Selectpicker.DEFAULTS.template, ($.fn.selectpicker.defaults ? $.fn.selectpicker.defaults.template : {}), $this.data().template, options.template);
+ $this.data('selectpicker', (data = new Selectpicker(this, config, _event)));
+ } else if (options) {
+ for (var i in options) {
+ if (Object.getPrototypeOf(options).hasOwnProperty.call(i)) {
+ data.options[i] = options[i];
+ }
+ }
+ }
+
+ if (typeof _option == 'string') {
+ if (data[_option] instanceof Function) {
+ value = data[_option].apply(data, args);
+ } else {
+ value = data.options[_option];
+ }
+ }
+ }
+ });
+
+ if (typeof value !== 'undefined') {
+ //noinspection JSUnusedAssignment
+ return value;
+ } else {
+ return chain;
+ }
+ }
+
+ var old = $.fn.selectpicker;
+ $.fn.selectpicker = Plugin;
+ $.fn.selectpicker.Constructor = Selectpicker;
+
+ // SELECTPICKER NO CONFLICT
+ // ========================
+ $.fn.selectpicker.noConflict = function () {
+ $.fn.selectpicker = old;
+ return this;
+ };
+
+ $(document)
+ .data('keycount', 0)
+ .on('keydown.bs.select', '.bootstrap-select [data-toggle=dropdown], .bootstrap-select [role="menu"], .bs-searchbox input', Selectpicker.prototype.keydown)
+ .on('focusin.modal', '.bootstrap-select [data-toggle=dropdown], .bootstrap-select [role="menu"], .bs-searchbox input', function (e) {
+ e.stopPropagation();
+ });
+
+ // SELECTPICKER DATA-API
+ // =====================
+ $(window).on('load.bs.select.data-api', function () {
+ $('.selectpicker').each(function () {
+ var $selectpicker = $(this);
+ Plugin.call($selectpicker, $selectpicker.data());
+ })
+ });
+ })(jQuery);
+
+
+}));
diff --git a/src/assets/plugins/bootstrap-table/css/bootstrap-table.css b/src/assets/plugins/bootstrap-table/css/bootstrap-table.css
new file mode 100644
index 0000000..49be8b5
--- /dev/null
+++ b/src/assets/plugins/bootstrap-table/css/bootstrap-table.css
@@ -0,0 +1,303 @@
+/**
+ * @author zhixin wen
+ * version: 1.10.1
+ * https://github.com/wenzhixin/bootstrap-table/
+ */
+
+.bootstrap-table .table {
+ margin-bottom: 0 !important;
+ border-bottom: 1px solid #dddddd;
+ border-collapse: collapse !important;
+ border-radius: 1px;
+}
+
+.bootstrap-table .table:not(.table-condensed),
+.bootstrap-table .table:not(.table-condensed)>tbody>tr>th,
+.bootstrap-table .table:not(.table-condensed)>tfoot>tr>th,
+.bootstrap-table .table:not(.table-condensed)>thead>tr>td,
+.bootstrap-table .table:not(.table-condensed)>tbody>tr>td,
+.bootstrap-table .table:not(.table-condensed)>tfoot>tr>td {
+ padding: 8px;
+}
+
+.bootstrap-table .table.table-no-bordered>thead>tr>th,
+.bootstrap-table .table.table-no-bordered>tbody>tr>td {
+ border-right: 2px solid transparent;
+}
+
+.fixed-table-container {
+ position: relative;
+ clear: both;
+ border: 1px solid #dddddd;
+ border-radius: 4px;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+}
+
+.fixed-table-container.table-no-bordered {
+ border: 1px solid transparent;
+}
+
+.fixed-table-footer,
+.fixed-table-header {
+ overflow: hidden;
+}
+
+.fixed-table-footer {
+ border-top: 1px solid #dddddd;
+}
+
+.fixed-table-body {
+ overflow-x: auto;
+ overflow-y: auto;
+ height: 100%;
+}
+
+.fixed-table-container table {
+ width: 100%;
+}
+
+.fixed-table-container thead th {
+ height: 0;
+ padding: 0;
+ margin: 0;
+ border-left: 1px solid #dddddd;
+}
+
+.fixed-table-container thead th:focus {
+ outline: 0 solid transparent;
+}
+
+.fixed-table-container thead th:first-child {
+ border-left: none;
+ border-top-left-radius: 4px;
+ -webkit-border-top-left-radius: 4px;
+ -moz-border-radius-topleft: 4px;
+}
+
+.fixed-table-container thead th .th-inner,
+.fixed-table-container tbody td .th-inner {
+ padding: 8px;
+ line-height: 24px;
+ vertical-align: top;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.fixed-table-container thead th .sortable {
+ cursor: pointer;
+ background-position: right;
+ background-repeat: no-repeat;
+ padding-right: 30px;
+}
+
+.fixed-table-container thead th .both {
+ background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAkElEQVQoz7X QMQ5AQBCF4dWQSJxC5wwax1Cq1e7BAdxD5SL+Tq/QCM1oNiJidwox0355mXnG/DrEtIQ6azioNZQxI0ykPhTQIwhCR+BmBYtlK7kLJYwWCcJA9M4qdrZrd8pPjZWPtOqdRQy320YSV17OatFC4euts6z39GYMKRPCTKY9UnPQ6P+GtMRfGtPnBCiqhAeJPmkqAAAAAElFTkSuQmCC');
+}
+
+.fixed-table-container thead th .asc {
+ background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZ0lEQVQ4y2NgGLKgquEuFxBPAGI2ahhWCsS/gDibUoO0gPgxEP8H4ttArEyuQYxAPBdqEAxPBImTY5gjEL9DM+wTENuQahAvEO9DMwiGdwAxOymGJQLxTyD+jgWDxCMZRsEoGAVoAADeemwtPcZI2wAAAABJRU5ErkJggg==');
+}
+
+.fixed-table-container thead th .desc {
+ background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZUlEQVQ4y2NgGAWjYBSggaqGu5FA/BOIv2PBIPFEUgxjB+IdQPwfC94HxLykus4GiD+hGfQOiB3J8SojEE9EM2wuSJzcsFMG4ttQgx4DsRalkZENxL+AuJQaMcsGxBOAmGvopk8AVz1sLZgg0bsAAAAASUVORK5CYII= ');
+}
+
+.fixed-table-container th.detail {
+ width: 30px;
+}
+
+.fixed-table-container tbody td {
+ border-left: 1px solid #dddddd;
+}
+
+.fixed-table-container tbody tr:first-child td {
+ border-top: none;
+}
+
+.fixed-table-container tbody td:first-child {
+ border-left: none;
+}
+
+/* the same color with .active */
+.fixed-table-container tbody .selected td {
+ background-color: #f5f5f5;
+}
+
+.fixed-table-container .bs-checkbox {
+ text-align: center;
+}
+
+.fixed-table-container .bs-checkbox .th-inner {
+ padding: 8px 0;
+}
+
+.fixed-table-container input[type="radio"],
+.fixed-table-container input[type="checkbox"] {
+ margin: 0 auto !important;
+}
+
+.fixed-table-container .no-records-found {
+ text-align: center;
+}
+
+.fixed-table-pagination div.pagination,
+.fixed-table-pagination .pagination-detail {
+ margin-top: 10px;
+ margin-bottom: 10px;
+}
+
+.fixed-table-pagination div.pagination .pagination {
+ margin: 0;
+}
+
+.fixed-table-pagination .pagination a {
+ padding: 6px 12px;
+ line-height: 1.428571429;
+}
+
+.fixed-table-pagination .pagination-info {
+ line-height: 34px;
+ margin-right: 5px;
+}
+
+.fixed-table-pagination .btn-group {
+ position: relative;
+ display: inline-block;
+ vertical-align: middle;
+}
+
+.fixed-table-pagination .dropup .dropdown-menu {
+ margin-bottom: 0;
+}
+
+.fixed-table-pagination .page-list {
+ display: inline-block;
+}
+
+.fixed-table-toolbar .columns-left {
+ margin-right: 5px;
+}
+
+.fixed-table-toolbar .columns-right {
+ margin-left: 5px;
+}
+
+.fixed-table-toolbar .columns label {
+ display: block;
+ padding: 3px 20px;
+ clear: both;
+ font-weight: normal;
+ line-height: 1.428571429;
+}
+
+.fixed-table-toolbar .bars,
+.fixed-table-toolbar .search,
+.fixed-table-toolbar .columns {
+ position: relative;
+ margin-top: 10px;
+ margin-bottom: 10px;
+ line-height: 34px;
+}
+
+.fixed-table-pagination li.disabled a {
+ pointer-events: none;
+ cursor: default;
+}
+
+.fixed-table-loading {
+ display: none;
+ position: absolute;
+ top: 42px;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 99;
+ background-color: #fff;
+ text-align: center;
+}
+
+.fixed-table-body .card-view .title {
+ font-weight: bold;
+ display: inline-block;
+ min-width: 30%;
+ text-align: left !important;
+}
+
+/* support bootstrap 2 */
+.fixed-table-body thead th .th-inner {
+ box-sizing: border-box;
+}
+
+.table th,
+.table td {
+ vertical-align: middle;
+ box-sizing: border-box;
+}
+
+.fixed-table-toolbar .dropdown-menu {
+ text-align: left;
+ max-height: 300px;
+ overflow: auto;
+}
+
+.fixed-table-toolbar .btn-group>.btn-group {
+ display: inline-block;
+ margin-left: -1px !important;
+}
+
+.fixed-table-toolbar .btn-group>.btn-group>.btn {
+ border-radius: 0;
+}
+
+.fixed-table-toolbar .btn-group>.btn-group:first-child>.btn {
+ border-top-left-radius: 4px;
+ border-bottom-left-radius: 4px;
+}
+
+.fixed-table-toolbar .btn-group>.btn-group:last-child>.btn {
+ border-top-right-radius: 4px;
+ border-bottom-right-radius: 4px;
+}
+
+.bootstrap-table .table>thead>tr>th {
+ vertical-align: bottom;
+ border-bottom: 1px solid #ddd;
+}
+
+/* support bootstrap 3 */
+.bootstrap-table .table thead>tr>th {
+ padding: 0;
+ margin: 0;
+}
+
+.bootstrap-table .fixed-table-footer tbody>tr>td {
+ padding: 0 !important;
+}
+
+.bootstrap-table .fixed-table-footer .table {
+ border-bottom: none;
+ border-radius: 0;
+ padding: 0 !important;
+}
+
+.pull-right .dropdown-menu {
+ right: 0;
+ left: auto;
+}
+
+/* calculate scrollbar width */
+p.fixed-table-scroll-inner {
+ width: 100%;
+ height: 200px;
+}
+
+div.fixed-table-scroll-outer {
+ top: 0;
+ left: 0;
+ visibility: hidden;
+ width: 200px;
+ height: 150px;
+ overflow: hidden;
+}
\ No newline at end of file
diff --git a/src/assets/plugins/bootstrap-table/js/bootstrap-table.js b/src/assets/plugins/bootstrap-table/js/bootstrap-table.js
new file mode 100644
index 0000000..3986ec6
--- /dev/null
+++ b/src/assets/plugins/bootstrap-table/js/bootstrap-table.js
@@ -0,0 +1,2823 @@
+/**
+ * @author zhixin wen
+ * version: 1.10.1
+ * https://github.com/wenzhixin/bootstrap-table/
+ */
+
+(function (root, factory) {
+ var define;
+ if (typeof define === 'function' && define.amd) {
+ // AMD. Register as an anonymous module unless amdModuleId is set
+ define(["jquery"], function (a0) {
+ return (factory(a0));
+ });
+ } else if (typeof exports === 'object') {
+ // Node. Does not work with strict CommonJS, but
+ // only CommonJS-like environments that support module.exports,
+ // like Node.
+ module.exports = factory(require("jquery"));
+ } else {
+ factory(jQuery);
+ }
+}(this, function (jQuery) {
+
+ !function ($) {
+ 'use strict';
+
+ // TOOLS DEFINITION
+ // ======================
+
+ var cachedWidth = null;
+
+ // it only does '%s', and return '' when arguments are undefined
+ var sprintf = function (str) {
+ var args = arguments,
+ flag = true,
+ i = 1;
+
+ str = str.replace(/%s/g, function () {
+ var arg = args[i++];
+
+ if (typeof arg === 'undefined') {
+ flag = false;
+ return '';
+ }
+ return arg;
+ });
+ return flag ? str : '';
+ };
+
+ var getPropertyFromOther = function (list, from, to, value) {
+ var result = '';
+ $.each(list, function (i, item) {
+ if (item[from] === value) {
+ result = item[to];
+ return false;
+ }
+ return true;
+ });
+ return result;
+ };
+
+ var getFieldIndex = function (columns, field) {
+ var index = -1;
+
+ $.each(columns, function (i, column) {
+ if (column.field === field) {
+ index = i;
+ return false;
+ }
+ return true;
+ });
+ return index;
+ };
+
+ // http://jsfiddle.net/wenyi/47nz7ez9/3/
+ var setFieldIndex = function (columns) {
+ var i, j, k,
+ totalCol = 0,
+ flag = [];
+
+ for (i = 0; i < columns[0].length; i++) {
+ totalCol += columns[0][i].colspan || 1;
+ }
+
+ for (i = 0; i < columns.length; i++) {
+ flag[i] = [];
+ for (j = 0; j < totalCol; j++) {
+ flag[i][j] = false;
+ }
+ }
+
+ for (i = 0; i < columns.length; i++) {
+ for (j = 0; j < columns[i].length; j++) {
+ var r = columns[i][j],
+ rowspan = r.rowspan || 1,
+ colspan = r.colspan || 1,
+ index = $.inArray(false, flag[i]);
+
+ if (colspan === 1) {
+ r.fieldIndex = index;
+ // when field is undefined, use index instead
+ if (typeof r.field === 'undefined') {
+ r.field = index;
+ }
+ }
+
+ for (k = 0; k < rowspan; k++) {
+ flag[i + k][index] = true;
+ }
+ for (k = 0; k < colspan; k++) {
+ flag[i][index + k] = true;
+ }
+ }
+ }
+ };
+
+ var getScrollBarWidth = function () {
+ if (cachedWidth === null) {
+ var inner = $('
').addClass('fixed-table-scroll-inner'),
+ outer = $('
').addClass('fixed-table-scroll-outer'),
+ w1, w2;
+
+ outer.append(inner);
+ $('body').append(outer);
+
+ w1 = inner[0].offsetWidth;
+ outer.css('overflow', 'scroll');
+ w2 = inner[0].offsetWidth;
+
+ if (w1 === w2) {
+ w2 = outer[0].clientWidth;
+ }
+
+ outer.remove();
+ cachedWidth = w1 - w2;
+ }
+ return cachedWidth;
+ };
+
+ var calculateObjectValue = function (self, name, args, defaultValue) {
+ var func = name;
+
+ if (typeof name === 'string') {
+ // support obj.func1.func2
+ var names = name.split('.');
+
+ if (names.length > 1) {
+ func = window;
+ $.each(names, function (i, f) {
+ func = func[f];
+ });
+ } else {
+ func = window[name];
+ }
+ }
+ if (typeof func === 'object') {
+ return func;
+ }
+ if (typeof func === 'function') {
+ return func.apply(self, args);
+ }
+ if (!func && typeof name === 'string' && sprintf.apply(this, [name].concat(args))) {
+ return sprintf.apply(this, [name].concat(args));
+ }
+ return defaultValue;
+ };
+
+ var compareObjects = function (objectA, objectB, compareLength) {
+ // Create arrays of property names
+ var objectAProperties = Object.getOwnPropertyNames(objectA),
+ objectBProperties = Object.getOwnPropertyNames(objectB),
+ propName = '';
+
+ if (compareLength) {
+ // If number of properties is different, objects are not equivalent
+ if (objectAProperties.length !== objectBProperties.length) {
+ return false;
+ }
+ }
+
+ for (var i = 0; i < objectAProperties.length; i++) {
+ propName = objectAProperties[i];
+
+ // If the property is not in the object B properties, continue with the next property
+ if ($.inArray(propName, objectBProperties) > -1) {
+ // If values of same property are not equal, objects are not equivalent
+ if (objectA[propName] !== objectB[propName]) {
+ return false;
+ }
+ }
+ }
+
+ // If we made it this far, objects are considered equivalent
+ return true;
+ };
+
+ var escapeHTML = function (text) {
+ if (typeof text === 'string') {
+ return text
+ .replace(/&/g, '&')
+ .replace(//g, '>')
+ .replace(/"/g, '"')
+ .replace(/'/g, ''')
+ .replace(/`/g, '`');
+ }
+ return text;
+ };
+
+ var getRealHeight = function ($el) {
+ var height = 0;
+ $el.children().each(function () {
+ if (height < $(this).outerHeight(true)) {
+ height = $(this).outerHeight(true);
+ }
+ });
+ return height;
+ };
+
+ var getRealDataAttr = function (dataAttr) {
+ for (var attr in dataAttr) {
+ var auxAttr = attr.split(/(?=[A-Z])/).join('-').toLowerCase();
+ if (auxAttr !== attr) {
+ dataAttr[auxAttr] = dataAttr[attr];
+ delete dataAttr[attr];
+ }
+ }
+
+ return dataAttr;
+ };
+
+ var getItemField = function (item, field, escape) {
+ var value = item;
+
+ if (typeof field !== 'string' || Object.prototype.hasOwnProperty.call(item, field)) {
+ return escape ? escapeHTML(item[field]) : item[field];
+ }
+ var props = field.split('.');
+ for (var p in props) {
+ value = value && value[props[p]];
+ }
+ return escape ? escapeHTML(value) : value;
+ };
+
+ var isIEBrowser = function () {
+ return !!(navigator.userAgent.indexOf("MSIE ") > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./));
+ };
+
+ // BOOTSTRAP TABLE CLASS DEFINITION
+ // ======================
+
+ var BootstrapTable = function (el, options) {
+ this.options = options;
+ this.$el = $(el);
+ this.$el_ = this.$el.clone();
+ this.timeoutId_ = 0;
+ this.timeoutFooter_ = 0;
+
+ this.init();
+ };
+
+ BootstrapTable.DEFAULTS = {
+ classes: 'table table-hover',
+ locale: undefined,
+ height: undefined,
+ undefinedText: '-',
+ sortName: undefined,
+ sortOrder: 'asc',
+ striped: false,
+ columns: [[]],
+ data: [],
+ dataField: 'rows',
+ method: 'get',
+ url: undefined,
+ ajax: undefined,
+ cache: true,
+ contentType: 'application/json',
+ dataType: 'json',
+ ajaxOptions: {},
+ queryParams: function (params) {
+ return params;
+ },
+ queryParamsType: 'limit', // undefined
+ responseHandler: function (res) {
+ return res;
+ },
+ pagination: false,
+ onlyInfoPagination: false,
+ sidePagination: 'client', // client or server
+ totalRows: 0, // server side need to set
+ pageNumber: 1,
+ pageSize: 10,
+ pageList: [10, 25, 50, 100],
+ paginationHAlign: 'right', //right, left
+ paginationVAlign: 'bottom', //bottom, top, both
+ paginationDetailHAlign: 'left', //right, left
+ paginationPreText: '‹',
+ paginationNextText: '›',
+ search: false,
+ searchOnEnterKey: false,
+ strictSearch: false,
+ searchAlign: 'right',
+ selectItemName: 'btSelectItem',
+ showHeader: true,
+ showFooter: false,
+ showColumns: false,
+ showPaginationSwitch: false,
+ showRefresh: false,
+ showToggle: false,
+ buttonsAlign: 'right',
+ smartDisplay: true,
+ escape: false,
+ minimumCountColumns: 1,
+ idField: undefined,
+ uniqueId: undefined,
+ cardView: false,
+ detailView: false,
+ detailFormatter: function (index, row) {
+ return '';
+ },
+ trimOnSearch: true,
+ clickToSelect: false,
+ singleSelect: false,
+ toolbar: undefined,
+ toolbarAlign: 'left',
+ checkboxHeader: true,
+ sortable: true,
+ silentSort: true,
+ maintainSelected: false,
+ searchTimeOut: 500,
+ searchText: '',
+ iconSize: undefined,
+ iconsPrefix: 'glyphicon', // glyphicon of fa (font awesome)
+ icons: {
+ paginationSwitchDown: 'glyphicon-collapse-down icon-chevron-down',
+ paginationSwitchUp: 'glyphicon-collapse-up icon-chevron-up',
+ refresh: 'glyphicon-refresh icon-refresh',
+ toggle: 'glyphicon-list-alt icon-list-alt',
+ columns: 'glyphicon-th icon-th',
+ detailOpen: 'glyphicon-plus icon-plus',
+ detailClose: 'glyphicon-minus icon-minus'
+ },
+
+ rowStyle: function (row, index) {
+ return {};
+ },
+
+ rowAttributes: function (row, index) {
+ return {};
+ },
+
+ onAll: function (name, args) {
+ return false;
+ },
+ onClickCell: function (field, value, row, $element) {
+ return false;
+ },
+ onDblClickCell: function (field, value, row, $element) {
+ return false;
+ },
+ onClickRow: function (item, $element) {
+ return false;
+ },
+ onDblClickRow: function (item, $element) {
+ return false;
+ },
+ onSort: function (name, order) {
+ return false;
+ },
+ onCheck: function (row) {
+ return false;
+ },
+ onUncheck: function (row) {
+ return false;
+ },
+ onCheckAll: function (rows) {
+ return false;
+ },
+ onUncheckAll: function (rows) {
+ return false;
+ },
+ onCheckSome: function (rows) {
+ return false;
+ },
+ onUncheckSome: function (rows) {
+ return false;
+ },
+ onLoadSuccess: function (data) {
+ return false;
+ },
+ onLoadError: function (status) {
+ return false;
+ },
+ onColumnSwitch: function (field, checked) {
+ return false;
+ },
+ onPageChange: function (number, size) {
+ return false;
+ },
+ onSearch: function (text) {
+ return false;
+ },
+ onToggle: function (cardView) {
+ return false;
+ },
+ onPreBody: function (data) {
+ return false;
+ },
+ onPostBody: function () {
+ return false;
+ },
+ onPostHeader: function () {
+ return false;
+ },
+ onExpandRow: function (index, row, $detail) {
+ return false;
+ },
+ onCollapseRow: function (index, row) {
+ return false;
+ },
+ onRefreshOptions: function (options) {
+ return false;
+ },
+ onResetView: function () {
+ return false;
+ }
+ };
+
+ BootstrapTable.LOCALES = [];
+
+ BootstrapTable.LOCALES['en-US'] = BootstrapTable.LOCALES['en'] = {
+ formatLoadingMessage: function () {
+ return 'Loading, please wait...';
+ },
+ formatRecordsPerPage: function (pageNumber) {
+ return sprintf('%s records per page', pageNumber);
+ },
+ formatShowingRows: function (pageFrom, pageTo, totalRows) {
+ return sprintf('Showing %s to %s of %s rows', pageFrom, pageTo, totalRows);
+ },
+ formatDetailPagination: function (totalRows) {
+ return sprintf('Showing %s rows', totalRows);
+ },
+ formatSearch: function () {
+ return 'Search';
+ },
+ formatNoMatches: function () {
+ return 'No matching records found';
+ },
+ formatPaginationSwitch: function () {
+ return 'Hide/Show pagination';
+ },
+ formatRefresh: function () {
+ return 'Refresh';
+ },
+ formatToggle: function () {
+ return 'Toggle';
+ },
+ formatColumns: function () {
+ return 'Columns';
+ },
+ formatAllRows: function () {
+ return 'All';
+ }
+ };
+
+ $.extend(BootstrapTable.DEFAULTS, BootstrapTable.LOCALES['en-US']);
+
+ BootstrapTable.COLUMN_DEFAULTS = {
+ radio: false,
+ checkbox: false,
+ checkboxEnabled: true,
+ field: undefined,
+ title: undefined,
+ titleTooltip: undefined,
+ 'class': undefined,
+ align: undefined, // left, right, center
+ halign: undefined, // left, right, center
+ falign: undefined, // left, right, center
+ valign: undefined, // top, middle, bottom
+ width: undefined,
+ sortable: false,
+ order: 'asc', // asc, desc
+ visible: true,
+ switchable: true,
+ clickToSelect: true,
+ formatter: undefined,
+ footerFormatter: undefined,
+ events: undefined,
+ sorter: undefined,
+ sortName: undefined,
+ cellStyle: undefined,
+ searchable: true,
+ searchFormatter: true,
+ cardVisible: true
+ };
+
+ BootstrapTable.EVENTS = {
+ 'all.bs.table': 'onAll',
+ 'click-cell.bs.table': 'onClickCell',
+ 'dbl-click-cell.bs.table': 'onDblClickCell',
+ 'click-row.bs.table': 'onClickRow',
+ 'dbl-click-row.bs.table': 'onDblClickRow',
+ 'sort.bs.table': 'onSort',
+ 'check.bs.table': 'onCheck',
+ 'uncheck.bs.table': 'onUncheck',
+ 'check-all.bs.table': 'onCheckAll',
+ 'uncheck-all.bs.table': 'onUncheckAll',
+ 'check-some.bs.table': 'onCheckSome',
+ 'uncheck-some.bs.table': 'onUncheckSome',
+ 'load-success.bs.table': 'onLoadSuccess',
+ 'load-error.bs.table': 'onLoadError',
+ 'column-switch.bs.table': 'onColumnSwitch',
+ 'page-change.bs.table': 'onPageChange',
+ 'search.bs.table': 'onSearch',
+ 'toggle.bs.table': 'onToggle',
+ 'pre-body.bs.table': 'onPreBody',
+ 'post-body.bs.table': 'onPostBody',
+ 'post-header.bs.table': 'onPostHeader',
+ 'expand-row.bs.table': 'onExpandRow',
+ 'collapse-row.bs.table': 'onCollapseRow',
+ 'refresh-options.bs.table': 'onRefreshOptions',
+ 'reset-view.bs.table': 'onResetView'
+ };
+
+ BootstrapTable.prototype.init = function () {
+ this.initLocale();
+ this.initContainer();
+ this.initTable();
+ this.initHeader();
+ this.initData();
+ this.initFooter();
+ this.initToolbar();
+ this.initPagination();
+ this.initBody();
+ this.initSearchText();
+ this.initServer();
+ };
+
+ BootstrapTable.prototype.initLocale = function () {
+ if (this.options.locale) {
+ var parts = this.options.locale.split(/-|_/);
+ parts[0].toLowerCase();
+ parts[1] && parts[1].toUpperCase();
+ if ($.fn.bootstrapTable.locales[this.options.locale]) {
+ // locale as requested
+ $.extend(this.options, $.fn.bootstrapTable.locales[this.options.locale]);
+ } else if ($.fn.bootstrapTable.locales[parts.join('-')]) {
+ // locale with sep set to - (in case original was specified with _)
+ $.extend(this.options, $.fn.bootstrapTable.locales[parts.join('-')]);
+ } else if ($.fn.bootstrapTable.locales[parts[0]]) {
+ // short locale language code (i.e. 'en')
+ $.extend(this.options, $.fn.bootstrapTable.locales[parts[0]]);
+ }
+ }
+ };
+
+ BootstrapTable.prototype.initContainer = function () {
+ this.$container = $([
+ '',
+ '
',
+ this.options.paginationVAlign === 'top' || this.options.paginationVAlign === 'both' ?
+ '' :
+ '',
+ '
',
+ '',
+ '
',
+ '
',
+ this.options.formatLoadingMessage(),
+ '
',
+ '
',
+ '',
+ this.options.paginationVAlign === 'bottom' || this.options.paginationVAlign === 'both' ?
+ '' :
+ '',
+ '
',
+ '
'
+ ].join(''));
+
+ this.$container.insertAfter(this.$el);
+ this.$tableContainer = this.$container.find('.fixed-table-container');
+ this.$tableHeader = this.$container.find('.fixed-table-header');
+ this.$tableBody = this.$container.find('.fixed-table-body');
+ this.$tableLoading = this.$container.find('.fixed-table-loading');
+ this.$tableFooter = this.$container.find('.fixed-table-footer');
+ this.$toolbar = this.$container.find('.fixed-table-toolbar');
+ this.$pagination = this.$container.find('.fixed-table-pagination');
+
+ this.$tableBody.append(this.$el);
+ this.$container.after('
');
+
+ this.$el.addClass(this.options.classes);
+ if (this.options.striped) {
+ this.$el.addClass('table-striped');
+ }
+ if ($.inArray('table-no-bordered', this.options.classes.split(' ')) !== -1) {
+ this.$tableContainer.addClass('table-no-bordered');
+ }
+ };
+
+ BootstrapTable.prototype.initTable = function () {
+ var that = this,
+ columns = [],
+ data = [];
+
+ this.$header = this.$el.find('>thead');
+ if (!this.$header.length) {
+ this.$header = $(' ').appendTo(this.$el);
+ }
+ this.$header.find('tr').each(function () {
+ var column = [];
+
+ $(this).find('th').each(function () {
+ column.push($.extend({}, {
+ title: $(this).html(),
+ 'class': $(this).attr('class'),
+ titleTooltip: $(this).attr('title'),
+ rowspan: $(this).attr('rowspan') ? +$(this).attr('rowspan') : undefined,
+ colspan: $(this).attr('colspan') ? +$(this).attr('colspan') : undefined
+ }, $(this).data()));
+ });
+ columns.push(column);
+ });
+ if (!$.isArray(this.options.columns[0])) {
+ this.options.columns = [this.options.columns];
+ }
+ this.options.columns = $.extend(true, [], columns, this.options.columns);
+ this.columns = [];
+
+ setFieldIndex(this.options.columns);
+ $.each(this.options.columns, function (i, columns) {
+ $.each(columns, function (j, column) {
+ column = $.extend({}, BootstrapTable.COLUMN_DEFAULTS, column);
+
+ if (typeof column.fieldIndex !== 'undefined') {
+ that.columns[column.fieldIndex] = column;
+ }
+
+ that.options.columns[i][j] = column;
+ });
+ });
+
+ // if options.data is setting, do not process tbody data
+ if (this.options.data.length) {
+ return;
+ }
+
+ this.$el.find('>tbody>tr').each(function () {
+ var row = {};
+
+ // save tr's id, class and data-* attributes
+ row._id = $(this).attr('id');
+ row._class = $(this).attr('class');
+ row._data = getRealDataAttr($(this).data());
+
+ $(this).find('td').each(function (i) {
+ var field = that.columns[i].field;
+
+ row[field] = $(this).html();
+ // save td's id, class and data-* attributes
+ row['_' + field + '_id'] = $(this).attr('id');
+ row['_' + field + '_class'] = $(this).attr('class');
+ row['_' + field + '_rowspan'] = $(this).attr('rowspan');
+ row['_' + field + '_title'] = $(this).attr('title');
+ row['_' + field + '_data'] = getRealDataAttr($(this).data());
+ });
+ data.push(row);
+ });
+ this.options.data = data;
+ };
+
+ BootstrapTable.prototype.initHeader = function () {
+ var that = this,
+ visibleColumns = {},
+ html = [];
+
+ this.header = {
+ fields: [],
+ styles: [],
+ classes: [],
+ formatters: [],
+ events: [],
+ sorters: [],
+ sortNames: [],
+ cellStyles: [],
+ searchables: []
+ };
+
+ $.each(this.options.columns, function (i, columns) {
+ html.push('');
+
+ if (i == 0 && !that.options.cardView && that.options.detailView) {
+ html.push(sprintf('
',
+ that.options.columns.length));
+ }
+
+ $.each(columns, function (j, column) {
+ var text = '',
+ halign = '', // header align style
+ align = '', // body align style
+ style = '',
+ class_ = sprintf(' class="%s"', column['class']),
+ order = that.options.sortOrder || column.order,
+ unitWidth = 'px',
+ width = column.width;
+
+ if (column.width !== undefined && (!that.options.cardView)) {
+ if (typeof column.width === 'string') {
+ if (column.width.indexOf('%') !== -1) {
+ unitWidth = '%';
+ }
+ }
+ }
+ if (column.width && typeof column.width === 'string') {
+ width = column.width.replace('%', '').replace('px', '');
+ }
+
+ halign = sprintf('text-align: %s; ', column.halign ? column.halign : column.align);
+ align = sprintf('text-align: %s; ', column.align);
+ style = sprintf('vertical-align: %s; ', column.valign);
+ style += sprintf('width: %s; ', (column.checkbox || column.radio) && !width ?
+ '36px' : (width ? width + unitWidth : undefined));
+
+ if (typeof column.fieldIndex !== 'undefined') {
+ that.header.fields[column.fieldIndex] = column.field;
+ that.header.styles[column.fieldIndex] = align + style;
+ that.header.classes[column.fieldIndex] = class_;
+ that.header.formatters[column.fieldIndex] = column.formatter;
+ that.header.events[column.fieldIndex] = column.events;
+ that.header.sorters[column.fieldIndex] = column.sorter;
+ that.header.sortNames[column.fieldIndex] = column.sortName;
+ that.header.cellStyles[column.fieldIndex] = column.cellStyle;
+ that.header.searchables[column.fieldIndex] = column.searchable;
+
+ if (!column.visible) {
+ return;
+ }
+
+ if (that.options.cardView && (!column.cardVisible)) {
+ return;
+ }
+
+ visibleColumns[column.field] = column;
+ }
+
+ html.push('');
+
+ html.push(sprintf('', that.options.sortable && column.sortable ?
+ 'sortable both' : ''));
+
+ text = column.title;
+
+ if (column.checkbox) {
+ if (!that.options.singleSelect && that.options.checkboxHeader) {
+ text = ' ';
+ }
+ that.header.stateField = column.field;
+ }
+ if (column.radio) {
+ text = '';
+ that.header.stateField = column.field;
+ that.options.singleSelect = true;
+ }
+
+ html.push(text);
+ html.push('
');
+ html.push('
');
+ html.push('');
+ html.push(' ');
+ });
+ html.push(' ');
+ });
+
+ this.$header.html(html.join(''));
+ this.$header.find('th[data-field]').each(function (i) {
+ $(this).data(visibleColumns[$(this).data('field')]);
+ });
+ this.$container.off('click', '.th-inner').on('click', '.th-inner', function (event) {
+ var target = $(this);
+ if (target.closest('.bootstrap-table')[0] !== that.$container[0])
+ return false;
+
+ if (that.options.sortable && target.parent().data().sortable) {
+ that.onSort(event);
+ }
+ });
+
+ this.$header.children().children().off('keypress').on('keypress', function (event) {
+ if (that.options.sortable && $(this).data().sortable) {
+ var code = event.keyCode || event.which;
+ if (code == 13) { //Enter keycode
+ that.onSort(event);
+ }
+ }
+ });
+
+ if (!this.options.showHeader || this.options.cardView) {
+ this.$header.hide();
+ this.$tableHeader.hide();
+ this.$tableLoading.css('top', 0);
+ } else {
+ this.$header.show();
+ this.$tableHeader.show();
+ this.$tableLoading.css('top', this.$header.outerHeight() + 1);
+ // Assign the correct sortable arrow
+ this.getCaret();
+ }
+
+ this.$selectAll = this.$header.find('[name="btSelectAll"]');
+ this.$selectAll.off('click').on('click', function () {
+ var checked = $(this).prop('checked');
+ that[checked ? 'checkAll' : 'uncheckAll']();
+ that.updateSelected();
+ });
+ };
+
+ BootstrapTable.prototype.initFooter = function () {
+ if (!this.options.showFooter || this.options.cardView) {
+ this.$tableFooter.hide();
+ } else {
+ this.$tableFooter.show();
+ }
+ };
+
+ /**
+ * @param data
+ * @param type: append / prepend
+ */
+ BootstrapTable.prototype.initData = function (data, type) {
+ if (type === 'append') {
+ this.data = this.data.concat(data);
+ } else if (type === 'prepend') {
+ this.data = [].concat(data).concat(this.data);
+ } else {
+ this.data = data || this.options.data;
+ }
+
+ // Fix #839 Records deleted when adding new row on filtered table
+ if (type === 'append') {
+ this.options.data = this.options.data.concat(data);
+ } else if (type === 'prepend') {
+ this.options.data = [].concat(data).concat(this.options.data);
+ } else {
+ this.options.data = this.data;
+ }
+
+ if (this.options.sidePagination === 'server') {
+ return;
+ }
+ this.initSort();
+ };
+
+ BootstrapTable.prototype.initSort = function () {
+ var that = this,
+ name = this.options.sortName,
+ order = this.options.sortOrder === 'desc' ? -1 : 1,
+ index = $.inArray(this.options.sortName, this.header.fields);
+
+ if (index !== -1) {
+ this.data.sort(function (a, b) {
+ if (that.header.sortNames[index]) {
+ name = that.header.sortNames[index];
+ }
+ var aa = getItemField(a, name, that.options.escape),
+ bb = getItemField(b, name, that.options.escape),
+ value = calculateObjectValue(that.header, that.header.sorters[index], [aa, bb]);
+
+ if (value !== undefined) {
+ return order * value;
+ }
+
+ // Fix #161: undefined or null string sort bug.
+ if (aa === undefined || aa === null) {
+ aa = '';
+ }
+ if (bb === undefined || bb === null) {
+ bb = '';
+ }
+
+ // IF both values are numeric, do a numeric comparison
+ if ($.isNumeric(aa) && $.isNumeric(bb)) {
+ // Convert numerical values form string to float.
+ aa = parseFloat(aa);
+ bb = parseFloat(bb);
+ if (aa < bb) {
+ return order * -1;
+ }
+ return order;
+ }
+
+ if (aa === bb) {
+ return 0;
+ }
+
+ // If value is not a string, convert to string
+ if (typeof aa !== 'string') {
+ aa = aa.toString();
+ }
+
+ if (aa.localeCompare(bb) === -1) {
+ return order * -1;
+ }
+
+ return order;
+ });
+ }
+ };
+
+ BootstrapTable.prototype.onSort = function (event) {
+ var $this = event.type === "keypress" ? $(event.currentTarget) : $(event.currentTarget).parent(),
+ $this_ = this.$header.find('th').eq($this.index());
+
+ this.$header.add(this.$header_).find('span.order').remove();
+
+ if (this.options.sortName === $this.data('field')) {
+ this.options.sortOrder = this.options.sortOrder === 'asc' ? 'desc' : 'asc';
+ } else {
+ this.options.sortName = $this.data('field');
+ this.options.sortOrder = $this.data('order') === 'asc' ? 'desc' : 'asc';
+ }
+ this.trigger('sort', this.options.sortName, this.options.sortOrder);
+
+ $this.add($this_).data('order', this.options.sortOrder);
+
+ // Assign the correct sortable arrow
+ this.getCaret();
+
+ if (this.options.sidePagination === 'server') {
+ this.initServer(this.options.silentSort);
+ return;
+ }
+
+ this.initSort();
+ this.initBody();
+ };
+
+ BootstrapTable.prototype.initToolbar = function () {
+ var that = this,
+ html = [],
+ timeoutId = 0,
+ $keepOpen,
+ $search,
+ switchableCount = 0;
+
+ if (this.$toolbar.find('.bars').children().length) {
+ $('body').append($(this.options.toolbar));
+ }
+ this.$toolbar.html('');
+
+ if (typeof this.options.toolbar === 'string' || typeof this.options.toolbar === 'object') {
+ $(sprintf('
', this.options.toolbarAlign))
+ .appendTo(this.$toolbar)
+ .append($(this.options.toolbar));
+ }
+
+ // showColumns, showToggle, showRefresh
+ html = [sprintf('',
+ this.options.buttonsAlign, this.options.buttonsAlign)];
+
+ if (typeof this.options.icons === 'string') {
+ this.options.icons = calculateObjectValue(null, this.options.icons);
+ }
+
+ if (this.options.showPaginationSwitch) {
+ html.push(sprintf('
',
+ this.options.formatPaginationSwitch()),
+ sprintf(' ', this.options.iconsPrefix, this.options.icons.paginationSwitchDown),
+ ' ');
+ }
+
+ if (this.options.showRefresh) {
+ html.push(sprintf('
',
+ this.options.formatRefresh()),
+ sprintf(' ', this.options.iconsPrefix, this.options.icons.refresh),
+ ' ');
+ }
+
+ if (this.options.showToggle) {
+ html.push(sprintf('
',
+ this.options.formatToggle()),
+ sprintf(' ', this.options.iconsPrefix, this.options.icons.toggle),
+ ' ');
+ }
+
+ if (this.options.showColumns) {
+ html.push(sprintf('
',
+ this.options.formatColumns()),
+ '',
+ sprintf(' ', this.options.iconsPrefix, this.options.icons.columns),
+ ' ',
+ ' ',
+ '',
+ '
');
+ }
+
+ html.push('
');
+
+ // Fix #188: this.showToolbar is for extensions
+ if (this.showToolbar || html.length > 2) {
+ this.$toolbar.append(html.join(''));
+ }
+
+ if (this.options.showPaginationSwitch) {
+ this.$toolbar.find('button[name="paginationSwitch"]')
+ .off('click').on('click', $.proxy(this.togglePagination, this));
+ }
+
+ if (this.options.showRefresh) {
+ this.$toolbar.find('button[name="refresh"]')
+ .off('click').on('click', $.proxy(this.refresh, this));
+ }
+
+ if (this.options.showToggle) {
+ this.$toolbar.find('button[name="toggle"]')
+ .off('click').on('click', function () {
+ that.toggleView();
+ });
+ }
+
+ if (this.options.showColumns) {
+ $keepOpen = this.$toolbar.find('.keep-open');
+
+ if (switchableCount <= this.options.minimumCountColumns) {
+ $keepOpen.find('input').prop('disabled', true);
+ }
+
+ $keepOpen.find('li').off('click').on('click', function (event) {
+ event.stopImmediatePropagation();
+ });
+ $keepOpen.find('input').off('click').on('click', function () {
+ var $this = $(this);
+
+ that.toggleColumn(getFieldIndex(that.columns,
+ $(this).data('field')), $this.prop('checked'), false);
+ that.trigger('column-switch', $(this).data('field'), $this.prop('checked'));
+ });
+ }
+
+ if (this.options.search) {
+ html = [];
+ html.push(
+ '',
+ sprintf(' ',
+ this.options.formatSearch()),
+ '
');
+
+ this.$toolbar.append(html.join(''));
+ $search = this.$toolbar.find('.search input');
+ $search.off('keyup drop').on('keyup drop', function (event) {
+ if (that.options.searchOnEnterKey) {
+ if (event.keyCode !== 13) {
+ return;
+ }
+ }
+
+ clearTimeout(timeoutId); // doesn't matter if it's 0
+ timeoutId = setTimeout(function () {
+ that.onSearch(event);
+ }, that.options.searchTimeOut);
+ });
+
+ if (isIEBrowser()) {
+ $search.off('mouseup').on('mouseup', function (event) {
+ clearTimeout(timeoutId); // doesn't matter if it's 0
+ timeoutId = setTimeout(function () {
+ that.onSearch(event);
+ }, that.options.searchTimeOut);
+ });
+ }
+ }
+ };
+
+ BootstrapTable.prototype.onSearch = function (event) {
+ var text = $.trim($(event.currentTarget).val());
+
+ // trim search input
+ if (this.options.trimOnSearch && $(event.currentTarget).val() !== text) {
+ $(event.currentTarget).val(text);
+ }
+
+ if (text === this.searchText) {
+ return;
+ }
+ this.searchText = text;
+ this.options.searchText = text;
+
+ this.options.pageNumber = 1;
+ this.initSearch();
+ this.updatePagination();
+ this.trigger('search', text);
+ };
+
+ BootstrapTable.prototype.initSearch = function () {
+ var that = this;
+
+ if (this.options.sidePagination !== 'server') {
+ var s = this.searchText && this.searchText.toLowerCase();
+ var f = $.isEmptyObject(this.filterColumns) ? null : this.filterColumns;
+
+ // Check filter
+ this.data = f ? $.grep(this.options.data, function (item, i) {
+ for (var key in f) {
+ if ($.isArray(f[key])) {
+ if ($.inArray(item[key], f[key]) === -1) {
+ return false;
+ }
+ } else if (item[key] !== f[key]) {
+ return false;
+ }
+ }
+ return true;
+ }) : this.options.data;
+
+ this.data = s ? $.grep(this.data, function (item, i) {
+ for (var key in item) {
+ key = $.isNumeric(key) ? parseInt(key, 10) : key;
+ var value = item[key],
+ column = that.columns[getFieldIndex(that.columns, key)],
+ j = $.inArray(key, that.header.fields);
+
+ // Fix #142: search use formatted data
+ if (column && column.searchFormatter) {
+ value = calculateObjectValue(column,
+ that.header.formatters[j], [value, item, i], value);
+ }
+
+ var index = $.inArray(key, that.header.fields);
+ if (index !== -1 && that.header.searchables[index] && (typeof value === 'string' || typeof value === 'number')) {
+ if (that.options.strictSearch) {
+ if ((value + '').toLowerCase() === s) {
+ return true;
+ }
+ } else {
+ if ((value + '').toLowerCase().indexOf(s) !== -1) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }) : this.data;
+ }
+ };
+
+ BootstrapTable.prototype.initPagination = function () {
+ if (!this.options.pagination) {
+ this.$pagination.hide();
+ return;
+ } else {
+ this.$pagination.show();
+ }
+
+ var that = this,
+ html = [],
+ $allSelected = false,
+ i, from, to,
+ $pageList,
+ $first, $pre,
+ $next, $last,
+ $number,
+ data = this.getData();
+
+ if (this.options.sidePagination !== 'server') {
+ this.options.totalRows = data.length;
+ }
+
+ this.totalPages = 0;
+ if (this.options.totalRows) {
+ if (this.options.pageSize === this.options.formatAllRows()) {
+ this.options.pageSize = this.options.totalRows;
+ $allSelected = true;
+ } else if (this.options.pageSize === this.options.totalRows) {
+ // Fix #667 Table with pagination,
+ // multiple pages and a search that matches to one page throws exception
+ var pageLst = typeof this.options.pageList === 'string' ?
+ this.options.pageList.replace('[', '').replace(']', '')
+ .replace(/ /g, '').toLowerCase().split(',') : this.options.pageList;
+ if ($.inArray(this.options.formatAllRows().toLowerCase(), pageLst) > -1) {
+ $allSelected = true;
+ }
+ }
+
+ this.totalPages = ~~((this.options.totalRows - 1) / this.options.pageSize) + 1;
+
+ this.options.totalPages = this.totalPages;
+ }
+ if (this.totalPages > 0 && this.options.pageNumber > this.totalPages) {
+ this.options.pageNumber = this.totalPages;
+ }
+
+ this.pageFrom = (this.options.pageNumber - 1) * this.options.pageSize + 1;
+ this.pageTo = this.options.pageNumber * this.options.pageSize;
+ if (this.pageTo > this.options.totalRows) {
+ this.pageTo = this.options.totalRows;
+ }
+
+ html.push(
+ '',
+ '');
+ }
+ this.$pagination.html(html.join(''));
+
+ if (!this.options.onlyInfoPagination) {
+ $pageList = this.$pagination.find('.page-list a');
+ $first = this.$pagination.find('.page-first');
+ $pre = this.$pagination.find('.page-pre');
+ $next = this.$pagination.find('.page-next');
+ $last = this.$pagination.find('.page-last');
+ $number = this.$pagination.find('.page-number');
+
+ if (this.options.smartDisplay) {
+ if (this.totalPages <= 1) {
+ this.$pagination.find('div.pagination').hide();
+ }
+ if (pageList.length < 2 || this.options.totalRows <= pageList[0]) {
+ this.$pagination.find('span.page-list').hide();
+ }
+
+ // when data is empty, hide the pagination
+ this.$pagination[this.getData().length ? 'show' : 'hide']();
+ }
+ if ($allSelected) {
+ this.options.pageSize = this.options.formatAllRows();
+ }
+ $pageList.off('click').on('click', $.proxy(this.onPageListChange, this));
+ $first.off('click').on('click', $.proxy(this.onPageFirst, this));
+ $pre.off('click').on('click', $.proxy(this.onPagePre, this));
+ $next.off('click').on('click', $.proxy(this.onPageNext, this));
+ $last.off('click').on('click', $.proxy(this.onPageLast, this));
+ $number.off('click').on('click', $.proxy(this.onPageNumber, this));
+ }
+ };
+
+ BootstrapTable.prototype.updatePagination = function (event) {
+ // Fix #171: IE disabled button can be clicked bug.
+ if (event && $(event.currentTarget).hasClass('disabled')) {
+ return;
+ }
+
+ if (!this.options.maintainSelected) {
+ this.resetRows();
+ }
+
+ this.initPagination();
+ if (this.options.sidePagination === 'server') {
+ this.initServer();
+ } else {
+ this.initBody();
+ }
+
+ this.trigger('page-change', this.options.pageNumber, this.options.pageSize);
+ };
+
+ BootstrapTable.prototype.onPageListChange = function (event) {
+ var $this = $(event.currentTarget);
+
+ $this.parent().addClass('active').siblings().removeClass('active');
+ this.options.pageSize = $this.text().toUpperCase() === this.options.formatAllRows().toUpperCase() ?
+ this.options.formatAllRows() : +$this.text();
+ this.$toolbar.find('.page-size').text(this.options.pageSize);
+
+ this.updatePagination(event);
+ };
+
+ BootstrapTable.prototype.onPageFirst = function (event) {
+ this.options.pageNumber = 1;
+ this.updatePagination(event);
+ };
+
+ BootstrapTable.prototype.onPagePre = function (event) {
+ if ((this.options.pageNumber - 1) == 0) {
+ this.options.pageNumber = this.options.totalPages;
+ } else {
+ this.options.pageNumber--;
+ }
+ this.updatePagination(event);
+ };
+
+ BootstrapTable.prototype.onPageNext = function (event) {
+ if ((this.options.pageNumber + 1) > this.options.totalPages) {
+ this.options.pageNumber = 1;
+ } else {
+ this.options.pageNumber++;
+ }
+ this.updatePagination(event);
+ };
+
+ BootstrapTable.prototype.onPageLast = function (event) {
+ this.options.pageNumber = this.totalPages;
+ this.updatePagination(event);
+ };
+
+ BootstrapTable.prototype.onPageNumber = function (event) {
+ if (this.options.pageNumber === +$(event.currentTarget).text()) {
+ return;
+ }
+ this.options.pageNumber = +$(event.currentTarget).text();
+ this.updatePagination(event);
+ };
+
+ BootstrapTable.prototype.initBody = function (fixedScroll) {
+ var that = this,
+ html = [],
+ data = this.getData();
+
+ this.trigger('pre-body', data);
+
+ this.$body = this.$el.find('>tbody');
+ if (!this.$body.length) {
+ this.$body = $(' ').appendTo(this.$el);
+ }
+
+ //Fix #389 Bootstrap-table-flatJSON is not working
+
+ if (!this.options.pagination || this.options.sidePagination === 'server') {
+ this.pageFrom = 1;
+ this.pageTo = data.length;
+ }
+
+ for (var i = this.pageFrom - 1; i < this.pageTo; i++) {
+ var key,
+ item = data[i],
+ style = {},
+ csses = [],
+ data_ = '',
+ attributes = {},
+ htmlAttributes = [];
+
+ style = calculateObjectValue(this.options, this.options.rowStyle, [item, i], style);
+
+ if (style && style.css) {
+ for (key in style.css) {
+ csses.push(key + ': ' + style.css[key]);
+ }
+ }
+
+ attributes = calculateObjectValue(this.options,
+ this.options.rowAttributes, [item, i], attributes);
+
+ if (attributes) {
+ for (key in attributes) {
+ htmlAttributes.push(sprintf('%s="%s"', key, escapeHTML(attributes[key])));
+ }
+ }
+
+ if (item._data && !$.isEmptyObject(item._data)) {
+ $.each(item._data, function (k, v) {
+ // ignore data-index
+ if (k === 'index') {
+ return;
+ }
+ data_ += sprintf(' data-%s="%s"', k, v);
+ });
+ }
+
+ html.push(''
+ );
+
+ if (this.options.cardView) {
+ html.push(sprintf('', this.header.fields.length));
+ }
+
+ if (!this.options.cardView && this.options.detailView) {
+ html.push(' ',
+ '',
+ sprintf(' ', this.options.iconsPrefix, this.options.icons.detailOpen),
+ ' ',
+ ' ');
+ }
+
+ $.each(this.header.fields, function (j, field) {
+ var text = '',
+ value = getItemField(item, field, that.options.escape),
+ type = '',
+ cellStyle = {},
+ id_ = '',
+ class_ = that.header.classes[j],
+ data_ = '',
+ rowspan_ = '',
+ title_ = '',
+ column = that.columns[getFieldIndex(that.columns, field)];
+
+ if (!column.visible) {
+ return;
+ }
+
+ style = sprintf('style="%s"', csses.concat(that.header.styles[j]).join('; '));
+
+ value = calculateObjectValue(column,
+ that.header.formatters[j], [value, item, i], value);
+
+ // handle td's id and class
+ if (item['_' + field + '_id']) {
+ id_ = sprintf(' id="%s"', item['_' + field + '_id']);
+ }
+ if (item['_' + field + '_class']) {
+ class_ = sprintf(' class="%s"', item['_' + field + '_class']);
+ }
+ if (item['_' + field + '_rowspan']) {
+ rowspan_ = sprintf(' rowspan="%s"', item['_' + field + '_rowspan']);
+ }
+ if (item['_' + field + '_title']) {
+ title_ = sprintf(' title="%s"', item['_' + field + '_title']);
+ }
+ cellStyle = calculateObjectValue(that.header,
+ that.header.cellStyles[j], [value, item, i], cellStyle);
+ if (cellStyle.classes) {
+ class_ = sprintf(' class="%s"', cellStyle.classes);
+ }
+ if (cellStyle.css) {
+ var csses_ = [];
+ for (var key in cellStyle.css) {
+ csses_.push(key + ': ' + cellStyle.css[key]);
+ }
+ style = sprintf('style="%s"', csses_.concat(that.header.styles[j]).join('; '));
+ }
+
+ if (item['_' + field + '_data'] && !$.isEmptyObject(item['_' + field + '_data'])) {
+ $.each(item['_' + field + '_data'], function (k, v) {
+ // ignore data-index
+ if (k === 'index') {
+ return;
+ }
+ data_ += sprintf(' data-%s="%s"', k, v);
+ });
+ }
+
+ if (column.checkbox || column.radio) {
+ type = column.checkbox ? 'checkbox' : type;
+ type = column.radio ? 'radio' : type;
+
+ text = [sprintf(that.options.cardView ?
+ '' : '
', column['class'] || ''),
+ ' ',
+ that.header.formatters[j] && typeof value === 'string' ? value : '',
+ that.options.cardView ? '' : ' '
+ ].join('');
+
+ item[that.header.stateField] = value === true || (value && value.checked);
+ } else {
+ value = typeof value === 'undefined' || value === null ?
+ that.options.undefinedText : value;
+
+ text = that.options.cardView ? ['
',
+ that.options.showHeader ? sprintf('%s ', style,
+ getPropertyFromOther(that.columns, 'field', 'title', field)) : '',
+ sprintf('%s ', value),
+ '
'
+ ].join('') : [sprintf('
', id_, class_, style, data_, rowspan_, title_),
+ value,
+ ' '
+ ].join('');
+
+ // Hide empty data on Card view when smartDisplay is set to true.
+ if (that.options.cardView && that.options.smartDisplay && value === '') {
+ // Should set a placeholder for event binding correct fieldIndex
+ text = '
';
+ }
+ }
+
+ html.push(text);
+ });
+
+ if (this.options.cardView) {
+ html.push('');
+ }
+
+ html.push('
');
+ }
+
+ // show no records
+ if (!html.length) {
+ html.push('',
+ sprintf('%s ',
+ this.$header.find('th').length, this.options.formatNoMatches()),
+ ' ');
+ }
+
+ this.$body.html(html.join(''));
+
+ if (!fixedScroll) {
+ this.scrollTo(0);
+ }
+
+ // click to select by column
+ this.$body.find('> tr[data-index] > td').off('click dblclick').on('click dblclick', function (e) {
+ var $td = $(this),
+ $tr = $td.parent(),
+ item = that.data[$tr.data('index')],
+ index = $td[0].cellIndex,
+ field = that.header.fields[that.options.detailView && !that.options.cardView ? index - 1 : index],
+ column = that.columns[getFieldIndex(that.columns, field)],
+ value = getItemField(item, field, that.options.escape);
+
+ if ($td.find('.detail-icon').length) {
+ return;
+ }
+
+ that.trigger(e.type === 'click' ? 'click-cell' : 'dbl-click-cell', field, value, item, $td);
+ that.trigger(e.type === 'click' ? 'click-row' : 'dbl-click-row', item, $tr);
+
+ // if click to select - then trigger the checkbox/radio click
+ if (e.type === 'click' && that.options.clickToSelect && column.clickToSelect) {
+ var $selectItem = $tr.find(sprintf('[name="%s"]', that.options.selectItemName));
+ if ($selectItem.length) {
+ $selectItem[0].click(); // #144: .trigger('click') bug
+ }
+ }
+ });
+
+ this.$body.find('> tr[data-index] > td > .detail-icon').off('click').on('click', function () {
+ var $this = $(this),
+ $tr = $this.parent().parent(),
+ index = $tr.data('index'),
+ row = data[index]; // Fix #980 Detail view, when searching, returns wrong row
+
+ // remove and update
+ if ($tr.next().is('tr.detail-view')) {
+ $this.find('i').attr('class', sprintf('%s %s', that.options.iconsPrefix, that.options.icons.detailOpen));
+ $tr.next().remove();
+ that.trigger('collapse-row', index, row);
+ } else {
+ $this.find('i').attr('class', sprintf('%s %s', that.options.iconsPrefix, that.options.icons.detailClose));
+ $tr.after(sprintf(' ', $tr.find('td').length));
+ var $element = $tr.next().find('td');
+ var content = calculateObjectValue(that.options, that.options.detailFormatter, [index, row, $element], '');
+ if ($element.length === 1) {
+ $element.append(content);
+ }
+ that.trigger('expand-row', index, row, $element);
+ }
+ that.resetView();
+ });
+
+ this.$selectItem = this.$body.find(sprintf('[name="%s"]', this.options.selectItemName));
+ this.$selectItem.off('click').on('click', function (event) {
+ event.stopImmediatePropagation();
+
+ var $this = $(this),
+ checked = $this.prop('checked'),
+ row = that.data[$this.data('index')];
+
+ if (that.options.maintainSelected && $(this).is(':radio')) {
+ $.each(that.options.data, function (i, row) {
+ row[that.header.stateField] = false;
+ });
+ }
+
+ row[that.header.stateField] = checked;
+
+ if (that.options.singleSelect) {
+ that.$selectItem.not(this).each(function () {
+ that.data[$(this).data('index')][that.header.stateField] = false;
+ });
+ that.$selectItem.filter(':checked').not(this).prop('checked', false);
+ }
+
+ that.updateSelected();
+ that.trigger(checked ? 'check' : 'uncheck', row, $this);
+ });
+
+ $.each(this.header.events, function (i, events) {
+ if (!events) {
+ return;
+ }
+ // fix bug, if events is defined with namespace
+ if (typeof events === 'string') {
+ events = calculateObjectValue(null, events);
+ }
+
+ var field = that.header.fields[i],
+ fieldIndex = $.inArray(field, that.getVisibleFields());
+
+ if (that.options.detailView && !that.options.cardView) {
+ fieldIndex += 1;
+ }
+
+ for (var key in events) {
+ that.$body.find('>tr:not(.no-records-found)').each(function () {
+ var $tr = $(this),
+ $td = $tr.find(that.options.cardView ? '.card-view' : 'td').eq(fieldIndex),
+ index = key.indexOf(' '),
+ name = key.substring(0, index),
+ el = key.substring(index + 1),
+ func = events[key];
+
+ $td.find(el).off(name).on(name, function (e) {
+ var index = $tr.data('index'),
+ row = that.data[index],
+ value = row[field];
+
+ func.apply(this, [e, value, row, index]);
+ });
+ });
+ }
+ });
+
+ this.updateSelected();
+ this.resetView();
+
+ this.trigger('post-body');
+ };
+
+ BootstrapTable.prototype.initServer = function (silent, query) {
+ var that = this,
+ data = {},
+ params = {
+ searchText: this.searchText,
+ sortName: this.options.sortName,
+ sortOrder: this.options.sortOrder
+ },
+ request;
+
+ if (this.options.pagination) {
+ params.pageSize = this.options.pageSize === this.options.formatAllRows() ?
+ this.options.totalRows : this.options.pageSize;
+ params.pageNumber = this.options.pageNumber;
+ }
+
+ if (!this.options.url && !this.options.ajax) {
+ return;
+ }
+
+ if (this.options.queryParamsType === 'limit') {
+ params = {
+ search: params.searchText,
+ sort: params.sortName,
+ order: params.sortOrder
+ };
+ if (this.options.pagination) {
+ params.limit = this.options.pageSize === this.options.formatAllRows() ?
+ this.options.totalRows : this.options.pageSize;
+ params.offset = this.options.pageSize === this.options.formatAllRows() ?
+ 0 : this.options.pageSize * (this.options.pageNumber - 1);
+ }
+ }
+
+ if (!($.isEmptyObject(this.filterColumnsPartial))) {
+ params['filter'] = JSON.stringify(this.filterColumnsPartial, null);
+ }
+
+ data = calculateObjectValue(this.options, this.options.queryParams, [params], data);
+
+ $.extend(data, query || {});
+
+ // false to stop request
+ if (data === false) {
+ return;
+ }
+
+ if (!silent) {
+ this.$tableLoading.show();
+ }
+ request = $.extend({}, calculateObjectValue(null, this.options.ajaxOptions), {
+ type: this.options.method,
+ url: this.options.url,
+ data: this.options.contentType === 'application/json' && this.options.method === 'post' ?
+ JSON.stringify(data) : data,
+ cache: this.options.cache,
+ contentType: this.options.contentType,
+ dataType: this.options.dataType,
+ success: function (res) {
+ res = calculateObjectValue(that.options, that.options.responseHandler, [res], res);
+
+ that.load(res);
+ that.trigger('load-success', res);
+ if (!silent) that.$tableLoading.hide();
+ },
+ error: function (res) {
+ that.trigger('load-error', res.status, res);
+ if (!silent) that.$tableLoading.hide();
+ }
+ });
+
+ if (this.options.ajax) {
+ calculateObjectValue(this, this.options.ajax, [request], null);
+ } else {
+ $.ajax(request);
+ }
+ };
+
+ BootstrapTable.prototype.initSearchText = function () {
+ if (this.options.search) {
+ if (this.options.searchText !== '') {
+ var $search = this.$toolbar.find('.search input');
+ $search.val(this.options.searchText);
+ this.onSearch({ currentTarget: $search });
+ }
+ }
+ };
+
+ BootstrapTable.prototype.getCaret = function () {
+ var that = this;
+
+ $.each(this.$header.find('th'), function (i, th) {
+ $(th).find('.sortable').removeClass('desc asc').addClass($(th).data('field') === that.options.sortName ? that.options.sortOrder : 'both');
+ });
+ };
+
+ BootstrapTable.prototype.updateSelected = function () {
+ var checkAll = this.$selectItem.filter(':enabled').length &&
+ this.$selectItem.filter(':enabled').length ===
+ this.$selectItem.filter(':enabled').filter(':checked').length;
+
+ this.$selectAll.add(this.$selectAll_).prop('checked', checkAll);
+
+ this.$selectItem.each(function () {
+ $(this).closest('tr')[$(this).prop('checked') ? 'addClass' : 'removeClass']('selected');
+ });
+ };
+
+ BootstrapTable.prototype.updateRows = function () {
+ var that = this;
+
+ this.$selectItem.each(function () {
+ that.data[$(this).data('index')][that.header.stateField] = $(this).prop('checked');
+ });
+ };
+
+ BootstrapTable.prototype.resetRows = function () {
+ var that = this;
+
+ $.each(this.data, function (i, row) {
+ that.$selectAll.prop('checked', false);
+ that.$selectItem.prop('checked', false);
+ if (that.header.stateField) {
+ row[that.header.stateField] = false;
+ }
+ });
+ };
+
+ BootstrapTable.prototype.trigger = function (name) {
+ var args = Array.prototype.slice.call(arguments, 1);
+
+ name += '.bs.table';
+ this.options[BootstrapTable.EVENTS[name]].apply(this.options, args);
+ this.$el.trigger($.Event(name), args);
+
+ this.options.onAll(name, args);
+ this.$el.trigger($.Event('all.bs.table'), [name, args]);
+ };
+
+ BootstrapTable.prototype.resetHeader = function () {
+ // fix #61: the hidden table reset header bug.
+ // fix bug: get $el.css('width') error sometime (height = 500)
+ clearTimeout(this.timeoutId_);
+ this.timeoutId_ = setTimeout($.proxy(this.fitHeader, this), this.$el.is(':hidden') ? 100 : 0);
+ };
+
+ BootstrapTable.prototype.fitHeader = function () {
+ var that = this,
+ fixedBody,
+ scrollWidth,
+ focused,
+ focusedTemp;
+
+ if (that.$el.is(':hidden')) {
+ that.timeoutId_ = setTimeout($.proxy(that.fitHeader, that), 100);
+ return;
+ }
+ fixedBody = this.$tableBody.get(0);
+
+ scrollWidth = fixedBody.scrollWidth > fixedBody.clientWidth &&
+ fixedBody.scrollHeight > fixedBody.clientHeight + this.$header.outerHeight() ?
+ getScrollBarWidth() : 0;
+
+ this.$el.css('margin-top', -this.$header.outerHeight());
+
+ focused = $(':focus');
+ if (focused.length > 0) {
+ var $th = focused.parents('th');
+ if ($th.length > 0) {
+ var dataField = $th.attr('data-field');
+ if (dataField !== undefined) {
+ var $headerTh = this.$header.find("[data-field='" + dataField + "']");
+ if ($headerTh.length > 0) {
+ $headerTh.find(":input").addClass("focus-temp");
+ }
+ }
+ }
+ }
+
+ this.$header_ = this.$header.clone(true, true);
+ this.$selectAll_ = this.$header_.find('[name="btSelectAll"]');
+ this.$tableHeader.css({
+ 'margin-right': scrollWidth
+ }).find('table').css('width', this.$el.outerWidth())
+ .html('').attr('class', this.$el.attr('class'))
+ .append(this.$header_);
+
+
+ focusedTemp = $('.focus-temp:visible:eq(0)');
+ if (focusedTemp.length > 0) {
+ focusedTemp.focus();
+ this.$header.find('.focus-temp').removeClass('focus-temp');
+ }
+
+ // fix bug: $.data() is not working as expected after $.append()
+ this.$header.find('th[data-field]').each(function (i) {
+ that.$header_.find(sprintf('th[data-field="%s"]', $(this).data('field'))).data($(this).data());
+ });
+
+ var visibleFields = this.getVisibleFields();
+
+ this.$body.find('>tr:first-child:not(.no-records-found) > *').each(function (i) {
+ var $this = $(this),
+ index = i;
+
+ if (that.options.detailView && !that.options.cardView) {
+ if (i === 0) {
+ that.$header_.find('th.detail').find('.fht-cell').width($this.innerWidth());
+ }
+ index = i - 1;
+ }
+
+ that.$header_.find(sprintf('th[data-field="%s"]', visibleFields[index]))
+ .find('.fht-cell').width($this.innerWidth());
+ });
+ // horizontal scroll event
+ // TODO: it's probably better improving the layout than binding to scroll event
+ this.$tableBody.off('scroll').on('scroll', function () {
+ that.$tableHeader.scrollLeft($(this).scrollLeft());
+
+ if (that.options.showFooter && !that.options.cardView) {
+ that.$tableFooter.scrollLeft($(this).scrollLeft());
+ }
+ });
+ that.trigger('post-header');
+ };
+
+ BootstrapTable.prototype.resetFooter = function () {
+ var that = this,
+ data = that.getData(),
+ html = [];
+
+ if (!this.options.showFooter || this.options.cardView) { //do nothing
+ return;
+ }
+
+ if (!this.options.cardView && this.options.detailView) {
+ html.push('
');
+ }
+
+ $.each(this.columns, function (i, column) {
+ var falign = '', // footer align style
+ style = '',
+ class_ = sprintf(' class="%s"', column['class']);
+
+ if (!column.visible) {
+ return;
+ }
+
+ if (that.options.cardView && (!column.cardVisible)) {
+ return;
+ }
+
+ falign = sprintf('text-align: %s; ', column.falign ? column.falign : column.align);
+ style = sprintf('vertical-align: %s; ', column.valign);
+
+ html.push('');
+ html.push('');
+
+ html.push(calculateObjectValue(column, column.footerFormatter, [data], ' ') || ' ');
+
+ html.push('
');
+ html.push('
');
+ html.push('');
+ html.push(' ');
+ });
+
+ this.$tableFooter.find('tr').html(html.join(''));
+ clearTimeout(this.timeoutFooter_);
+ this.timeoutFooter_ = setTimeout($.proxy(this.fitFooter, this),
+ this.$el.is(':hidden') ? 100 : 0);
+ };
+
+ BootstrapTable.prototype.fitFooter = function () {
+ var that = this,
+ $footerTd,
+ elWidth,
+ scrollWidth;
+
+ clearTimeout(this.timeoutFooter_);
+ if (this.$el.is(':hidden')) {
+ this.timeoutFooter_ = setTimeout($.proxy(this.fitFooter, this), 100);
+ return;
+ }
+
+ elWidth = this.$el.css('width');
+ scrollWidth = elWidth > this.$tableBody.width() ? getScrollBarWidth() : 0;
+
+ this.$tableFooter.css({
+ 'margin-right': scrollWidth
+ }).find('table').css('width', elWidth)
+ .attr('class', this.$el.attr('class'));
+
+ $footerTd = this.$tableFooter.find('td');
+
+ this.$body.find('>tr:first-child:not(.no-records-found) > *').each(function (i) {
+ var $this = $(this);
+
+ $footerTd.eq(i).find('.fht-cell').width($this.innerWidth());
+ });
+ };
+
+ BootstrapTable.prototype.toggleColumn = function (index, checked, needUpdate) {
+ if (index === -1) {
+ return;
+ }
+ this.columns[index].visible = checked;
+ this.initHeader();
+ this.initSearch();
+ this.initPagination();
+ this.initBody();
+
+ if (this.options.showColumns) {
+ var $items = this.$toolbar.find('.keep-open input').prop('disabled', false);
+
+ if (needUpdate) {
+ $items.filter(sprintf('[value="%s"]', index)).prop('checked', checked);
+ }
+
+ if ($items.filter(':checked').length <= this.options.minimumCountColumns) {
+ $items.filter(':checked').prop('disabled', true);
+ }
+ }
+ };
+
+ BootstrapTable.prototype.toggleRow = function (index, uniqueId, visible) {
+ if (index === -1) {
+ return;
+ }
+ this.$body.find(typeof index !== 'undefined' ?
+ sprintf('tr[data-index="%s"]', index) :
+ sprintf('tr[data-uniqueid="%s"]', uniqueId))[visible ? 'show' : 'hide']();
+ };
+
+ BootstrapTable.prototype.getVisibleFields = function () {
+ var that = this,
+ visibleFields = [];
+
+ $.each(this.header.fields, function (j, field) {
+ var column = that.columns[getFieldIndex(that.columns, field)];
+
+ if (!column.visible) {
+ return;
+ }
+ visibleFields.push(field);
+ });
+ return visibleFields;
+ };
+
+ // PUBLIC FUNCTION DEFINITION
+ // =======================
+
+ BootstrapTable.prototype.resetView = function (params) {
+ var padding = 0;
+
+ if (params && params.height) {
+ this.options.height = params.height;
+ }
+
+ this.$selectAll.prop('checked', this.$selectItem.length > 0 &&
+ this.$selectItem.length === this.$selectItem.filter(':checked').length);
+
+ if (this.options.height) {
+ var toolbarHeight = getRealHeight(this.$toolbar),
+ paginationHeight = getRealHeight(this.$pagination),
+ height = this.options.height - toolbarHeight - paginationHeight;
+
+ this.$tableContainer.css('height', height + 'px');
+ }
+
+ if (this.options.cardView) {
+ // remove the element css
+ this.$el.css('margin-top', '0');
+ this.$tableContainer.css('padding-bottom', '0');
+ return;
+ }
+
+ if (this.options.showHeader && this.options.height) {
+ this.$tableHeader.show();
+ this.resetHeader();
+ padding += this.$header.outerHeight();
+ } else {
+ this.$tableHeader.hide();
+ this.trigger('post-header');
+ }
+
+ if (this.options.showFooter) {
+ this.resetFooter();
+ if (this.options.height) {
+ padding += this.$tableFooter.outerHeight() + 1;
+ }
+ }
+
+ // Assign the correct sortable arrow
+ this.getCaret();
+ this.$tableContainer.css('padding-bottom', padding + 'px');
+ this.trigger('reset-view');
+ };
+
+ BootstrapTable.prototype.getData = function (useCurrentPage) {
+ return (this.searchText || !$.isEmptyObject(this.filterColumns) || !$.isEmptyObject(this.filterColumnsPartial)) ?
+ (useCurrentPage ? this.data.slice(this.pageFrom - 1, this.pageTo) : this.data) :
+ (useCurrentPage ? this.options.data.slice(this.pageFrom - 1, this.pageTo) : this.options.data);
+ };
+
+ BootstrapTable.prototype.load = function (data) {
+ var fixedScroll = false;
+
+ // #431: support pagination
+ if (this.options.sidePagination === 'server') {
+ this.options.totalRows = data.total;
+ fixedScroll = data.fixedScroll;
+ data = data[this.options.dataField];
+ } else if (!$.isArray(data)) { // support fixedScroll
+ fixedScroll = data.fixedScroll;
+ data = data.data;
+ }
+
+ this.initData(data);
+ this.initSearch();
+ this.initPagination();
+ this.initBody(fixedScroll);
+ };
+
+ BootstrapTable.prototype.append = function (data) {
+ this.initData(data, 'append');
+ this.initSearch();
+ this.initPagination();
+ this.initSort();
+ this.initBody(true);
+ };
+
+ BootstrapTable.prototype.prepend = function (data) {
+ this.initData(data, 'prepend');
+ this.initSearch();
+ this.initPagination();
+ this.initSort();
+ this.initBody(true);
+ };
+
+ BootstrapTable.prototype.remove = function (params) {
+ var len = this.options.data.length,
+ i, row;
+
+ if (!Object.prototype.hasOwnProperty.call(params, "field") || !Object.prototype.hasOwnProperty.call(params, "values")) {
+ return;
+ }
+
+ for (i = len - 1; i >= 0; i--) {
+ row = this.options.data[i];
+
+ if (!Object.prototype.hasOwnProperty.call(row, params.field)) {
+ continue;
+ }
+ if ($.inArray(row[params.field], params.values) !== -1) {
+ this.options.data.splice(i, 1);
+ }
+ }
+
+ if (len === this.options.data.length) {
+ return;
+ }
+
+ this.initSearch();
+ this.initPagination();
+ this.initSort();
+ this.initBody(true);
+ };
+
+ BootstrapTable.prototype.removeAll = function () {
+ if (this.options.data.length > 0) {
+ this.options.data.splice(0, this.options.data.length);
+ this.initSearch();
+ this.initPagination();
+ this.initBody(true);
+ }
+ };
+
+ BootstrapTable.prototype.getRowByUniqueId = function (id) {
+ var uniqueId = this.options.uniqueId,
+ len = this.options.data.length,
+ dataRow = null,
+ i, row, rowUniqueId;
+
+ for (i = len - 1; i >= 0; i--) {
+ row = this.options.data[i];
+
+ if (Object.prototype.hasOwnProperty.call(row, uniqueId)) { // uniqueId is a column
+ rowUniqueId = row[uniqueId];
+ } else if (row._data && Object.prototype.hasOwnProperty.call(row._data, uniqueId)) { // uniqueId is a row data property
+ rowUniqueId = row._data[uniqueId];
+ } else {
+ continue;
+ }
+ if (typeof rowUniqueId === 'string') {
+ id = id.toString();
+ } else if (typeof rowUniqueId === 'number') {
+ if ((Number(rowUniqueId) === rowUniqueId) && (rowUniqueId % 1 === 0)) {
+ id = parseInt(id);
+ } else if ((rowUniqueId === Number(rowUniqueId)) && (rowUniqueId !== 0)) {
+ id = parseFloat(id);
+ }
+ }
+
+ if (rowUniqueId === id) {
+ dataRow = row;
+ break;
+ }
+ }
+
+ return dataRow;
+ };
+
+ BootstrapTable.prototype.removeByUniqueId = function (id) {
+ var len = this.options.data.length,
+ row = this.getRowByUniqueId(id);
+
+ if (row) {
+ this.options.data.splice(this.options.data.indexOf(row), 1);
+ }
+
+ if (len === this.options.data.length) {
+ return;
+ }
+
+ this.initSearch();
+ this.initPagination();
+ this.initBody(true);
+ };
+
+ BootstrapTable.prototype.updateByUniqueId = function (params) {
+ var rowId;
+
+ if (!Object.prototype.hasOwnProperty.call(params, 'id') || !Object.prototype.hasOwnProperty.call(params, 'row')) {
+ return;
+ }
+
+ rowId = $.inArray(this.getRowByUniqueId(params.id), this.options.data);
+
+ if (rowId === -1) {
+ return;
+ }
+
+ $.extend(this.data[rowId], params.row);
+ this.initSort();
+ this.initBody(true);
+ };
+
+ BootstrapTable.prototype.insertRow = function (params) {
+ if (!Object.prototype.hasOwnProperty.call(params, 'index') || !Object.prototype.hasOwnProperty.call(params, 'row')) {
+ return;
+ }
+ this.data.splice(params.index, 0, params.row);
+ this.initSearch();
+ this.initPagination();
+ this.initSort();
+ this.initBody(true);
+ };
+
+ BootstrapTable.prototype.updateRow = function (params) {
+ if (!Object.prototype.hasOwnProperty.call(params, 'index') || !Object.prototype.hasOwnProperty.call(params, 'row')) {
+ return;
+ }
+ $.extend(this.data[params.index], params.row);
+ this.initSort();
+ this.initBody(true);
+ };
+
+ BootstrapTable.prototype.showRow = function (params) {
+ if (!Object.prototype.hasOwnProperty.call(params, 'index') && !Object.prototype.hasOwnProperty.call(params, 'uniqueId')) {
+ return;
+ }
+ this.toggleRow(params.index, params.uniqueId, true);
+ };
+
+ BootstrapTable.prototype.hideRow = function (params) {
+ if (!Object.prototype.hasOwnProperty.call(params, 'index') && !Object.prototype.hasOwnProperty.call(params, 'uniqueId')) {
+ return;
+ }
+ this.toggleRow(params.index, params.uniqueId, false);
+ };
+
+ BootstrapTable.prototype.getRowsHidden = function (show) {
+ var rows = $(this.$body[0]).children().filter(':hidden'),
+ i = 0;
+ if (show) {
+ for (; i < rows.length; i++) {
+ $(rows[i]).show();
+ }
+ }
+ return rows;
+ };
+
+ BootstrapTable.prototype.mergeCells = function (options) {
+ var row = options.index,
+ col = $.inArray(options.field, this.getVisibleFields()),
+ rowspan = options.rowspan || 1,
+ colspan = options.colspan || 1,
+ i, j,
+ $tr = this.$body.find('>tr'),
+ $td;
+
+ if (this.options.detailView && !this.options.cardView) {
+ col += 1;
+ }
+
+ $td = $tr.eq(row).find('>td').eq(col);
+
+ if (row < 0 || col < 0 || row >= this.data.length) {
+ return;
+ }
+
+ for (i = row; i < row + rowspan; i++) {
+ for (j = col; j < col + colspan; j++) {
+ $tr.eq(i).find('>td').eq(j).hide();
+ }
+ }
+
+ $td.attr('rowspan', rowspan).attr('colspan', colspan).show();
+ };
+
+ BootstrapTable.prototype.updateCell = function (params) {
+ if (!Object.prototype.hasOwnProperty.call(params, 'index') ||
+ !Object.prototype.hasOwnProperty.call(params, 'field') ||
+ !Object.prototype.hasOwnProperty.call(params, 'value')) {
+ return;
+ }
+ this.data[params.index][params.field] = params.value;
+
+ if (params.reinit === false) {
+ return;
+ }
+ this.initSort();
+ this.initBody(true);
+ };
+
+ BootstrapTable.prototype.getOptions = function () {
+ return this.options;
+ };
+
+ BootstrapTable.prototype.getSelections = function () {
+ var that = this;
+
+ return $.grep(this.data, function (row) {
+ return row[that.header.stateField];
+ });
+ };
+
+ BootstrapTable.prototype.getAllSelections = function () {
+ var that = this;
+
+ return $.grep(this.options.data, function (row) {
+ return row[that.header.stateField];
+ });
+ };
+
+ BootstrapTable.prototype.checkAll = function () {
+ this.checkAll_(true);
+ };
+
+ BootstrapTable.prototype.uncheckAll = function () {
+ this.checkAll_(false);
+ };
+
+ BootstrapTable.prototype.checkInvert = function () {
+ var that = this;
+ var rows = that.$selectItem.filter(':enabled');
+ var checked = rows.filter(':checked');
+ rows.each(function () {
+ $(this).prop('checked', !$(this).prop('checked'));
+ });
+ that.updateRows();
+ that.updateSelected();
+ that.trigger('uncheck-some', checked);
+ checked = that.getSelections();
+ that.trigger('check-some', checked);
+ };
+
+ BootstrapTable.prototype.checkAll_ = function (checked) {
+ var rows;
+ if (!checked) {
+ rows = this.getSelections();
+ }
+ this.$selectAll.add(this.$selectAll_).prop('checked', checked);
+ this.$selectItem.filter(':enabled').prop('checked', checked);
+ this.updateRows();
+ if (checked) {
+ rows = this.getSelections();
+ }
+ this.trigger(checked ? 'check-all' : 'uncheck-all', rows);
+ };
+
+ BootstrapTable.prototype.check = function (index) {
+ this.check_(true, index);
+ };
+
+ BootstrapTable.prototype.uncheck = function (index) {
+ this.check_(false, index);
+ };
+
+ BootstrapTable.prototype.check_ = function (checked, index) {
+ var $el = this.$selectItem.filter(sprintf('[data-index="%s"]', index)).prop('checked', checked);
+ this.data[index][this.header.stateField] = checked;
+ this.updateSelected();
+ this.trigger(checked ? 'check' : 'uncheck', this.data[index], $el);
+ };
+
+ BootstrapTable.prototype.checkBy = function (obj) {
+ this.checkBy_(true, obj);
+ };
+
+ BootstrapTable.prototype.uncheckBy = function (obj) {
+ this.checkBy_(false, obj);
+ };
+
+ BootstrapTable.prototype.checkBy_ = function (checked, obj) {
+ if (!Object.prototype.hasOwnProperty.call(obj, 'field') || !Object.prototype.hasOwnProperty.call(obj, 'values')) {
+ return;
+ }
+
+ var that = this,
+ rows = [];
+ $.each(this.options.data, function (index, row) {
+ if (!Object.prototype.hasOwnProperty.call(row, obj.field)) {
+ return false;
+ }
+ if ($.inArray(row[obj.field], obj.values) !== -1) {
+ var $el = that.$selectItem.filter(':enabled')
+ .filter(sprintf('[data-index="%s"]', index)).prop('checked', checked);
+ row[that.header.stateField] = checked;
+ rows.push(row);
+ that.trigger(checked ? 'check' : 'uncheck', row, $el);
+ }
+ });
+ this.updateSelected();
+ this.trigger(checked ? 'check-some' : 'uncheck-some', rows);
+ };
+
+ BootstrapTable.prototype.destroy = function () {
+ this.$el.insertBefore(this.$container);
+ $(this.options.toolbar).insertBefore(this.$el);
+ this.$container.next().remove();
+ this.$container.remove();
+ this.$el.html(this.$el_.html())
+ .css('margin-top', '0')
+ .attr('class', this.$el_.attr('class') || ''); // reset the class
+ };
+
+ BootstrapTable.prototype.showLoading = function () {
+ this.$tableLoading.show();
+ };
+
+ BootstrapTable.prototype.hideLoading = function () {
+ this.$tableLoading.hide();
+ };
+
+ BootstrapTable.prototype.togglePagination = function () {
+ this.options.pagination = !this.options.pagination;
+ var button = this.$toolbar.find('button[name="paginationSwitch"] i');
+ if (this.options.pagination) {
+ button.attr("class", this.options.iconsPrefix + " " + this.options.icons.paginationSwitchDown);
+ } else {
+ button.attr("class", this.options.iconsPrefix + " " + this.options.icons.paginationSwitchUp);
+ }
+ this.updatePagination();
+ };
+
+ BootstrapTable.prototype.refresh = function (params) {
+ if (params && params.url) {
+ this.options.url = params.url;
+ this.options.pageNumber = 1;
+ }
+ this.initServer(params && params.silent, params && params.query);
+ };
+
+ BootstrapTable.prototype.resetWidth = function () {
+ if (this.options.showHeader && this.options.height) {
+ this.fitHeader();
+ }
+ if (this.options.showFooter) {
+ this.fitFooter();
+ }
+ };
+
+ BootstrapTable.prototype.showColumn = function (field) {
+ this.toggleColumn(getFieldIndex(this.columns, field), true, true);
+ };
+
+ BootstrapTable.prototype.hideColumn = function (field) {
+ this.toggleColumn(getFieldIndex(this.columns, field), false, true);
+ };
+
+ BootstrapTable.prototype.getHiddenColumns = function () {
+ return $.grep(this.columns, function (column) {
+ return !column.visible;
+ });
+ };
+
+ BootstrapTable.prototype.filterBy = function (columns) {
+ this.filterColumns = $.isEmptyObject(columns) ? {} : columns;
+ this.options.pageNumber = 1;
+ this.initSearch();
+ this.updatePagination();
+ };
+
+ BootstrapTable.prototype.scrollTo = function (value) {
+ if (typeof value === 'string') {
+ value = value === 'bottom' ? this.$tableBody[0].scrollHeight : 0;
+ }
+ if (typeof value === 'number') {
+ this.$tableBody.scrollTop(value);
+ }
+ if (typeof value === 'undefined') {
+ return this.$tableBody.scrollTop();
+ }
+ };
+
+ BootstrapTable.prototype.getScrollPosition = function () {
+ return this.scrollTo();
+ };
+
+ BootstrapTable.prototype.selectPage = function (page) {
+ if (page > 0 && page <= this.options.totalPages) {
+ this.options.pageNumber = page;
+ this.updatePagination();
+ }
+ };
+
+ BootstrapTable.prototype.prevPage = function () {
+ if (this.options.pageNumber > 1) {
+ this.options.pageNumber--;
+ this.updatePagination();
+ }
+ };
+
+ BootstrapTable.prototype.nextPage = function () {
+ if (this.options.pageNumber < this.options.totalPages) {
+ this.options.pageNumber++;
+ this.updatePagination();
+ }
+ };
+
+ BootstrapTable.prototype.toggleView = function () {
+ this.options.cardView = !this.options.cardView;
+ this.initHeader();
+ // Fixed remove toolbar when click cardView button.
+ //that.initToolbar();
+ this.initBody();
+ this.trigger('toggle', this.options.cardView);
+ };
+
+ BootstrapTable.prototype.refreshOptions = function (options) {
+ //If the objects are equivalent then avoid the call of destroy / init methods
+ if (compareObjects(this.options, options, true)) {
+ return;
+ }
+ this.options = $.extend(this.options, options);
+ this.trigger('refresh-options', this.options);
+ this.destroy();
+ this.init();
+ };
+
+ BootstrapTable.prototype.resetSearch = function (text) {
+ var $search = this.$toolbar.find('.search input');
+ $search.val(text || '');
+ this.onSearch({ currentTarget: $search });
+ };
+
+ BootstrapTable.prototype.expandRow_ = function (expand, index) {
+ var $tr = this.$body.find(sprintf('> tr[data-index="%s"]', index));
+ if ($tr.next().is('tr.detail-view') === (expand ? false : true)) {
+ $tr.find('> td > .detail-icon').click();
+ }
+ };
+
+ BootstrapTable.prototype.expandRow = function (index) {
+ this.expandRow_(true, index);
+ };
+
+ BootstrapTable.prototype.collapseRow = function (index) {
+ this.expandRow_(false, index);
+ };
+
+ BootstrapTable.prototype.expandAllRows = function (isSubTable) {
+ if (isSubTable) {
+ var $tr = this.$body.find(sprintf('> tr[data-index="%s"]', 0)),
+ that = this,
+ detailIcon = null,
+ executeInterval = false,
+ idInterval = -1;
+
+ if (!$tr.next().is('tr.detail-view')) {
+ $tr.find('> td > .detail-icon').click();
+ executeInterval = true;
+ } else if (!$tr.next().next().is('tr.detail-view')) {
+ $tr.next().find(".detail-icon").click();
+ executeInterval = true;
+ }
+
+ if (executeInterval) {
+ try {
+ idInterval = setInterval(function () {
+ detailIcon = that.$body.find("tr.detail-view").last().find(".detail-icon");
+ if (detailIcon.length > 0) {
+ detailIcon.click();
+ } else {
+ clearInterval(idInterval);
+ }
+ }, 1);
+ } catch (ex) {
+ clearInterval(idInterval);
+ }
+ }
+ } else {
+ var trs = this.$body.children();
+ for (var i = 0; i < trs.length; i++) {
+ this.expandRow_(true, $(trs[i]).data("index"));
+ }
+ }
+ };
+
+ BootstrapTable.prototype.collapseAllRows = function (isSubTable) {
+ if (isSubTable) {
+ this.expandRow_(false, 0);
+ } else {
+ var trs = this.$body.children();
+ for (var i = 0; i < trs.length; i++) {
+ this.expandRow_(false, $(trs[i]).data("index"));
+ }
+ }
+ };
+
+ BootstrapTable.prototype.updateFormatText = function (name, text) {
+ if (this.options[sprintf('format%s', name)]) {
+ if (typeof text === 'string') {
+ this.options[sprintf('format%s', name)] = function () {
+ return text;
+ };
+ } else if (typeof text === 'function') {
+ this.options[sprintf('format%s', name)] = text;
+ }
+ }
+ this.initToolbar();
+ this.initPagination();
+ this.initBody();
+ };
+
+ // BOOTSTRAP TABLE PLUGIN DEFINITION
+ // =======================
+
+ var allowedMethods = [
+ 'getOptions',
+ 'getSelections', 'getAllSelections', 'getData',
+ 'load', 'append', 'prepend', 'remove', 'removeAll',
+ 'insertRow', 'updateRow', 'updateCell', 'updateByUniqueId', 'removeByUniqueId',
+ 'getRowByUniqueId', 'showRow', 'hideRow', 'getRowsHidden',
+ 'mergeCells',
+ 'checkAll', 'uncheckAll', 'checkInvert',
+ 'check', 'uncheck',
+ 'checkBy', 'uncheckBy',
+ 'refresh',
+ 'resetView',
+ 'resetWidth',
+ 'destroy',
+ 'showLoading', 'hideLoading',
+ 'showColumn', 'hideColumn', 'getHiddenColumns',
+ 'filterBy',
+ 'scrollTo',
+ 'getScrollPosition',
+ 'selectPage', 'prevPage', 'nextPage',
+ 'togglePagination',
+ 'toggleView',
+ 'refreshOptions',
+ 'resetSearch',
+ 'expandRow', 'collapseRow', 'expandAllRows', 'collapseAllRows',
+ 'updateFormatText'
+ ];
+
+ $.fn.bootstrapTable = function (option) {
+ var value,
+ args = Array.prototype.slice.call(arguments, 1);
+
+ this.each(function () {
+ var $this = $(this),
+ data = $this.data('bootstrap.table'),
+ options = $.extend({}, BootstrapTable.DEFAULTS, $this.data(),
+ typeof option === 'object' && option);
+
+ if (typeof option === 'string') {
+ if ($.inArray(option, allowedMethods) < 0) {
+ throw new Error("Unknown method: " + option);
+ }
+
+ if (!data) {
+ return;
+ }
+
+ value = data[option].apply(data, args);
+
+ if (option === 'destroy') {
+ $this.removeData('bootstrap.table');
+ }
+ }
+
+ if (!data) {
+ $this.data('bootstrap.table', (data = new BootstrapTable(this, options)));
+ }
+ });
+
+ return typeof value === 'undefined' ? this : value;
+ };
+
+ $.fn.bootstrapTable.Constructor = BootstrapTable;
+ $.fn.bootstrapTable.defaults = BootstrapTable.DEFAULTS;
+ $.fn.bootstrapTable.columnDefaults = BootstrapTable.COLUMN_DEFAULTS;
+ $.fn.bootstrapTable.locales = BootstrapTable.LOCALES;
+ $.fn.bootstrapTable.methods = allowedMethods;
+ $.fn.bootstrapTable.utils = {
+ sprintf: sprintf,
+ getFieldIndex: getFieldIndex,
+ compareObjects: compareObjects,
+ calculateObjectValue: calculateObjectValue
+ };
+
+ // BOOTSTRAP TABLE INIT
+ // =======================
+
+ $(function () {
+ $('[data-toggle="table"]').bootstrapTable();
+ });
+ }(jQuery);
+}));
\ No newline at end of file
diff --git a/src/assets/plugins/bootstrap-table/js/extensions/editable/bootstrap-table-editable.js b/src/assets/plugins/bootstrap-table/js/extensions/editable/bootstrap-table-editable.js
new file mode 100644
index 0000000..61f8022
--- /dev/null
+++ b/src/assets/plugins/bootstrap-table/js/extensions/editable/bootstrap-table-editable.js
@@ -0,0 +1,146 @@
+/**
+ * @author zhixin wen
+ * extensions: https://github.com/vitalets/x-editable
+ */
+
+(function (root, factory) {
+ var define;
+ if (typeof define === 'function' && define.amd) {
+ // AMD. Register as an anonymous module unless amdModuleId is set
+ define(["jquery"], function (a0) {
+ return (factory(a0));
+ });
+ } else if (typeof exports === 'object') {
+ // Node. Does not work with strict CommonJS, but
+ // only CommonJS-like environments that support module.exports,
+ // like Node.
+ module.exports = factory(require("jquery"));
+ } else {
+ factory(jQuery);
+ }
+}(this, function (jQuery) {
+
+ !function ($) {
+
+ 'use strict';
+
+ $.extend($.fn.bootstrapTable.defaults, {
+ editable: true,
+ onEditableInit: function () {
+ return false;
+ },
+ onEditableSave: function (field, row, oldValue, $el) {
+ return false;
+ },
+ onEditableShown: function (field, row, $el, editable) {
+ return false;
+ },
+ onEditableHidden: function (field, row, $el, reason) {
+ return false;
+ }
+ });
+
+ $.extend($.fn.bootstrapTable.Constructor.EVENTS, {
+ 'editable-init.bs.table': 'onEditableInit',
+ 'editable-save.bs.table': 'onEditableSave',
+ 'editable-shown.bs.table': 'onEditableShown',
+ 'editable-hidden.bs.table': 'onEditableHidden'
+ });
+
+ var BootstrapTable = $.fn.bootstrapTable.Constructor,
+ _initTable = BootstrapTable.prototype.initTable,
+ _initBody = BootstrapTable.prototype.initBody;
+
+ BootstrapTable.prototype.initTable = function () {
+ var that = this;
+ _initTable.apply(this, Array.prototype.slice.apply(arguments));
+
+ if (!this.options.editable) {
+ return;
+ }
+
+ $.each(this.columns, function (i, column) {
+ if (!column.editable) {
+ return;
+ }
+
+ var editableOptions = {}, editableDataMarkup = [], editableDataPrefix = 'editable-';
+
+ var processDataOptions = function (key, value) {
+ // Replace camel case with dashes.
+ var dashKey = key.replace(/([A-Z])/g, function ($1) { return "-" + $1.toLowerCase(); });
+ if (dashKey.slice(0, editableDataPrefix.length) == editableDataPrefix) {
+ var dataKey = dashKey.replace(editableDataPrefix, 'data-');
+ editableOptions[dataKey] = value;
+ }
+ };
+
+ $.each(that.options, processDataOptions);
+
+ var _formatter = column.formatter;
+ column.formatter = function (value, row, index) {
+ var result = _formatter ? _formatter(value, row, index) : value;
+
+ $.each(column, processDataOptions);
+
+ $.each(editableOptions, function (key, value) {
+ editableDataMarkup.push(' ' + key + '="' + value + '"');
+ });
+
+ return ['' + ' '
+ ].join('');
+ };
+ });
+ };
+
+ BootstrapTable.prototype.initBody = function () {
+ var that = this;
+ _initBody.apply(this, Array.prototype.slice.apply(arguments));
+
+ if (!this.options.editable) {
+ return;
+ }
+
+ $.each(this.columns, function (i, column) {
+ if (!column.editable) {
+ return;
+ }
+
+ that.$body.find('a[data-name="' + column.field + '"]').editable(column.editable)
+ .off('save').on('save', function (e, params) {
+ var data = that.getData(),
+ index = $(this).parents('tr[data-index]').data('index'),
+ row = data[index],
+ oldValue = row[column.field];
+
+ $(this).data('value', params.submitValue);
+ row[column.field] = params.submitValue;
+ that.trigger('editable-save', column.field, row, oldValue, $(this));
+ });
+ that.$body.find('a[data-name="' + column.field + '"]').editable(column.editable)
+ .off('shown').on('shown', function (e, editable) {
+ var data = that.getData(),
+ index = $(this).parents('tr[data-index]').data('index'),
+ row = data[index];
+
+ that.trigger('editable-shown', column.field, row, $(this), editable);
+ });
+ that.$body.find('a[data-name="' + column.field + '"]').editable(column.editable)
+ .off('hidden').on('hidden', function (e, reason) {
+ var data = that.getData(),
+ index = $(this).parents('tr[data-index]').data('index'),
+ row = data[index];
+
+ that.trigger('editable-hidden', column.field, row, $(this), reason);
+ });
+ });
+ this.trigger('editable-init');
+ };
+
+ }(jQuery);
+}));
\ No newline at end of file
diff --git a/src/assets/plugins/bootstrap-table/js/locale/bootstrap-table-zh-CN.js b/src/assets/plugins/bootstrap-table/js/locale/bootstrap-table-zh-CN.js
new file mode 100644
index 0000000..dc8e061
--- /dev/null
+++ b/src/assets/plugins/bootstrap-table/js/locale/bootstrap-table-zh-CN.js
@@ -0,0 +1,60 @@
+/**
+ * Bootstrap Table Chinese translation
+ * Author: Zhixin Wen
+ */
+
+(function (root, factory) {
+ var define;
+ if (typeof define === 'function' && define.amd) {
+ // AMD. Register as an anonymous module unless amdModuleId is set
+ define(["jquery"], function (a0) {
+ return (factory(a0));
+ });
+ } else if (typeof exports === 'object') {
+ // Node. Does not work with strict CommonJS, but
+ // only CommonJS-like environments that support module.exports,
+ // like Node.
+ module.exports = factory(require("jquery"));
+ } else {
+ factory(jQuery);
+ }
+}(this, function (jQuery) {
+
+ (function ($) {
+ 'use strict';
+
+ $.fn.bootstrapTable.locales['zh-CN'] = {
+ formatLoadingMessage: function () {
+ return '正在努力地加载数据中,请稍候……';
+ },
+ formatRecordsPerPage: function (pageNumber) {
+ return '每页显示 ' + pageNumber + ' 条记录';
+ },
+ formatShowingRows: function (pageFrom, pageTo, totalRows) {
+ return '显示第 ' + pageFrom + ' 到第 ' + pageTo + ' 条记录,总共 ' + totalRows + ' 条记录';
+ },
+ formatSearch: function () {
+ return '搜索';
+ },
+ formatNoMatches: function () {
+ return '没有找到匹配的记录';
+ },
+ formatPaginationSwitch: function () {
+ return '隐藏/显示分页';
+ },
+ formatRefresh: function () {
+ return '刷新';
+ },
+ formatToggle: function () {
+ return '切换';
+ },
+ formatColumns: function () {
+ return '列';
+ }
+ };
+
+ $.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['zh-CN']);
+
+ })(jQuery);
+}));
+
diff --git a/src/assets/plugins/bootstrap-treeview/css/bootstrap-treeview.min.css b/src/assets/plugins/bootstrap-treeview/css/bootstrap-treeview.min.css
new file mode 100644
index 0000000..0090fc5
--- /dev/null
+++ b/src/assets/plugins/bootstrap-treeview/css/bootstrap-treeview.min.css
@@ -0,0 +1,18 @@
+.treeview .list-group-item {
+ cursor: pointer
+}
+
+.treeview span.indent {
+ margin-left: 10px;
+ margin-right: 10px
+}
+
+.treeview span.icon {
+ width: 12px;
+ margin-right: 5px
+}
+
+.treeview .node-disabled {
+ color: silver;
+ cursor: not-allowed
+}
\ No newline at end of file
diff --git a/src/assets/plugins/bootstrap-treeview/js/bootstrap-treeview.min.js b/src/assets/plugins/bootstrap-treeview/js/bootstrap-treeview.min.js
new file mode 100644
index 0000000..ccfc1de
--- /dev/null
+++ b/src/assets/plugins/bootstrap-treeview/js/bootstrap-treeview.min.js
@@ -0,0 +1,593 @@
+!function(a, b, c, d) {
+ "use strict";
+ var e = "treeview"
+ , f = {};
+ f.settings = {
+ injectStyle: !0,
+ levels: 2,
+ expandIcon: "glyphicon glyphicon-plus",
+ collapseIcon: "glyphicon glyphicon-minus",
+ emptyIcon: "glyphicon",
+ nodeIcon: "",
+ selectedIcon: "",
+ checkedIcon: "glyphicon glyphicon-check",
+ uncheckedIcon: "glyphicon glyphicon-unchecked",
+ color: d,
+ backColor: d,
+ borderColor: d,
+ onhoverColor: "#F5F5F5",
+ selectedColor: "#FFFFFF",
+ selectedBackColor: "#428bca",
+ searchResultColor: "#D9534F",
+ searchResultBackColor: d,
+ enableLinks: !1,
+ highlightSelected: !0,
+ highlightSearchResults: !0,
+ showBorder: !0,
+ showIcon: !0,
+ showCheckbox: !1,
+ showTags: !1,
+ multiSelect: !1,
+ onNodeChecked: d,
+ onNodeCollapsed: d,
+ onNodeDisabled: d,
+ onNodeEnabled: d,
+ onNodeExpanded: d,
+ onNodeSelected: d,
+ onNodeUnchecked: d,
+ onNodeUnselected: d,
+ onSearchComplete: d,
+ onSearchCleared: d
+ },
+ f.options = {
+ silent: !1,
+ ignoreChildren: !1
+ },
+ f.searchOptions = {
+ ignoreCase: !0,
+ exactMatch: !1,
+ revealResults: !0
+ };
+ var g = function(b, c) {
+ return this.$element = a(b),
+ this.elementId = b.id,
+ this.styleId = this.elementId + "-style",
+ this.init(c),
+ {
+ options: this.options,
+ init: a.proxy(this.init, this),
+ remove: a.proxy(this.remove, this),
+ getNode: a.proxy(this.getNode, this),
+ getParent: a.proxy(this.getParent, this),
+ getSiblings: a.proxy(this.getSiblings, this),
+ getSelected: a.proxy(this.getSelected, this),
+ getUnselected: a.proxy(this.getUnselected, this),
+ getExpanded: a.proxy(this.getExpanded, this),
+ getCollapsed: a.proxy(this.getCollapsed, this),
+ getChecked: a.proxy(this.getChecked, this),
+ getUnchecked: a.proxy(this.getUnchecked, this),
+ getDisabled: a.proxy(this.getDisabled, this),
+ getEnabled: a.proxy(this.getEnabled, this),
+ selectNode: a.proxy(this.selectNode, this),
+ unselectNode: a.proxy(this.unselectNode, this),
+ toggleNodeSelected: a.proxy(this.toggleNodeSelected, this),
+ collapseAll: a.proxy(this.collapseAll, this),
+ collapseNode: a.proxy(this.collapseNode, this),
+ expandAll: a.proxy(this.expandAll, this),
+ expandNode: a.proxy(this.expandNode, this),
+ toggleNodeExpanded: a.proxy(this.toggleNodeExpanded, this),
+ revealNode: a.proxy(this.revealNode, this),
+ checkAll: a.proxy(this.checkAll, this),
+ checkNode: a.proxy(this.checkNode, this),
+ uncheckAll: a.proxy(this.uncheckAll, this),
+ uncheckNode: a.proxy(this.uncheckNode, this),
+ toggleNodeChecked: a.proxy(this.toggleNodeChecked, this),
+ disableAll: a.proxy(this.disableAll, this),
+ disableNode: a.proxy(this.disableNode, this),
+ enableAll: a.proxy(this.enableAll, this),
+ enableNode: a.proxy(this.enableNode, this),
+ toggleNodeDisabled: a.proxy(this.toggleNodeDisabled, this),
+ search: a.proxy(this.search, this),
+ clearSearch: a.proxy(this.clearSearch, this)
+ }
+ };
+ g.prototype.init = function(b) {
+ this.tree = [],
+ this.nodes = [],
+ b.data && ("string" == typeof b.data && (b.data = a.parseJSON(b.data)),
+ this.tree = a.extend(!0, [], b.data),
+ delete b.data),
+ this.options = a.extend({}, f.settings, b),
+ this.destroy(),
+ this.subscribeEvents(),
+ this.setInitialStates({
+ nodes: this.tree
+ }, 0),
+ this.render()
+ }
+ ,
+ g.prototype.remove = function() {
+ this.destroy(),
+ a.removeData(this, e),
+ a("#" + this.styleId).remove()
+ }
+ ,
+ g.prototype.destroy = function() {
+ this.initialized && (this.$wrapper.remove(),
+ this.$wrapper = null,
+ this.unsubscribeEvents(),
+ this.initialized = !1)
+ }
+ ,
+ g.prototype.unsubscribeEvents = function() {
+ this.$element.off("click"),
+ this.$element.off("nodeChecked"),
+ this.$element.off("nodeCollapsed"),
+ this.$element.off("nodeDisabled"),
+ this.$element.off("nodeEnabled"),
+ this.$element.off("nodeExpanded"),
+ this.$element.off("nodeSelected"),
+ this.$element.off("nodeUnchecked"),
+ this.$element.off("nodeUnselected"),
+ this.$element.off("searchComplete"),
+ this.$element.off("searchCleared")
+ }
+ ,
+ g.prototype.subscribeEvents = function() {
+ this.unsubscribeEvents(),
+ this.$element.on("click", a.proxy(this.clickHandler, this)),
+ "function" == typeof this.options.onNodeChecked && this.$element.on("nodeChecked", this.options.onNodeChecked),
+ "function" == typeof this.options.onNodeCollapsed && this.$element.on("nodeCollapsed", this.options.onNodeCollapsed),
+ "function" == typeof this.options.onNodeDisabled && this.$element.on("nodeDisabled", this.options.onNodeDisabled),
+ "function" == typeof this.options.onNodeEnabled && this.$element.on("nodeEnabled", this.options.onNodeEnabled),
+ "function" == typeof this.options.onNodeExpanded && this.$element.on("nodeExpanded", this.options.onNodeExpanded),
+ "function" == typeof this.options.onNodeSelected && this.$element.on("nodeSelected", this.options.onNodeSelected),
+ "function" == typeof this.options.onNodeUnchecked && this.$element.on("nodeUnchecked", this.options.onNodeUnchecked),
+ "function" == typeof this.options.onNodeUnselected && this.$element.on("nodeUnselected", this.options.onNodeUnselected),
+ "function" == typeof this.options.onSearchComplete && this.$element.on("searchComplete", this.options.onSearchComplete),
+ "function" == typeof this.options.onSearchCleared && this.$element.on("searchCleared", this.options.onSearchCleared)
+ }
+ ,
+ g.prototype.setInitialStates = function(b, c) {
+ if (b.nodes) {
+ c += 1;
+ var d = b
+ , e = this;
+ a.each(b.nodes, function(a, b) {
+ b.nodeId = e.nodes.length,
+ b.parentId = d.nodeId,
+ Object.prototype.hasOwnProperty.call(b, "selectable") || (b.selectable = !0),
+ b.state = b.state || {},
+ Object.prototype.hasOwnProperty.call(b.state, "checked") || (b.state.checked = !1),
+ Object.prototype.hasOwnProperty.call(b.state, "disabled") || (b.state.disabled = !1),
+ Object.prototype.hasOwnProperty.call(b.state, "expanded") || (!b.state.disabled && c < e.options.levels && b.nodes && b.nodes.length > 0 ? b.state.expanded = !0 : b.state.expanded = !1),
+ Object.prototype.hasOwnProperty.call(b.state, "selected") || (b.state.selected = !1),
+ e.nodes.push(b),
+ b.nodes && e.setInitialStates(b, c)
+ })
+ }
+ }
+ ,
+ g.prototype.clickHandler = function(b) {
+ this.options.enableLinks || b.preventDefault();
+ var c = a(b.target)
+ , d = this.findNode(c);
+ if (d && !d.state.disabled) {
+ var e = c.attr("class") ? c.attr("class").split(" ") : [];
+ -1 !== e.indexOf("expand-icon") ? (this.toggleExpandedState(d, f.options),
+ this.render()) : -1 !== e.indexOf("check-icon") ? (this.toggleCheckedState(d, f.options),
+ this.render()) : (d.selectable ? this.toggleSelectedState(d, f.options) : this.toggleExpandedState(d, f.options),
+ this.render())
+ }
+ }
+ ,
+ g.prototype.findNode = function(a) {
+ var b = a.closest("li.list-group-item").attr("data-nodeid")
+ , c = this.nodes[b];
+ return c || console.log("Error: node does not exist"),
+ c
+ }
+ ,
+ g.prototype.toggleExpandedState = function(a, b) {
+ a && this.setExpandedState(a, !a.state.expanded, b)
+ }
+ ,
+ g.prototype.setExpandedState = function(b, c, d) {
+ c !== b.state.expanded && (c && b.nodes ? (b.state.expanded = !0,
+ d.silent || this.$element.trigger("nodeExpanded", a.extend(!0, {}, b))) : c || (b.state.expanded = !1,
+ d.silent || this.$element.trigger("nodeCollapsed", a.extend(!0, {}, b)),
+ b.nodes && !d.ignoreChildren && a.each(b.nodes, a.proxy(function(a, b) {
+ this.setExpandedState(b, !1, d)
+ }, this))))
+ }
+ ,
+ g.prototype.toggleSelectedState = function(a, b) {
+ a && this.setSelectedState(a, !a.state.selected, b)
+ }
+ ,
+ g.prototype.setSelectedState = function(b, c, d) {
+ c !== b.state.selected && (c ? (this.options.multiSelect || a.each(this.findNodes("true", "g", "state.selected"), a.proxy(function(a, b) {
+ this.setSelectedState(b, !1, d)
+ }, this)),
+ b.state.selected = !0,
+ d.silent || this.$element.trigger("nodeSelected", a.extend(!0, {}, b))) : (b.state.selected = !1,
+ d.silent || this.$element.trigger("nodeUnselected", a.extend(!0, {}, b))))
+ }
+ ,
+ g.prototype.toggleCheckedState = function(a, b) {
+ a && this.setCheckedState(a, !a.state.checked, b)
+ }
+ ,
+ g.prototype.setCheckedState = function(b, c, d) {
+ c !== b.state.checked && (c ? (b.state.checked = !0,
+ d.silent || this.$element.trigger("nodeChecked", a.extend(!0, {}, b))) : (b.state.checked = !1,
+ d.silent || this.$element.trigger("nodeUnchecked", a.extend(!0, {}, b))))
+ }
+ ,
+ g.prototype.setDisabledState = function(b, c, d) {
+ c !== b.state.disabled && (c ? (b.state.disabled = !0,
+ this.setExpandedState(b, !1, d),
+ this.setSelectedState(b, !1, d),
+ this.setCheckedState(b, !1, d),
+ d.silent || this.$element.trigger("nodeDisabled", a.extend(!0, {}, b))) : (b.state.disabled = !1,
+ d.silent || this.$element.trigger("nodeEnabled", a.extend(!0, {}, b))))
+ }
+ ,
+ g.prototype.render = function() {
+ this.initialized || (this.$element.addClass(e),
+ this.$wrapper = a(this.template.list),
+ this.injectStyle(),
+ this.initialized = !0),
+ this.$element.empty().append(this.$wrapper.empty()),
+ this.buildTree(this.tree, 0)
+ }
+ ,
+ g.prototype.buildTree = function(b, c) {
+ if (b) {
+ c += 1;
+ var d = this;
+ a.each(b, function(b, e) {
+ for (var f = a(d.template.item).addClass("node-" + d.elementId).addClass(e.state.checked ? "node-checked" : "").addClass(e.state.disabled ? "node-disabled" : "").addClass(e.state.selected ? "node-selected" : "").addClass(e.searchResult ? "search-result" : "").attr("data-nodeid", e.nodeId).attr("style", d.buildStyleOverride(e)), g = 0; c - 1 > g; g++)
+ f.append(d.template.indent);
+ var h = [];
+ if (e.nodes ? (h.push("expand-icon"),
+ h.push(e.state.expanded ? d.options.collapseIcon : d.options.expandIcon)) : h.push(d.options.emptyIcon),
+ f.append(a(d.template.icon).addClass(h.join(" "))),
+ d.options.showIcon) {
+ h = ["node-icon"];
+ h.push(e.icon || d.options.nodeIcon),
+ e.state.selected && (h.pop(),
+ h.push(e.selectedIcon || d.options.selectedIcon || e.icon || d.options.nodeIcon)),
+ f.append(a(d.template.icon).addClass(h.join(" ")))
+ }
+ if (d.options.showCheckbox) {
+ h = ["check-icon"];
+ h.push(e.state.checked ? d.options.checkedIcon : d.options.uncheckedIcon),
+ f.append(a(d.template.icon).addClass(h.join(" ")))
+ }
+ return f.append(d.options.enableLinks ? a(d.template.link).attr("href", e.href).append(e.text) : e.text),
+ d.options.showTags && e.tags && a.each(e.tags, function(b, c) {
+ f.append(a(d.template.badge).append(c))
+ }),
+ d.$wrapper.append(f),
+ e.nodes && e.state.expanded && !e.state.disabled ? d.buildTree(e.nodes, c) : void 0
+ })
+ }
+ }
+ ,
+ g.prototype.buildStyleOverride = function(a) {
+ if (a.state.disabled)
+ return "";
+ var b = a.color
+ , c = a.backColor;
+ return this.options.highlightSelected && a.state.selected && (this.options.selectedColor && (b = this.options.selectedColor),
+ this.options.selectedBackColor && (c = this.options.selectedBackColor)),
+ this.options.highlightSearchResults && a.searchResult && !a.state.disabled && (this.options.searchResultColor && (b = this.options.searchResultColor),
+ this.options.searchResultBackColor && (c = this.options.searchResultBackColor)),
+ "color:" + b + ";background-color:" + c + ";"
+ }
+ ,
+ g.prototype.injectStyle = function() {
+ this.options.injectStyle && !c.getElementById(this.styleId) && a('").appendTo("head")
+ }
+ ,
+ g.prototype.buildStyle = function() {
+ var a = ".node-" + this.elementId + "{";
+ return this.options.color && (a += "color:" + this.options.color + ";"),
+ this.options.backColor && (a += "background-color:" + this.options.backColor + ";"),
+ this.options.showBorder ? this.options.borderColor && (a += "border:1px solid " + this.options.borderColor + ";") : a += "border:none;",
+ a += "}",
+ this.options.onhoverColor && (a += ".node-" + this.elementId + ":not(.node-disabled):hover{background-color:" + this.options.onhoverColor + ";}"),
+ this.css + a
+ }
+ ,
+ g.prototype.template = {
+ list: '',
+ item: ' ',
+ indent: ' ',
+ icon: ' ',
+ link: ' ',
+ badge: ' '
+ },
+ g.prototype.css = ".treeview .list-group-item{cursor:pointer}.treeview span.indent{margin-left:10px;margin-right:10px}.treeview span.icon{width:12px;margin-right:5px}.treeview .node-disabled{color:silver;cursor:not-allowed}",
+ g.prototype.getNode = function(a) {
+ return this.nodes[a]
+ }
+ ,
+ g.prototype.getParent = function(a) {
+ var b = this.identifyNode(a);
+ return this.nodes[b.parentId]
+ }
+ ,
+ g.prototype.getSiblings = function(a) {
+ var b = this.identifyNode(a)
+ , c = this.getParent(b)
+ , d = c ? c.nodes : this.tree;
+ return d.filter(function(a) {
+ return a.nodeId !== b.nodeId
+ })
+ }
+ ,
+ g.prototype.getSelected = function() {
+ return this.findNodes("true", "g", "state.selected")
+ }
+ ,
+ g.prototype.getUnselected = function() {
+ return this.findNodes("false", "g", "state.selected")
+ }
+ ,
+ g.prototype.getExpanded = function() {
+ return this.findNodes("true", "g", "state.expanded")
+ }
+ ,
+ g.prototype.getCollapsed = function() {
+ return this.findNodes("false", "g", "state.expanded")
+ }
+ ,
+ g.prototype.getChecked = function() {
+ return this.findNodes("true", "g", "state.checked")
+ }
+ ,
+ g.prototype.getUnchecked = function() {
+ return this.findNodes("false", "g", "state.checked")
+ }
+ ,
+ g.prototype.getDisabled = function() {
+ return this.findNodes("true", "g", "state.disabled")
+ }
+ ,
+ g.prototype.getEnabled = function() {
+ return this.findNodes("false", "g", "state.disabled")
+ }
+ ,
+ g.prototype.selectNode = function(b, c) {
+ this.forEachIdentifier(b, c, a.proxy(function(a, b) {
+ this.setSelectedState(a, !0, b)
+ }, this)),
+ this.render()
+ }
+ ,
+ g.prototype.unselectNode = function(b, c) {
+ this.forEachIdentifier(b, c, a.proxy(function(a, b) {
+ this.setSelectedState(a, !1, b)
+ }, this)),
+ this.render()
+ }
+ ,
+ g.prototype.toggleNodeSelected = function(b, c) {
+ this.forEachIdentifier(b, c, a.proxy(function(a, b) {
+ this.toggleSelectedState(a, b)
+ }, this)),
+ this.render()
+ }
+ ,
+ g.prototype.collapseAll = function(b) {
+ var c = this.findNodes("true", "g", "state.expanded");
+ this.forEachIdentifier(c, b, a.proxy(function(a, b) {
+ this.setExpandedState(a, !1, b)
+ }, this)),
+ this.render()
+ }
+ ,
+ g.prototype.collapseNode = function(b, c) {
+ this.forEachIdentifier(b, c, a.proxy(function(a, b) {
+ this.setExpandedState(a, !1, b)
+ }, this)),
+ this.render()
+ }
+ ,
+ g.prototype.expandAll = function(b) {
+ if (b = a.extend({}, f.options, b),
+ b && b.levels)
+ this.expandLevels(this.tree, b.levels, b);
+ else {
+ var c = this.findNodes("false", "g", "state.expanded");
+ this.forEachIdentifier(c, b, a.proxy(function(a, b) {
+ this.setExpandedState(a, !0, b)
+ }, this))
+ }
+ this.render()
+ }
+ ,
+ g.prototype.expandNode = function(b, c) {
+ this.forEachIdentifier(b, c, a.proxy(function(a, b) {
+ this.setExpandedState(a, !0, b),
+ a.nodes && b && b.levels && this.expandLevels(a.nodes, b.levels - 1, b)
+ }, this)),
+ this.render()
+ }
+ ,
+ g.prototype.expandLevels = function(b, c, d) {
+ d = a.extend({}, f.options, d),
+ a.each(b, a.proxy(function(a, b) {
+ this.setExpandedState(b, c > 0 ? !0 : !1, d),
+ b.nodes && this.expandLevels(b.nodes, c - 1, d)
+ }, this))
+ }
+ ,
+ g.prototype.revealNode = function(b, c) {
+ this.forEachIdentifier(b, c, a.proxy(function(a, b) {
+ for (var c = this.getParent(a); c; )
+ this.setExpandedState(c, !0, b),
+ c = this.getParent(c)
+ }, this)),
+ this.render()
+ }
+ ,
+ g.prototype.toggleNodeExpanded = function(b, c) {
+ this.forEachIdentifier(b, c, a.proxy(function(a, b) {
+ this.toggleExpandedState(a, b)
+ }, this)),
+ this.render()
+ }
+ ,
+ g.prototype.checkAll = function(b) {
+ var c = this.findNodes("false", "g", "state.checked");
+ this.forEachIdentifier(c, b, a.proxy(function(a, b) {
+ this.setCheckedState(a, !0, b)
+ }, this)),
+ this.render()
+ }
+ ,
+ g.prototype.checkNode = function(b, c) {
+ this.forEachIdentifier(b, c, a.proxy(function(a, b) {
+ this.setCheckedState(a, !0, b)
+ }, this)),
+ this.render()
+ }
+ ,
+ g.prototype.uncheckAll = function(b) {
+ var c = this.findNodes("true", "g", "state.checked");
+ this.forEachIdentifier(c, b, a.proxy(function(a, b) {
+ this.setCheckedState(a, !1, b)
+ }, this)),
+ this.render()
+ }
+ ,
+ g.prototype.uncheckNode = function(b, c) {
+ this.forEachIdentifier(b, c, a.proxy(function(a, b) {
+ this.setCheckedState(a, !1, b)
+ }, this)),
+ this.render()
+ }
+ ,
+ g.prototype.toggleNodeChecked = function(b, c) {
+ this.forEachIdentifier(b, c, a.proxy(function(a, b) {
+ this.toggleCheckedState(a, b)
+ }, this)),
+ this.render()
+ }
+ ,
+ g.prototype.disableAll = function(b) {
+ var c = this.findNodes("false", "g", "state.disabled");
+ this.forEachIdentifier(c, b, a.proxy(function(a, b) {
+ this.setDisabledState(a, !0, b)
+ }, this)),
+ this.render()
+ }
+ ,
+ g.prototype.disableNode = function(b, c) {
+ this.forEachIdentifier(b, c, a.proxy(function(a, b) {
+ this.setDisabledState(a, !0, b)
+ }, this)),
+ this.render()
+ }
+ ,
+ g.prototype.enableAll = function(b) {
+ var c = this.findNodes("true", "g", "state.disabled");
+ this.forEachIdentifier(c, b, a.proxy(function(a, b) {
+ this.setDisabledState(a, !1, b)
+ }, this)),
+ this.render()
+ }
+ ,
+ g.prototype.enableNode = function(b, c) {
+ this.forEachIdentifier(b, c, a.proxy(function(a, b) {
+ this.setDisabledState(a, !1, b)
+ }, this)),
+ this.render()
+ }
+ ,
+ g.prototype.toggleNodeDisabled = function(b, c) {
+ this.forEachIdentifier(b, c, a.proxy(function(a, b) {
+ this.setDisabledState(a, !a.state.disabled, b)
+ }, this)),
+ this.render()
+ }
+ ,
+ g.prototype.forEachIdentifier = function(b, c, d) {
+ c = a.extend({}, f.options, c),
+ b instanceof Array || (b = [b]),
+ a.each(b, a.proxy(function(a, b) {
+ d(this.identifyNode(b), c)
+ }, this))
+ }
+ ,
+ g.prototype.identifyNode = function(a) {
+ return "number" == typeof a ? this.nodes[a] : a
+ }
+ ,
+ g.prototype.search = function(b, c) {
+ c = a.extend({}, f.searchOptions, c),
+ this.clearSearch({
+ render: !1
+ });
+ var d = [];
+ if (b && b.length > 0) {
+ c.exactMatch && (b = "^" + b + "$");
+ var e = "g";
+ c.ignoreCase && (e += "i"),
+ d = this.findNodes(b, e),
+ a.each(d, function(a, b) {
+ b.searchResult = !0
+ })
+ }
+ return c.revealResults ? this.revealNode(d) : this.render(),
+ this.$element.trigger("searchComplete", a.extend(!0, {}, d)),
+ d
+ }
+ ,
+ g.prototype.clearSearch = function(b) {
+ b = a.extend({}, {
+ render: !0
+ }, b);
+ var c = a.each(this.findNodes("true", "g", "searchResult"), function(a, b) {
+ b.searchResult = !1
+ });
+ b.render && this.render(),
+ this.$element.trigger("searchCleared", a.extend(!0, {}, c))
+ }
+ ,
+ g.prototype.findNodes = function(b, c, d) {
+ c = c || "g",
+ d = d || "text";
+ var e = this;
+ return a.grep(this.nodes, function(a) {
+ var f = e.getNodeValue(a, d);
+ return "string" == typeof f ? f.match(new RegExp(b,c)) : void 0
+ })
+ }
+ ,
+ g.prototype.getNodeValue = function(a, b) {
+ var c = b.indexOf(".");
+ if (c > 0) {
+ var e = a[b.substring(0, c)]
+ , f = b.substring(c + 1, b.length);
+ return this.getNodeValue(e, f)
+ }
+ return Object.prototype.hasOwnProperty.call(a, b) ? a[b].toString() : d
+ }
+ ;
+ var h = function(a) {
+ b.console && b.console.error(a)
+ };
+ a.fn[e] = function(b, c) {
+ var d;
+ return this.each(function() {
+ var f = a.data(this, e);
+ "string" == typeof b ? f ? a.isFunction(f[b]) && "_" !== b.charAt(0) ? (c instanceof Array || (c = [c]),
+ d = f[b].apply(f, c)) : h("No such method : " + b) : h("Not initialized, can not call method : " + b) : "boolean" == typeof b ? d = f : a.data(this, e, new g(this,a.extend(!0, {}, b)))
+ }),
+ d || this
+ }
+}(jQuery, window, document);
diff --git a/src/assets/plugins/clipboard/js/clipboard.min.js b/src/assets/plugins/clipboard/js/clipboard.min.js
new file mode 100644
index 0000000..106ebdb
--- /dev/null
+++ b/src/assets/plugins/clipboard/js/clipboard.min.js
@@ -0,0 +1,562 @@
+/*!
+ * clipboard.js v1.7.1
+ * https://zenorocha.github.io/clipboard.js
+ *
+ * Licensed MIT © Zeno Rocha
+ */
+!function(t) {
+ var define;
+ if ("object" == typeof exports && "undefined" != typeof module)
+ module.exports = t();
+ else if ("function" == typeof define && define.amd)
+ define([], t);
+ else {
+ var e;
+ e = "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof self ? self : this,
+ e.Clipboard = t()
+ }
+}(function() {
+ var t, e, n;
+ return function t(e, n, o) {
+ function i(a, c) {
+ if (!n[a]) {
+ if (!e[a]) {
+ var l = "function" == typeof require && require;
+ if (!c && l)
+ return l(a, !0);
+ if (r)
+ return r(a, !0);
+ var s = new Error("Cannot find module '" + a + "'");
+ throw s.code = "MODULE_NOT_FOUND",
+ s
+ }
+ var u = n[a] = {
+ exports: {}
+ };
+ e[a][0].call(u.exports, function(t) {
+ var n = e[a][1][t];
+ return i(n || t)
+ }, u, u.exports, t, e, n, o)
+ }
+ return n[a].exports
+ }
+ for (var r = "function" == typeof require && require, a = 0; a < o.length; a++)
+ i(o[a]);
+ return i
+ }({
+ 1: [function(t, e, n) {
+ function o(t, e) {
+ for (; t && t.nodeType !== i; ) {
+ if ("function" == typeof t.matches && t.matches(e))
+ return t;
+ t = t.parentNode
+ }
+ }
+ var i = 9;
+ if ("undefined" != typeof Element && !Element.prototype.matches) {
+ var r = Element.prototype;
+ r.matches = r.matchesSelector || r.mozMatchesSelector || r.msMatchesSelector || r.oMatchesSelector || r.webkitMatchesSelector
+ }
+ e.exports = o
+ }
+ , {}],
+ 2: [function(t, e, n) {
+ function o(t, e, n, o, r) {
+ var a = i.apply(this, arguments);
+ return t.addEventListener(n, a, r),
+ {
+ destroy: function() {
+ t.removeEventListener(n, a, r)
+ }
+ }
+ }
+ function i(t, e, n, o) {
+ return function(n) {
+ n.delegateTarget = r(n.target, e),
+ n.delegateTarget && o.call(t, n)
+ }
+ }
+ var r = t("./closest");
+ e.exports = o
+ }
+ , {
+ "./closest": 1
+ }],
+ 3: [function(t, e, n) {
+ n.node = function(t) {
+ return void 0 !== t && t instanceof HTMLElement && 1 === t.nodeType
+ }
+ ,
+ n.nodeList = function(t) {
+ var e = Object.prototype.toString.call(t);
+ return void 0 !== t && ("[object NodeList]" === e || "[object HTMLCollection]" === e) && "length"in t && (0 === t.length || n.node(t[0]))
+ }
+ ,
+ n.string = function(t) {
+ return "string" == typeof t || t instanceof String
+ }
+ ,
+ n.fn = function(t) {
+ return "[object Function]" === Object.prototype.toString.call(t)
+ }
+ }
+ , {}],
+ 4: [function(t, e, n) {
+ function o(t, e, n) {
+ if (!t && !e && !n)
+ throw new Error("Missing required arguments");
+ if (!c.string(e))
+ throw new TypeError("Second argument must be a String");
+ if (!c.fn(n))
+ throw new TypeError("Third argument must be a Function");
+ if (c.node(t))
+ return i(t, e, n);
+ if (c.nodeList(t))
+ return r(t, e, n);
+ if (c.string(t))
+ return a(t, e, n);
+ throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")
+ }
+ function i(t, e, n) {
+ return t.addEventListener(e, n),
+ {
+ destroy: function() {
+ t.removeEventListener(e, n)
+ }
+ }
+ }
+ function r(t, e, n) {
+ return Array.prototype.forEach.call(t, function(t) {
+ t.addEventListener(e, n)
+ }),
+ {
+ destroy: function() {
+ Array.prototype.forEach.call(t, function(t) {
+ t.removeEventListener(e, n)
+ })
+ }
+ }
+ }
+ function a(t, e, n) {
+ return l(document.body, t, e, n)
+ }
+ var c = t("./is")
+ , l = t("delegate");
+ e.exports = o
+ }
+ , {
+ "./is": 3,
+ delegate: 2
+ }],
+ 5: [function(t, e, n) {
+ function o(t) {
+ var e;
+ if ("SELECT" === t.nodeName)
+ t.focus(),
+ e = t.value;
+ else if ("INPUT" === t.nodeName || "TEXTAREA" === t.nodeName) {
+ var n = t.hasAttribute("readonly");
+ n || t.setAttribute("readonly", ""),
+ t.select(),
+ t.setSelectionRange(0, t.value.length),
+ n || t.removeAttribute("readonly"),
+ e = t.value
+ } else {
+ t.hasAttribute("contenteditable") && t.focus();
+ var o = window.getSelection()
+ , i = document.createRange();
+ i.selectNodeContents(t),
+ o.removeAllRanges(),
+ o.addRange(i),
+ e = o.toString()
+ }
+ return e
+ }
+ e.exports = o
+ }
+ , {}],
+ 6: [function(t, e, n) {
+ function o() {}
+ o.prototype = {
+ on: function(t, e, n) {
+ var o = this.e || (this.e = {});
+ return (o[t] || (o[t] = [])).push({
+ fn: e,
+ ctx: n
+ }),
+ this
+ },
+ once: function(t, e, n) {
+ function o() {
+ i.off(t, o),
+ e.apply(n, arguments)
+ }
+ var i = this;
+ return o._ = e,
+ this.on(t, o, n)
+ },
+ emit: function(t) {
+ var e = [].slice.call(arguments, 1)
+ , n = ((this.e || (this.e = {}))[t] || []).slice()
+ , o = 0
+ , i = n.length;
+ for (o; o < i; o++)
+ n[o].fn.apply(n[o].ctx, e);
+ return this
+ },
+ off: function(t, e) {
+ var n = this.e || (this.e = {})
+ , o = n[t]
+ , i = [];
+ if (o && e)
+ for (var r = 0, a = o.length; r < a; r++)
+ o[r].fn !== e && o[r].fn._ !== e && i.push(o[r]);
+ return i.length ? n[t] = i : delete n[t],
+ this
+ }
+ },
+ e.exports = o
+ }
+ , {}],
+ 7: [function(e, n, o) {
+ !function(i, r) {
+ if ("function" == typeof t && t.amd)
+ t(["module", "select"], r);
+ else if (void 0 !== o)
+ r(n, e("select"));
+ else {
+ var a = {
+ exports: {}
+ };
+ r(a, i.select),
+ i.clipboardAction = a.exports
+ }
+ }(this, function(t, e) {
+ "use strict";
+ function n(t) {
+ return t && t.__esModule ? t : {
+ default: t
+ }
+ }
+ function o(t, e) {
+ if (!(t instanceof e))
+ throw new TypeError("Cannot call a class as a function")
+ }
+ var i = n(e)
+ , r = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(t) {
+ return typeof t
+ }
+ : function(t) {
+ return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol" : typeof t
+ }
+ , a = function() {
+ function t(t, e) {
+ for (var n = 0; n < e.length; n++) {
+ var o = e[n];
+ o.enumerable = o.enumerable || !1,
+ o.configurable = !0,
+ "value"in o && (o.writable = !0),
+ Object.defineProperty(t, o.key, o)
+ }
+ }
+ return function(e, n, o) {
+ return n && t(e.prototype, n),
+ o && t(e, o),
+ e
+ }
+ }()
+ , c = function() {
+ function t(e) {
+ o(this, t),
+ this.resolveOptions(e),
+ this.initSelection()
+ }
+ return a(t, [{
+ key: "resolveOptions",
+ value: function t() {
+ var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {};
+ this.action = e.action,
+ this.container = e.container,
+ this.emitter = e.emitter,
+ this.target = e.target,
+ this.text = e.text,
+ this.trigger = e.trigger,
+ this.selectedText = ""
+ }
+ }, {
+ key: "initSelection",
+ value: function t() {
+ this.text ? this.selectFake() : this.target && this.selectTarget()
+ }
+ }, {
+ key: "selectFake",
+ value: function t() {
+ var e = this
+ , n = "rtl" == document.documentElement.getAttribute("dir");
+ this.removeFake(),
+ this.fakeHandlerCallback = function() {
+ return e.removeFake()
+ }
+ ,
+ this.fakeHandler = this.container.addEventListener("click", this.fakeHandlerCallback) || !0,
+ this.fakeElem = document.createElement("textarea"),
+ this.fakeElem.style.fontSize = "12pt",
+ this.fakeElem.style.border = "0",
+ this.fakeElem.style.padding = "0",
+ this.fakeElem.style.margin = "0",
+ this.fakeElem.style.position = "absolute",
+ this.fakeElem.style[n ? "right" : "left"] = "-9999px";
+ var o = window.pageYOffset || document.documentElement.scrollTop;
+ this.fakeElem.style.top = o + "px",
+ this.fakeElem.setAttribute("readonly", ""),
+ this.fakeElem.value = this.text,
+ this.container.appendChild(this.fakeElem),
+ this.selectedText = (0,
+ i.default)(this.fakeElem),
+ this.copyText()
+ }
+ }, {
+ key: "removeFake",
+ value: function t() {
+ this.fakeHandler && (this.container.removeEventListener("click", this.fakeHandlerCallback),
+ this.fakeHandler = null,
+ this.fakeHandlerCallback = null),
+ this.fakeElem && (this.container.removeChild(this.fakeElem),
+ this.fakeElem = null)
+ }
+ }, {
+ key: "selectTarget",
+ value: function t() {
+ this.selectedText = (0,
+ i.default)(this.target),
+ this.copyText()
+ }
+ }, {
+ key: "copyText",
+ value: function t() {
+ var e = void 0;
+ try {
+ e = document.execCommand(this.action)
+ } catch (t) {
+ e = !1
+ }
+ this.handleResult(e)
+ }
+ }, {
+ key: "handleResult",
+ value: function t(e) {
+ this.emitter.emit(e ? "success" : "error", {
+ action: this.action,
+ text: this.selectedText,
+ trigger: this.trigger,
+ clearSelection: this.clearSelection.bind(this)
+ })
+ }
+ }, {
+ key: "clearSelection",
+ value: function t() {
+ this.trigger && this.trigger.focus(),
+ window.getSelection().removeAllRanges()
+ }
+ }, {
+ key: "destroy",
+ value: function t() {
+ this.removeFake()
+ }
+ }, {
+ key: "action",
+ set: function t() {
+ var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "copy";
+ if (this._action = e,
+ "copy" !== this._action && "cut" !== this._action)
+ throw new Error('Invalid "action" value, use either "copy" or "cut"')
+ },
+ get: function t() {
+ return this._action
+ }
+ }, {
+ key: "target",
+ set: function t(e) {
+ if (void 0 !== e) {
+ if (!e || "object" !== (void 0 === e ? "undefined" : r(e)) || 1 !== e.nodeType)
+ throw new Error('Invalid "target" value, use a valid Element');
+ if ("copy" === this.action && e.hasAttribute("disabled"))
+ throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');
+ if ("cut" === this.action && (e.hasAttribute("readonly") || e.hasAttribute("disabled")))
+ throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes');
+ this._target = e
+ }
+ },
+ get: function t() {
+ return this._target
+ }
+ }]),
+ t
+ }();
+ t.exports = c
+ })
+ }
+ , {
+ select: 5
+ }],
+ 8: [function(e, n, o) {
+ !function(i, r) {
+ if ("function" == typeof t && t.amd)
+ t(["module", "./clipboard-action", "tiny-emitter", "good-listener"], r);
+ else if (void 0 !== o)
+ r(n, e("./clipboard-action"), e("tiny-emitter"), e("good-listener"));
+ else {
+ var a = {
+ exports: {}
+ };
+ r(a, i.clipboardAction, i.tinyEmitter, i.goodListener),
+ i.clipboard = a.exports
+ }
+ }(this, function(t, e, n, o) {
+ "use strict";
+ function i(t) {
+ return t && t.__esModule ? t : {
+ default: t
+ }
+ }
+ function r(t, e) {
+ if (!(t instanceof e))
+ throw new TypeError("Cannot call a class as a function")
+ }
+ function a(t, e) {
+ if (!t)
+ throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !e || "object" != typeof e && "function" != typeof e ? t : e
+ }
+ function c(t, e) {
+ if ("function" != typeof e && null !== e)
+ throw new TypeError("Super expression must either be null or a function, not " + typeof e);
+ t.prototype = Object.create(e && e.prototype, {
+ constructor: {
+ value: t,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }),
+ e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e)
+ }
+ function l(t, e) {
+ var n = "data-clipboard-" + t;
+ if (e.hasAttribute(n))
+ return e.getAttribute(n)
+ }
+ var s = i(e)
+ , u = i(n)
+ , f = i(o)
+ , d = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(t) {
+ return typeof t
+ }
+ : function(t) {
+ return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol" : typeof t
+ }
+ , h = function() {
+ function t(t, e) {
+ for (var n = 0; n < e.length; n++) {
+ var o = e[n];
+ o.enumerable = o.enumerable || !1,
+ o.configurable = !0,
+ "value"in o && (o.writable = !0),
+ Object.defineProperty(t, o.key, o)
+ }
+ }
+ return function(e, n, o) {
+ return n && t(e.prototype, n),
+ o && t(e, o),
+ e
+ }
+ }()
+ , p = function(t) {
+ function e(t, n) {
+ r(this, e);
+ var o = a(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this));
+ return o.resolveOptions(n),
+ o.listenClick(t),
+ o
+ }
+ return c(e, t),
+ h(e, [{
+ key: "resolveOptions",
+ value: function t() {
+ var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {};
+ this.action = "function" == typeof e.action ? e.action : this.defaultAction,
+ this.target = "function" == typeof e.target ? e.target : this.defaultTarget,
+ this.text = "function" == typeof e.text ? e.text : this.defaultText,
+ this.container = "object" === d(e.container) ? e.container : document.body
+ }
+ }, {
+ key: "listenClick",
+ value: function t(e) {
+ var n = this;
+ this.listener = (0,
+ f.default)(e, "click", function(t) {
+ return n.onClick(t)
+ })
+ }
+ }, {
+ key: "onClick",
+ value: function t(e) {
+ var n = e.delegateTarget || e.currentTarget;
+ this.clipboardAction && (this.clipboardAction = null),
+ this.clipboardAction = new s.default({
+ action: this.action(n),
+ target: this.target(n),
+ text: this.text(n),
+ container: this.container,
+ trigger: n,
+ emitter: this
+ })
+ }
+ }, {
+ key: "defaultAction",
+ value: function t(e) {
+ return l("action", e)
+ }
+ }, {
+ key: "defaultTarget",
+ value: function t(e) {
+ var n = l("target", e);
+ if (n)
+ return document.querySelector(n)
+ }
+ }, {
+ key: "defaultText",
+ value: function t(e) {
+ return l("text", e)
+ }
+ }, {
+ key: "destroy",
+ value: function t() {
+ this.listener.destroy(),
+ this.clipboardAction && (this.clipboardAction.destroy(),
+ this.clipboardAction = null)
+ }
+ }], [{
+ key: "isSupported",
+ value: function t() {
+ var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : ["copy", "cut"]
+ , n = "string" == typeof e ? [e] : e
+ , o = !!document.queryCommandSupported;
+ return n.forEach(function(t) {
+ o = o && !!document.queryCommandSupported(t)
+ }),
+ o
+ }
+ }]),
+ e
+ }(u.default);
+ t.exports = p
+ })
+ }
+ , {
+ "./clipboard-action": 7,
+ "good-listener": 4,
+ "tiny-emitter": 6
+ }]
+ }, {}, [8])(8)
+});
diff --git a/src/assets/plugins/jQuery-Validation-Engine/css/validationEngine.jquery.css b/src/assets/plugins/jQuery-Validation-Engine/css/validationEngine.jquery.css
new file mode 100644
index 0000000..d0ccf73
--- /dev/null
+++ b/src/assets/plugins/jQuery-Validation-Engine/css/validationEngine.jquery.css
@@ -0,0 +1,196 @@
+/* Z-INDEX */
+.formError {
+ z-index: 990;
+}
+
+.formError .formErrorContent {
+ z-index: 991;
+}
+
+.formError .formErrorArrow {
+ z-index: 996;
+}
+
+.ui-dialog .formError {
+ z-index: 5000;
+}
+
+.ui-dialog .formError .formErrorContent {
+ z-index: 5001;
+}
+
+.ui-dialog .formError .formErrorArrow {
+ z-index: 5006;
+}
+
+
+
+
+.inputContainer {
+ position: relative;
+ float: left;
+}
+
+.formError {
+ position: absolute;
+ top: 300px;
+ left: 300px;
+ display: block;
+ cursor: pointer;
+ text-align: left;
+}
+
+.formError.inline {
+ position: relative;
+ top: 0;
+ left: 0;
+ display: inline-block;
+}
+
+.ajaxSubmit {
+ padding: 20px;
+ background: #55ea55;
+ border: 1px solid #999;
+ display: none;
+}
+
+.formError .formErrorContent {
+ width: 100%;
+ background: #ee0101;
+ position: relative;
+ color: #fff;
+ min-width: 120px;
+ font-size: 11px;
+ border: 2px solid #ddd;
+ box-shadow: 0 0 6px #000;
+ -moz-box-shadow: 0 0 6px #000;
+ -webkit-box-shadow: 0 0 6px #000;
+ -o-box-shadow: 0 0 6px #000;
+ padding: 4px 10px 4px 10px;
+ border-radius: 6px;
+ -moz-border-radius: 6px;
+ -webkit-border-radius: 6px;
+ -o-border-radius: 6px;
+}
+
+.formError.inline .formErrorContent {
+ box-shadow: none;
+ -moz-box-shadow: none;
+ -webkit-box-shadow: none;
+ -o-box-shadow: none;
+ border: none;
+ border-radius: 0;
+ -moz-border-radius: 0;
+ -webkit-border-radius: 0;
+ -o-border-radius: 0;
+}
+
+.greenPopup .formErrorContent {
+ background: #33be40;
+}
+
+.blackPopup .formErrorContent {
+ background: #393939;
+ color: #FFF;
+}
+
+.formError .formErrorArrow {
+ width: 15px;
+ margin: -2px 0 0 13px;
+ position: relative;
+}
+
+body[dir='rtl'] .formError .formErrorArrow,
+body.rtl .formError .formErrorArrow {
+ margin: -2px 13px 0 0;
+}
+
+.formError .formErrorArrowBottom {
+ box-shadow: none;
+ -moz-box-shadow: none;
+ -webkit-box-shadow: none;
+ -o-box-shadow: none;
+ margin: 0px 0 0 12px;
+ top: 2px;
+}
+
+.formError .formErrorArrow div {
+ border-left: 2px solid #ddd;
+ border-right: 2px solid #ddd;
+ box-shadow: 0 2px 3px #444;
+ -moz-box-shadow: 0 2px 3px #444;
+ -webkit-box-shadow: 0 2px 3px #444;
+ -o-box-shadow: 0 2px 3px #444;
+ font-size: 0px;
+ height: 1px;
+ background: #ee0101;
+ margin: 0 auto;
+ line-height: 0;
+ font-size: 0;
+ display: block;
+}
+
+.formError .formErrorArrowBottom div {
+ box-shadow: none;
+ -moz-box-shadow: none;
+ -webkit-box-shadow: none;
+ -o-box-shadow: none;
+}
+
+.greenPopup .formErrorArrow div {
+ background: #33be40;
+}
+
+.blackPopup .formErrorArrow div {
+ background: #393939;
+ color: #FFF;
+}
+
+.formError .formErrorArrow .line10 {
+ width: 13px;
+ border: none;
+}
+
+.formError .formErrorArrow .line9 {
+ width: 11px;
+ border: none;
+}
+
+.formError .formErrorArrow .line8 {
+ width: 11px;
+}
+
+.formError .formErrorArrow .line7 {
+ width: 9px;
+}
+
+.formError .formErrorArrow .line6 {
+ width: 7px;
+}
+
+.formError .formErrorArrow .line5 {
+ width: 5px;
+}
+
+.formError .formErrorArrow .line4 {
+ width: 3px;
+}
+
+.formError .formErrorArrow .line3 {
+ width: 1px;
+ border-left: 2px solid #ddd;
+ border-right: 2px solid #ddd;
+ border-bottom: 0 solid #ddd;
+}
+
+.formError .formErrorArrow .line2 {
+ width: 3px;
+ border: none;
+ background: #ddd;
+}
+
+.formError .formErrorArrow .line1 {
+ width: 1px;
+ border: none;
+ background: #ddd;
+}
\ No newline at end of file
diff --git a/src/assets/plugins/jQuery-Validation-Engine/js/jquery.validationEngine.js b/src/assets/plugins/jQuery-Validation-Engine/js/jquery.validationEngine.js
new file mode 100644
index 0000000..02803b0
--- /dev/null
+++ b/src/assets/plugins/jQuery-Validation-Engine/js/jquery.validationEngine.js
@@ -0,0 +1,2163 @@
+/*
+ * Inline Form Validation Engine 2.6.2, jQuery plugin
+ *
+ * Copyright(c) 2010, Cedric Dugas
+ * http://www.position-absolute.com
+ *
+ * 2.0 Rewrite by Olivier Refalo
+ * http://www.crionics.com
+ *
+ * Form validation engine allowing custom regex rules to be added.
+ * Licensed under the MIT License
+ */
+(function ($) {
+
+ "use strict";
+
+ var methods = {
+
+ /**
+ * Kind of the constructor, called before any action
+ * @param {Map} user options
+ */
+ init: function (options) {
+ var form = this;
+ if (!form.data('jqv') || form.data('jqv') == null) {
+ options = methods._saveOptions(form, options);
+ // bind all formError elements to close on click
+ $(document).on("click", ".formError", function () {
+ $(this).fadeOut(150, function () {
+ // remove prompt once invisible
+ $(this).closest('.formError').remove();
+ });
+ });
+ }
+ return this;
+ },
+ /**
+ * Attachs jQuery.validationEngine to form.submit and field.blur events
+ * Takes an optional params: a list of options
+ * ie. jQuery("#formID1").validationEngine('attach', {promptPosition : "centerRight"});
+ */
+ attach: function (userOptions) {
+
+ var form = this;
+ var options;
+
+ if (userOptions)
+ options = methods._saveOptions(form, userOptions);
+ else
+ options = form.data('jqv');
+
+ options.validateAttribute = (form.find("[data-validation-engine*=validate]").length) ? "data-validation-engine" : "class";
+ if (options.binded) {
+
+ // delegate fields
+ form.on(options.validationEventTrigger, "[" + options.validateAttribute + "*=validate]:not([type=checkbox]):not([type=radio]):not(.datepicker)", methods._onFieldEvent);
+ form.on("click", "[" + options.validateAttribute + "*=validate][type=checkbox],[" + options.validateAttribute + "*=validate][type=radio]", methods._onFieldEvent);
+ form.on(options.validationEventTrigger, "[" + options.validateAttribute + "*=validate][class*=datepicker]", { "delay": 300 }, methods._onFieldEvent);
+ }
+ if (options.autoPositionUpdate) {
+ $(window).bind("resize", {
+ "noAnimation": true,
+ "formElem": form
+ }, methods.updatePromptsPosition);
+ }
+ form.on("click", "a[data-validation-engine-skip], a[class*='validate-skip'], button[data-validation-engine-skip], button[class*='validate-skip'], input[data-validation-engine-skip], input[class*='validate-skip']", methods._submitButtonClick);
+ form.removeData('jqv_submitButton');
+
+ // bind form.submit
+ form.on("submit", methods._onSubmitEvent);
+ return this;
+ },
+ /**
+ * Unregisters any bindings that may point to jQuery.validaitonEngine
+ */
+ detach: function () {
+
+ var form = this;
+ var options = form.data('jqv');
+
+ // unbind fields
+ form.off(options.validationEventTrigger, "[" + options.validateAttribute + "*=validate]:not([type=checkbox]):not([type=radio]):not(.datepicker)", methods._onFieldEvent);
+ form.off("click", "[" + options.validateAttribute + "*=validate][type=checkbox],[" + options.validateAttribute + "*=validate][type=radio]", methods._onFieldEvent);
+ form.off(options.validationEventTrigger, "[" + options.validateAttribute + "*=validate][class*=datepicker]", methods._onFieldEvent);
+
+ // unbind form.submit
+ form.off("submit", methods._onSubmitEvent);
+ form.removeData('jqv');
+
+ form.off("click", "a[data-validation-engine-skip], a[class*='validate-skip'], button[data-validation-engine-skip], button[class*='validate-skip'], input[data-validation-engine-skip], input[class*='validate-skip']", methods._submitButtonClick);
+ form.removeData('jqv_submitButton');
+
+ if (options.autoPositionUpdate)
+ $(window).off("resize", methods.updatePromptsPosition);
+
+ return this;
+ },
+ /**
+ * Validates either a form or a list of fields, shows prompts accordingly.
+ * Note: There is no ajax form validation with this method, only field ajax validation are evaluated
+ *
+ * @return true if the form validates, false if it fails
+ */
+ validate: function (userOptions) {
+ var element = $(this);
+ var valid = null;
+ var options;
+
+ if (element.is("form") || element.hasClass("validationEngineContainer")) {
+ if (element.hasClass('validating')) {
+ // form is already validating.
+ // Should abort old validation and start new one. I don't know how to implement it.
+ return false;
+ } else {
+ element.addClass('validating');
+ if (userOptions)
+ options = methods._saveOptions(element, userOptions);
+ else
+ options = element.data('jqv');
+ valid = methods._validateFields(this);
+
+ // If the form doesn't validate, clear the 'validating' class before the user has a chance to submit again
+ setTimeout(function () {
+ element.removeClass('validating');
+ }, 100);
+ if (valid && options.onSuccess) {
+ options.onSuccess();
+ } else if (!valid && options.onFailure) {
+ options.onFailure();
+ }
+ }
+ } else if (element.is('form') || element.hasClass('validationEngineContainer')) {
+ element.removeClass('validating');
+ } else {
+ // field validation
+ var form = element.closest('form, .validationEngineContainer');
+ options = (form.data('jqv')) ? form.data('jqv') : $.validationEngine.defaults;
+ valid = methods._validateField(element, options);
+
+ if (valid && options.onFieldSuccess)
+ options.onFieldSuccess();
+ else if (options.onFieldFailure && options.InvalidFields.length > 0) {
+ options.onFieldFailure();
+ }
+
+ return !valid;
+ }
+ if (options.onValidationComplete) {
+ // !! ensures that an undefined return is interpreted as return false but allows a onValidationComplete() to possibly return true and have form continue processing
+ return !!options.onValidationComplete(form, valid);
+ }
+ return valid;
+ },
+ /**
+ * Redraw prompts position, useful when you change the DOM state when validating
+ */
+ updatePromptsPosition: function (event) {
+ var form;
+ if (event && this == window) {
+ form = event.data.formElem;
+ var noAnimation = event.data.noAnimation;
+ }
+ else
+ form = $(this.closest('form, .validationEngineContainer'));
+
+ var options = form.data('jqv');
+ // No option, take default one
+ if (!options)
+ options = methods._saveOptions(form, options);
+ form.find('[' + options.validateAttribute + '*=validate]').not(":disabled").each(function () {
+ var field = $(this);
+ if (options.prettySelect && field.is(":hidden"))
+ field = form.find("#" + options.usePrefix + field.attr('id') + options.useSuffix);
+ var prompt = methods._getPrompt(field);
+ var promptText = $(prompt).find(".formErrorContent").html();
+
+ if (prompt)
+ methods._updatePrompt(field, $(prompt), promptText, undefined, false, options, noAnimation);
+ });
+ return this;
+ },
+ /**
+ * Displays a prompt on a element.
+ * Note that the element needs an id!
+ *
+ * @param {String} promptText html text to display type
+ * @param {String} type the type of bubble: 'pass' (green), 'load' (black) anything else (red)
+ * @param {String} possible values topLeft, topRight, bottomLeft, centerRight, bottomRight
+ */
+ showPrompt: function (promptText, type, promptPosition, showArrow) {
+ var form = this.closest('form, .validationEngineContainer');
+ var options = form.data('jqv');
+ // No option, take default one
+ if (!options)
+ options = methods._saveOptions(this, options);
+ if (promptPosition)
+ options.promptPosition = promptPosition;
+ options.showArrow = showArrow == true;
+
+ methods._showPrompt(this, promptText, type, false, options);
+ return this;
+ },
+ /**
+ * Closes form error prompts, CAN be invidual
+ */
+ hide: function () {
+ var form = $(this).closest('form, .validationEngineContainer');
+ var options = form.data('jqv');
+ // No option, take default one
+ if (!options)
+ options = methods._saveOptions(form, options);
+ var fadeDuration = (options && options.fadeDuration) ? options.fadeDuration : 0.3;
+ var closingtag;
+
+ if (form.is("form") || form.hasClass("validationEngineContainer")) {
+ closingtag = "parentForm" + methods._getClassName($(form).attr("id"));
+ } else {
+ closingtag = methods._getClassName($(form).attr("id")) + "formError";
+ }
+ $('.' + closingtag).fadeTo(fadeDuration, 0, function () {
+ $(this).closest('.formError').remove();
+ });
+ return this;
+ },
+ /**
+ * Closes all error prompts on the page
+ */
+ hideAll: function () {
+ var form = this;
+ var options = form.data('jqv');
+ var duration = options ? options.fadeDuration : 300;
+ $('.formError').fadeTo(duration, 0, function () {
+ $(this).closest('.formError').remove();
+ });
+ return this;
+ },
+ /**
+ * Typically called when user exists a field using tab or a mouse click, triggers a field
+ * validation
+ */
+ _onFieldEvent: function (event) {
+ var field = $(this);
+ var form = field.closest('form, .validationEngineContainer');
+ var options = form.data('jqv');
+ // No option, take default one
+ if (!options)
+ options = methods._saveOptions(form, options);
+ options.eventTrigger = "field";
+
+ if (options.notEmpty == true) {
+
+ if (field.val().length > 0) {
+ // validate the current field
+ window.setTimeout(function () {
+ methods._validateField(field, options);
+ }, (event.data) ? event.data.delay : 0);
+
+ }
+
+ } else {
+
+ // validate the current field
+ window.setTimeout(function () {
+ methods._validateField(field, options);
+ }, (event.data) ? event.data.delay : 0);
+
+ }
+
+
+
+
+ },
+ /**
+ * Called when the form is submited, shows prompts accordingly
+ *
+ * @param {jqObject}
+ * form
+ * @return false if form submission needs to be cancelled
+ */
+ _onSubmitEvent: function () {
+ var form = $(this);
+ var options = form.data('jqv');
+
+ //check if it is trigger from skipped button
+ if (form.data("jqv_submitButton")) {
+ var submitButton = $("#" + form.data("jqv_submitButton"));
+ if (submitButton) {
+ if (submitButton.length > 0) {
+ if (submitButton.hasClass("validate-skip") || submitButton.attr("data-validation-engine-skip") == "true")
+ return true;
+ }
+ }
+ }
+
+ options.eventTrigger = "submit";
+
+ // validate each field
+ // (- skip field ajax validation, not necessary IF we will perform an ajax form validation)
+ var r = methods._validateFields(form);
+
+ if (r && options.ajaxFormValidation) {
+ methods._validateFormWithAjax(form, options);
+ // cancel form auto-submission - process with async call onAjaxFormComplete
+ return false;
+ }
+
+ if (options.onValidationComplete) {
+ // !! ensures that an undefined return is interpreted as return false but allows a onValidationComplete() to possibly return true and have form continue processing
+ return !!options.onValidationComplete(form, r);
+ }
+ return r;
+ },
+ /**
+ * Return true if the ajax field validations passed so far
+ * @param {Object} options
+ * @return true, is all ajax validation passed so far (remember ajax is async)
+ */
+ _checkAjaxStatus: function (options) {
+ var status = true;
+ $.each(options.ajaxValidCache, function (key, value) {
+ if (!value) {
+ status = false;
+ // break the each
+ return false;
+ }
+ });
+ return status;
+ },
+
+ /**
+ * Return true if the ajax field is validated
+ * @param {String} fieldid
+ * @param {Object} options
+ * @return true, if validation passed, false if false or doesn't exist
+ */
+ _checkAjaxFieldStatus: function (fieldid, options) {
+ return options.ajaxValidCache[fieldid] == true;
+ },
+ /**
+ * Validates form fields, shows prompts accordingly
+ *
+ * @param {jqObject}
+ * form
+ * @param {skipAjaxFieldValidation}
+ * boolean - when set to true, ajax field validation is skipped, typically used when the submit button is clicked
+ *
+ * @return true if form is valid, false if not, undefined if ajax form validation is done
+ */
+ _validateFields: function (form) {
+ var options = form.data('jqv');
+
+ // this variable is set to true if an error is found
+ var errorFound = false;
+
+ // Trigger hook, start validation
+ form.trigger("jqv.form.validating");
+ // first, evaluate status of non ajax fields
+ var first_err = null;
+ form.find('[' + options.validateAttribute + '*=validate]').not(":disabled").each(function () {
+ var field = $(this);
+ var names = [];
+ if ($.inArray(field.attr('name'), names) < 0) {
+ errorFound |= methods._validateField(field, options);
+ if (errorFound && first_err == null)
+ if (field.is(":hidden") && options.prettySelect)
+ first_err = field = form.find("#" + options.usePrefix + methods._jqSelector(field.attr('id')) + options.useSuffix);
+ else {
+
+ //Check if we need to adjust what element to show the prompt on
+ //and and such scroll to instead
+ if (field.data('jqv-prompt-at') instanceof jQuery) {
+ field = field.data('jqv-prompt-at');
+ } else if (field.data('jqv-prompt-at')) {
+ field = $(field.data('jqv-prompt-at'));
+ }
+ first_err = field;
+ }
+ if (options.doNotShowAllErrosOnSubmit)
+ return false;
+ names.push(field.attr('name'));
+
+ //if option set, stop checking validation rules after one error is found
+ if (options.showOneMessage == true && errorFound) {
+ return false;
+ }
+ }
+ });
+
+ // second, check to see if all ajax calls completed ok
+ // errorFound |= !methods._checkAjaxStatus(options);
+
+ // third, check status and scroll the container accordingly
+ form.trigger("jqv.form.result", [errorFound]);
+
+ if (errorFound) {
+ if (options.scroll) {
+ var destination = first_err.offset().top;
+ var fixleft = first_err.offset().left;
+
+ //prompt positioning adjustment support. Usage: positionType:Xshift,Yshift (for ex.: bottomLeft:+20 or bottomLeft:-20,+10)
+ var positionType = options.promptPosition;
+ if (typeof (positionType) == 'string' && positionType.indexOf(":") != -1)
+ positionType = positionType.substring(0, positionType.indexOf(":"));
+
+ if (positionType != "bottomRight" && positionType != "bottomLeft") {
+ var prompt_err = methods._getPrompt(first_err);
+ if (prompt_err) {
+ destination = prompt_err.offset().top;
+ }
+ }
+
+ // Offset the amount the page scrolls by an amount in px to accomodate fixed elements at top of page
+ if (options.scrollOffset) {
+ destination -= options.scrollOffset;
+ }
+
+ // get the position of the first error, there should be at least one, no need to check this
+ //var destination = form.find(".formError:not('.greenPopup'):first").offset().top;
+ if (options.isOverflown) {
+ var overflowDIV = $(options.overflownDIV);
+ if (!overflowDIV.length) return false;
+ var scrollContainerScroll = overflowDIV.scrollTop();
+ var scrollContainerPos = -parseInt(overflowDIV.offset().top);
+
+ destination += scrollContainerScroll + scrollContainerPos - 5;
+ var scrollContainer = $(options.overflownDIV).filter(":not(:animated)");
+
+ scrollContainer.animate({ scrollTop: destination }, 1100, function () {
+ if (options.focusFirstField) first_err.focus();
+ });
+
+ } else {
+ $("html, body").animate({
+ scrollTop: destination
+ }, 1100, function () {
+ if (options.focusFirstField) first_err.focus();
+ });
+ $("html, body").animate({ scrollLeft: fixleft }, 1100)
+ }
+
+ } else if (options.focusFirstField)
+ first_err.focus();
+ return false;
+ }
+ return true;
+ },
+ /**
+ * This method is called to perform an ajax form validation.
+ * During this process all the (field, value) pairs are sent to the server which returns a list of invalid fields or true
+ *
+ * @param {jqObject} form
+ * @param {Map} options
+ */
+ _validateFormWithAjax: function (form, options) {
+
+ var data = form.serialize();
+ var type = (options.ajaxFormValidationMethod) ? options.ajaxFormValidationMethod : "GET";
+ var url = (options.ajaxFormValidationURL) ? options.ajaxFormValidationURL : form.attr("action");
+ var dataType = (options.dataType) ? options.dataType : "json";
+ $.ajax({
+ type: type,
+ url: url,
+ cache: false,
+ dataType: dataType,
+ data: data,
+ form: form,
+ methods: methods,
+ options: options,
+ beforeSend: function () {
+ return options.onBeforeAjaxFormValidation(form, options);
+ },
+ error: function (data, transport) {
+ if (options.onFailure) {
+ options.onFailure(data, transport);
+ } else {
+ methods._ajaxError(data, transport);
+ }
+ },
+ success: function (json) {
+ if ((dataType == "json") && (json !== true)) {
+ // getting to this case doesn't necessary means that the form is invalid
+ // the server may return green or closing prompt actions
+ // this flag helps figuring it out
+ var errorInForm = false;
+ for (var i = 0; i < json.length; i++) {
+ var value = json[i];
+
+ var errorFieldId = value[0];
+ var errorField = $($("#" + errorFieldId)[0]);
+
+ // make sure we found the element
+ if (errorField.length == 1) {
+
+ // promptText or selector
+ var msg = value[2];
+ // if the field is valid
+ if (value[1] == true) {
+
+ if (msg == "" || !msg) {
+ // if for some reason, status==true and error="", just close the prompt
+ methods._closePrompt(errorField);
+ } else {
+ // the field is valid, but we are displaying a green prompt
+ if (options.allrules[msg]) {
+ var txt = options.allrules[msg].alertTextOk;
+ if (txt)
+ msg = txt;
+ }
+ if (options.showPrompts) methods._showPrompt(errorField, msg, "pass", false, options, true);
+ }
+ } else {
+ // the field is invalid, show the red error prompt
+ errorInForm |= true;
+ if (options.allrules[msg]) {
+ let txt = options.allrules[msg].alertText;
+ if (txt)
+ msg = txt;
+ }
+ if (options.showPrompts) methods._showPrompt(errorField, msg, "", false, options, true);
+ }
+ }
+ }
+ options.onAjaxFormComplete(!errorInForm, form, json, options);
+ } else
+ options.onAjaxFormComplete(true, form, json, options);
+
+ }
+ });
+
+ },
+ /**
+ * Validates field, shows prompts accordingly
+ *
+ * @param {jqObject}
+ * field
+ * @param {Array[String]}
+ * field's validation rules
+ * @param {Map}
+ * user options
+ * @return false if field is valid (It is inversed for *fields*, it return false on validate and true on errors.)
+ */
+ _validateField: function (field, options, skipAjaxValidation) {
+ if (!field.attr("id")) {
+ field.attr("id", "form-validation-field-" + $.validationEngine.fieldIdCounter);
+ ++$.validationEngine.fieldIdCounter;
+ }
+
+ if (field.hasClass(options.ignoreFieldsWithClass))
+ return false;
+
+ if (!options.validateNonVisibleFields && (field.is(":hidden") && !options.prettySelect || field.parent().is(":hidden")))
+ return false;
+
+ var rulesParsing = field.attr(options.validateAttribute);
+ var getRules = /validate\[(.*)\]/.exec(rulesParsing);
+
+ if (!getRules)
+ return false;
+ var str = getRules[1];
+ var rules = str.split(/\[|,|\]/);
+
+ // true if we ran the ajax validation, tells the logic to stop messing with prompts
+ var isAjaxValidator = false;
+ var fieldName = field.attr("name");
+ var promptText = "";
+ var promptType = "";
+ var required = false;
+ var limitErrors = false;
+ options.isError = false;
+ options.showArrow = true;
+
+ // If the programmer wants to limit the amount of error messages per field,
+ if (options.maxErrorsPerField > 0) {
+ limitErrors = true;
+ }
+
+ var form = $(field.closest("form, .validationEngineContainer"));
+ // Fix for adding spaces in the rules
+ for (var i = 0; i < rules.length; i++) {
+ rules[i] = rules[i].toString().replace(" ", "");//.toString to worked on IE8
+ // Remove any parsing errors
+ if (rules[i] === '') {
+ delete rules[i];
+ }
+ }
+
+ for (let i = 0, field_errors = 0; i < rules.length; i++) {
+
+ // If we are limiting errors, and have hit the max, break
+ if (limitErrors && field_errors >= options.maxErrorsPerField) {
+ // If we haven't hit a required yet, check to see if there is one in the validation rules for this
+ // field and that it's index is greater or equal to our current index
+ if (!required) {
+ var have_required = $.inArray('required', rules);
+ required = (have_required != -1 && have_required >= i);
+ }
+ break;
+ }
+
+
+ var errorMsg = undefined;
+ var classGroup;
+ switch (rules[i]) {
+
+ case "required":
+ required = true;
+ errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._required);
+ break;
+ case "custom":
+ errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._custom);
+ break;
+ case "groupRequired":
+ // Check is its the first of group, if not, reload validation with first field
+ // AND continue normal validation on present field
+ classGroup = "[" + options.validateAttribute + "*=" + rules[i + 1] + "]";
+ var firstOfGroup = form.find(classGroup).eq(0);
+ if (firstOfGroup[0] != field[0]) {
+
+ methods._validateField(firstOfGroup, options, skipAjaxValidation);
+ options.showArrow = true;
+
+ }
+ errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._groupRequired);
+ if (errorMsg) required = true;
+ options.showArrow = false;
+ break;
+ case "ajax":
+ // AJAX defaults to returning it's loading message
+ errorMsg = methods._ajax(field, rules, i, options);
+ if (errorMsg) {
+ promptType = "load";
+ }
+ break;
+ case "minSize":
+ errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._minSize);
+ break;
+ case "maxSize":
+ errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._maxSize);
+ break;
+ case "min":
+ errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._min);
+ break;
+ case "max":
+ errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._max);
+ break;
+ case "past":
+ errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._past);
+ break;
+ case "future":
+ errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._future);
+ break;
+ case "dateRange":
+ classGroup = "[" + options.validateAttribute + "*=" + rules[i + 1] + "]";
+ options.firstOfGroup = form.find(classGroup).eq(0);
+ options.secondOfGroup = form.find(classGroup).eq(1);
+
+ //if one entry out of the pair has value then proceed to run through validation
+ if (options.firstOfGroup[0].value || options.secondOfGroup[0].value) {
+ errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._dateRange);
+ }
+ if (errorMsg) required = true;
+ options.showArrow = false;
+ break;
+
+ case "dateTimeRange":
+ classGroup = "[" + options.validateAttribute + "*=" + rules[i + 1] + "]";
+ options.firstOfGroup = form.find(classGroup).eq(0);
+ options.secondOfGroup = form.find(classGroup).eq(1);
+
+ //if one entry out of the pair has value then proceed to run through validation
+ if (options.firstOfGroup[0].value || options.secondOfGroup[0].value) {
+ errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._dateTimeRange);
+ }
+ if (errorMsg) required = true;
+ options.showArrow = false;
+ break;
+ case "maxCheckbox":
+ field = $(form.find("input[name='" + fieldName + "']"));
+ errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._maxCheckbox);
+ break;
+ case "minCheckbox":
+ field = $(form.find("input[name='" + fieldName + "']"));
+ errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._minCheckbox);
+ break;
+ case "equals":
+ errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._equals);
+ break;
+ case "funcCall":
+ errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._funcCall);
+ break;
+ case "creditCard":
+ errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._creditCard);
+ break;
+ case "condRequired":
+ errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._condRequired);
+ if (errorMsg !== undefined) {
+ required = true;
+ }
+ break;
+ case "funcCallRequired":
+ errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._funcCallRequired);
+ if (errorMsg !== undefined) {
+ required = true;
+ }
+ break;
+
+ default:
+ }
+
+ var end_validation = false;
+
+ // If we were passed back an message object, check what the status was to determine what to do
+ if (typeof errorMsg == "object") {
+ switch (errorMsg.status) {
+ case "_break":
+ end_validation = true;
+ break;
+ // If we have an error message, set errorMsg to the error message
+ case "_error":
+ errorMsg = errorMsg.message;
+ break;
+ // If we want to throw an error, but not show a prompt, return early with true
+ case "_error_no_prompt":
+ return true;
+ // Anything else we continue on
+ default:
+ break;
+ }
+ }
+
+ //funcCallRequired, first in rules, and has error, skip anything else
+ if (i == 0 && str.indexOf('funcCallRequired') == 0 && errorMsg !== undefined) {
+ if (promptText != '') {
+ promptText += " ";
+ }
+ promptText += errorMsg;
+ options.isError = true;
+ field_errors++;
+ end_validation = true;
+ }
+
+ // If it has been specified that validation should end now, break
+ if (end_validation) {
+ break;
+ }
+
+ // If we have a string, that means that we have an error, so add it to the error message.
+ if (typeof errorMsg == 'string') {
+ if (promptText != '') {
+ promptText += " ";
+ }
+ promptText += errorMsg;
+ options.isError = true;
+ field_errors++;
+ }
+ }
+ // If the rules required is not added, an empty field is not validated
+ //the 3rd condition is added so that even empty password fields should be equal
+ //otherwise if one is filled and another left empty, the "equal" condition would fail
+ //which does not make any sense
+ if (!required && !(field.val()) && field.val().length < 1 && $.inArray('equals', rules) < 0) options.isError = false;
+
+ // Hack for radio/checkbox group button, the validation go into the
+ // first radio/checkbox of the group
+ var fieldType = field.prop("type");
+ var positionType = field.data("promptPosition") || options.promptPosition;
+
+ if ((fieldType == "radio" || fieldType == "checkbox") && form.find("input[name='" + fieldName + "']").size() > 1) {
+ if (positionType === 'inline') {
+ field = $(form.find("input[name='" + fieldName + "'][type!=hidden]:last"));
+ } else {
+ field = $(form.find("input[name='" + fieldName + "'][type!=hidden]:first"));
+ }
+ options.showArrow = options.showArrowOnRadioAndCheckbox;
+ }
+
+ if (field.is(":hidden") && options.prettySelect) {
+ field = form.find("#" + options.usePrefix + methods._jqSelector(field.attr('id')) + options.useSuffix);
+ }
+
+ if (options.isError && options.showPrompts) {
+ methods._showPrompt(field, promptText, promptType, false, options);
+ } else {
+ if (!isAjaxValidator) methods._closePrompt(field);
+ }
+
+ if (!isAjaxValidator) {
+ field.trigger("jqv.field.result", [field, options.isError, promptText]);
+ }
+
+ /* Record error */
+ var errindex = $.inArray(field[0], options.InvalidFields);
+ if (errindex == -1) {
+ if (options.isError)
+ options.InvalidFields.push(field[0]);
+ } else if (!options.isError) {
+ options.InvalidFields.splice(errindex, 1);
+ }
+
+ methods._handleStatusCssClasses(field, options);
+
+ /* run callback function for each field */
+ if (options.isError && options.onFieldFailure)
+ options.onFieldFailure(field);
+
+ if (!options.isError && options.onFieldSuccess)
+ options.onFieldSuccess(field);
+
+ return options.isError;
+ },
+ /**
+ * Handling css classes of fields indicating result of validation
+ *
+ * @param {jqObject}
+ * field
+ * @param {Array[String]}
+ * field's validation rules
+ * @private
+ */
+ _handleStatusCssClasses: function (field, options) {
+ /* remove all classes */
+ if (options.addSuccessCssClassToField)
+ field.removeClass(options.addSuccessCssClassToField);
+
+ if (options.addFailureCssClassToField)
+ field.removeClass(options.addFailureCssClassToField);
+
+ /* Add classes */
+ if (options.addSuccessCssClassToField && !options.isError)
+ field.addClass(options.addSuccessCssClassToField);
+
+ if (options.addFailureCssClassToField && options.isError)
+ field.addClass(options.addFailureCssClassToField);
+ },
+
+ /********************
+ * _getErrorMessage
+ *
+ * @param form
+ * @param field
+ * @param rule
+ * @param rules
+ * @param i
+ * @param options
+ * @param originalValidationMethod
+ * @return {*}
+ * @private
+ */
+ _getErrorMessage: function (form, field, rule, rules, i, options, originalValidationMethod) {
+ // If we are using the custon validation type, build the index for the rule.
+ // Otherwise if we are doing a function call, make the call and return the object
+ // that is passed back.
+ var rule_index = jQuery.inArray(rule, rules);
+ if (rule === "custom" || rule === "funcCall" || rule === "funcCallRequired") {
+ var custom_validation_type = rules[rule_index + 1];
+ rule = rule + "[" + custom_validation_type + "]";
+ // Delete the rule from the rules array so that it doesn't try to call the
+ // same rule over again
+ delete (rules[rule_index]);
+ }
+ // Change the rule to the composite rule, if it was different from the original
+ var alteredRule = rule;
+
+
+ var element_classes = (field.attr("data-validation-engine")) ? field.attr("data-validation-engine") : field.attr("class");
+ var element_classes_array = element_classes.split(" ");
+
+ // Call the original validation method. If we are dealing with dates or checkboxes, also pass the form
+ var errorMsg;
+ if (rule == "future" || rule == "past" || rule == "maxCheckbox" || rule == "minCheckbox") {
+ errorMsg = originalValidationMethod(form, field, rules, i, options);
+ } else {
+ errorMsg = originalValidationMethod(field, rules, i, options);
+ }
+
+ // If the original validation method returned an error and we have a custom error message,
+ // return the custom message instead. Otherwise return the original error message.
+ if (errorMsg != undefined) {
+ var custom_message = methods._getCustomErrorMessage($(field), element_classes_array, alteredRule, options);
+ if (custom_message) errorMsg = custom_message;
+ }
+ return errorMsg;
+
+ },
+ _getCustomErrorMessage: function (field, classes, rule, options) {
+ var custom_message = false;
+ var validityProp = /^custom\[.*\]$/.test(rule) ? methods._validityProp["custom"] : methods._validityProp[rule];
+ // If there is a validityProp for this rule, check to see if the field has an attribute for it
+ if (validityProp != undefined) {
+ custom_message = field.attr("data-errormessage-" + validityProp);
+ // If there was an error message for it, return the message
+ if (custom_message != undefined)
+ return custom_message;
+ }
+ custom_message = field.attr("data-errormessage");
+ // If there is an inline custom error message, return it
+ if (custom_message != undefined)
+ return custom_message;
+ var id = '#' + field.attr("id");
+ // If we have custom messages for the element's id, get the message for the rule from the id.
+ // Otherwise, if we have custom messages for the element's classes, use the first class message we find instead.
+ if (typeof options.custom_error_messages[id] != "undefined" &&
+ typeof options.custom_error_messages[id][rule] != "undefined") {
+ custom_message = options.custom_error_messages[id][rule]['message'];
+ } else if (classes.length > 0) {
+ for (var i = 0; i < classes.length && classes.length > 0; i++) {
+ var element_class = "." + classes[i];
+ if (typeof options.custom_error_messages[element_class] != "undefined" &&
+ typeof options.custom_error_messages[element_class][rule] != "undefined") {
+ custom_message = options.custom_error_messages[element_class][rule]['message'];
+ break;
+ }
+ }
+ }
+ if (!custom_message &&
+ typeof options.custom_error_messages[rule] != "undefined" &&
+ typeof options.custom_error_messages[rule]['message'] != "undefined") {
+ custom_message = options.custom_error_messages[rule]['message'];
+ }
+ return custom_message;
+ },
+ _validityProp: {
+ "required": "value-missing",
+ "custom": "custom-error",
+ "groupRequired": "value-missing",
+ "ajax": "custom-error",
+ "minSize": "range-underflow",
+ "maxSize": "range-overflow",
+ "min": "range-underflow",
+ "max": "range-overflow",
+ "past": "type-mismatch",
+ "future": "type-mismatch",
+ "dateRange": "type-mismatch",
+ "dateTimeRange": "type-mismatch",
+ "maxCheckbox": "range-overflow",
+ "minCheckbox": "range-underflow",
+ "equals": "pattern-mismatch",
+ "funcCall": "custom-error",
+ "funcCallRequired": "custom-error",
+ "creditCard": "pattern-mismatch",
+ "condRequired": "value-missing"
+ },
+ /**
+ * Required validation
+ *
+ * @param {jqObject} field
+ * @param {Array[String]} rules
+ * @param {int} i rules index
+ * @param {Map}
+ * user options
+ * @param {bool} condRequired flag when method is used for internal purpose in condRequired check
+ * @return an error string if validation failed
+ */
+ _required: function (field, rules, i, options, condRequired) {
+ switch (field.prop("type")) {
+ case "radio":
+ case "checkbox":
+ // new validation style to only check dependent field
+ if (condRequired) {
+ if (!field.prop('checked')) {
+ return options.allrules[rules[i]].alertTextCheckboxMultiple;
+ }
+ break;
+ }
+ // old validation style
+ var form = field.closest("form, .validationEngineContainer");
+ var name = field.attr("name");
+ if (form.find("input[name='" + name + "']:checked").size() == 0) {
+ if (form.find("input[name='" + name + "']:visible").size() == 1)
+ return options.allrules[rules[i]].alertTextCheckboxe;
+ else
+ return options.allrules[rules[i]].alertTextCheckboxMultiple;
+ }
+ break;
+ case "text":
+ case "password":
+ case "textarea":
+ case "file":
+ case "select-one":
+ case "select-multiple":
+ default:
+ var field_val = $.trim(field.val());
+ var dv_placeholder = $.trim(field.attr("data-validation-placeholder"));
+ var placeholder = $.trim(field.attr("placeholder"));
+ if (
+ (!field_val)
+ || (dv_placeholder && field_val == dv_placeholder)
+ || (placeholder && field_val == placeholder)
+ ) {
+ return options.allrules[rules[i]].alertText;
+ }
+ break;
+ }
+ },
+ /**
+ * Validate that 1 from the group field is required
+ *
+ * @param {jqObject} field
+ * @param {Array[String]} rules
+ * @param {int} i rules index
+ * @param {Map}
+ * user options
+ * @return an error string if validation failed
+ */
+ _groupRequired: function (field, rules, i, options) {
+ var classGroup = "[" + options.validateAttribute + "*=" + rules[i + 1] + "]";
+ var isValid = false;
+ // Check all fields from the group
+ field.closest("form, .validationEngineContainer").find(classGroup).each(function () {
+ if (!methods._required($(this), rules, i, options)) {
+ isValid = true;
+ return false;
+ }
+ });
+
+ if (!isValid) {
+ return options.allrules[rules[i]].alertText;
+ }
+ },
+ /**
+ * Validate rules
+ *
+ * @param {jqObject} field
+ * @param {Array[String]} rules
+ * @param {int} i rules index
+ * @param {Map}
+ * user options
+ * @return an error string if validation failed
+ */
+ _custom: function (field, rules, i, options) {
+ var customRule = rules[i + 1];
+ var rule = options.allrules[customRule];
+ var fn;
+ if (!rule) {
+ alert("jqv:custom rule not found - " + customRule);
+ return;
+ }
+
+ if (rule["regex"]) {
+ var ex = rule.regex;
+ if (!ex) {
+ alert("jqv:custom regex not found - " + customRule);
+ return;
+ }
+ var pattern = new RegExp(ex);
+
+ if (!pattern.test(field.val())) return options.allrules[customRule].alertText;
+
+ } else if (rule["func"]) {
+ fn = rule["func"];
+
+ if (typeof (fn) !== "function") {
+ alert("jqv:custom parameter 'function' is no function - " + customRule);
+ return;
+ }
+
+ if (!fn(field, rules, i, options))
+ return options.allrules[customRule].alertText;
+ } else {
+ alert("jqv:custom type not allowed " + customRule);
+ return;
+ }
+ },
+ /**
+ * Validate custom function outside of the engine scope
+ *
+ * @param {jqObject} field
+ * @param {Array[String]} rules
+ * @param {int} i rules index
+ * @param {Map}
+ * user options
+ * @return an error string if validation failed
+ */
+ _funcCall: function (field, rules, i, options) {
+ var functionName = rules[i + 1];
+ var fn;
+ if (functionName.indexOf('.') > -1) {
+ var namespaces = functionName.split('.');
+ var scope = window;
+ while (namespaces.length) {
+ scope = scope[namespaces.shift()];
+ }
+ fn = scope;
+ }
+ else
+ fn = window[functionName] || options.customFunctions[functionName];
+ if (typeof (fn) == 'function')
+ return fn(field, rules, i, options);
+
+ },
+ _funcCallRequired: function (field, rules, i, options) {
+ return methods._funcCall(field, rules, i, options);
+ },
+ /**
+ * Field match
+ *
+ * @param {jqObject} field
+ * @param {Array[String]} rules
+ * @param {int} i rules index
+ * @param {Map}
+ * user options
+ * @return an error string if validation failed
+ */
+ _equals: function (field, rules, i, options) {
+ var equalsField = rules[i + 1];
+
+ if (field.val() != $("#" + equalsField).val())
+ return options.allrules.equals.alertText;
+ },
+ /**
+ * Check the maximum size (in characters)
+ *
+ * @param {jqObject} field
+ * @param {Array[String]} rules
+ * @param {int} i rules index
+ * @param {Map}
+ * user options
+ * @return an error string if validation failed
+ */
+ _maxSize: function (field, rules, i, options) {
+ var max = rules[i + 1];
+ var len = field.val().length;
+
+ if (len > max) {
+ var rule = options.allrules.maxSize;
+ return rule.alertText + max + rule.alertText2;
+ }
+ },
+ /**
+ * Check the minimum size (in characters)
+ *
+ * @param {jqObject} field
+ * @param {Array[String]} rules
+ * @param {int} i rules index
+ * @param {Map}
+ * user options
+ * @return an error string if validation failed
+ */
+ _minSize: function (field, rules, i, options) {
+ var min = rules[i + 1];
+ var len = field.val().length;
+
+ if (len < min) {
+ var rule = options.allrules.minSize;
+ return rule.alertText + min + rule.alertText2;
+ }
+ },
+ /**
+ * Check number minimum value
+ *
+ * @param {jqObject} field
+ * @param {Array[String]} rules
+ * @param {int} i rules index
+ * @param {Map}
+ * user options
+ * @return an error string if validation failed
+ */
+ _min: function (field, rules, i, options) {
+ var min = parseFloat(rules[i + 1]);
+ var len = parseFloat(field.val());
+
+ if (len < min) {
+ var rule = options.allrules.min;
+ if (rule.alertText2) return rule.alertText + min + rule.alertText2;
+ return rule.alertText + min;
+ }
+ },
+ /**
+ * Check number maximum value
+ *
+ * @param {jqObject} field
+ * @param {Array[String]} rules
+ * @param {int} i rules index
+ * @param {Map}
+ * user options
+ * @return an error string if validation failed
+ */
+ _max: function (field, rules, i, options) {
+ var max = parseFloat(rules[i + 1]);
+ var len = parseFloat(field.val());
+
+ if (len > max) {
+ var rule = options.allrules.max;
+ if (rule.alertText2) return rule.alertText + max + rule.alertText2;
+ //orefalo: to review, also do the translations
+ return rule.alertText + max;
+ }
+ },
+ /**
+ * Checks date is in the past
+ *
+ * @param {jqObject} field
+ * @param {Array[String]} rules
+ * @param {int} i rules index
+ * @param {Map}
+ * user options
+ * @return an error string if validation failed
+ */
+ _past: function (form, field, rules, i, options) {
+
+ var p = rules[i + 1];
+ var fieldAlt = $(form.find("*[name='" + p.replace(/^#+/, '') + "']"));
+ var pdate;
+
+ if (p.toLowerCase() == "now") {
+ pdate = new Date();
+ } else if (undefined != fieldAlt.val()) {
+ if (fieldAlt.is(":disabled"))
+ return;
+ pdate = methods._parseDate(fieldAlt.val());
+ } else {
+ pdate = methods._parseDate(p);
+ }
+ var vdate = methods._parseDate(field.val());
+
+ if (vdate > pdate) {
+ var rule = options.allrules.past;
+ if (rule.alertText2) return rule.alertText + methods._dateToString(pdate) + rule.alertText2;
+ return rule.alertText + methods._dateToString(pdate);
+ }
+ },
+ /**
+ * Checks date is in the future
+ *
+ * @param {jqObject} field
+ * @param {Array[String]} rules
+ * @param {int} i rules index
+ * @param {Map}
+ * user options
+ * @return an error string if validation failed
+ */
+ _future: function (form, field, rules, i, options) {
+
+ var p = rules[i + 1];
+ var fieldAlt = $(form.find("*[name='" + p.replace(/^#+/, '') + "']"));
+ var pdate;
+
+ if (p.toLowerCase() == "now") {
+ pdate = new Date();
+ } else if (undefined != fieldAlt.val()) {
+ if (fieldAlt.is(":disabled"))
+ return;
+ pdate = methods._parseDate(fieldAlt.val());
+ } else {
+ pdate = methods._parseDate(p);
+ }
+ var vdate = methods._parseDate(field.val());
+
+ if (vdate < pdate) {
+ var rule = options.allrules.future;
+ if (rule.alertText2)
+ return rule.alertText + methods._dateToString(pdate) + rule.alertText2;
+ return rule.alertText + methods._dateToString(pdate);
+ }
+ },
+ /**
+ * Checks if valid date
+ *
+ * @param {string} date string
+ * @return a bool based on determination of valid date
+ */
+ _isDate: function (value) {
+ var dateRegEx = new RegExp(/^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$|^(?:(?:(?:0?[13578]|1[02])(\/|-)31)|(?:(?:0?[1,3-9]|1[0-2])(\/|-)(?:29|30)))(\/|-)(?:[1-9]\d\d\d|\d[1-9]\d\d|\d\d[1-9]\d|\d\d\d[1-9])$|^(?:(?:0?[1-9]|1[0-2])(\/|-)(?:0?[1-9]|1\d|2[0-8]))(\/|-)(?:[1-9]\d\d\d|\d[1-9]\d\d|\d\d[1-9]\d|\d\d\d[1-9])$|^(0?2(\/|-)29)(\/|-)(?:(?:0[48]00|[13579][26]00|[2468][048]00)|(?:\d\d)?(?:0[48]|[2468][048]|[13579][26]))$/);
+ return dateRegEx.test(value);
+ },
+ /**
+ * Checks if valid date time
+ *
+ * @param {string} date string
+ * @return a bool based on determination of valid date time
+ */
+ _isDateTime: function (value) {
+ var dateTimeRegEx = new RegExp(/^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])\s+(1[012]|0?[1-9]){1}:(0?[1-5]|[0-6][0-9]){1}:(0?[0-6]|[0-6][0-9]){1}\s+(am|pm|AM|PM){1}$|^(?:(?:(?:0?[13578]|1[02])(\/|-)31)|(?:(?:0?[1,3-9]|1[0-2])(\/|-)(?:29|30)))(\/|-)(?:[1-9]\d\d\d|\d[1-9]\d\d|\d\d[1-9]\d|\d\d\d[1-9])$|^((1[012]|0?[1-9]){1}\/(0?[1-9]|[12][0-9]|3[01]){1}\/\d{2,4}\s+(1[012]|0?[1-9]){1}:(0?[1-5]|[0-6][0-9]){1}:(0?[0-6]|[0-6][0-9]){1}\s+(am|pm|AM|PM){1})$/);
+ return dateTimeRegEx.test(value);
+ },
+ //Checks if the start date is before the end date
+ //returns true if end is later than start
+ _dateCompare: function (start, end) {
+ return (new Date(start.toString()) < new Date(end.toString()));
+ },
+ /**
+ * Checks date range
+ *
+ * @param {jqObject} first field name
+ * @param {jqObject} second field name
+ * @return an error string if validation failed
+ */
+ _dateRange: function (field, rules, i, options) {
+ //are not both populated
+ if ((!options.firstOfGroup[0].value && options.secondOfGroup[0].value) || (options.firstOfGroup[0].value && !options.secondOfGroup[0].value)) {
+ return options.allrules[rules[i]].alertText + options.allrules[rules[i]].alertText2;
+ }
+
+ //are not both dates
+ if (!methods._isDate(options.firstOfGroup[0].value) || !methods._isDate(options.secondOfGroup[0].value)) {
+ return options.allrules[rules[i]].alertText + options.allrules[rules[i]].alertText2;
+ }
+
+ //are both dates but range is off
+ if (!methods._dateCompare(options.firstOfGroup[0].value, options.secondOfGroup[0].value)) {
+ return options.allrules[rules[i]].alertText + options.allrules[rules[i]].alertText2;
+ }
+ },
+ /**
+ * Checks date time range
+ *
+ * @param {jqObject} first field name
+ * @param {jqObject} second field name
+ * @return an error string if validation failed
+ */
+ _dateTimeRange: function (field, rules, i, options) {
+ //are not both populated
+ if ((!options.firstOfGroup[0].value && options.secondOfGroup[0].value) || (options.firstOfGroup[0].value && !options.secondOfGroup[0].value)) {
+ return options.allrules[rules[i]].alertText + options.allrules[rules[i]].alertText2;
+ }
+ //are not both dates
+ if (!methods._isDateTime(options.firstOfGroup[0].value) || !methods._isDateTime(options.secondOfGroup[0].value)) {
+ return options.allrules[rules[i]].alertText + options.allrules[rules[i]].alertText2;
+ }
+ //are both dates but range is off
+ if (!methods._dateCompare(options.firstOfGroup[0].value, options.secondOfGroup[0].value)) {
+ return options.allrules[rules[i]].alertText + options.allrules[rules[i]].alertText2;
+ }
+ },
+ /**
+ * Max number of checkbox selected
+ *
+ * @param {jqObject} field
+ * @param {Array[String]} rules
+ * @param {int} i rules index
+ * @param {Map}
+ * user options
+ * @return an error string if validation failed
+ */
+ _maxCheckbox: function (form, field, rules, i, options) {
+
+ var nbCheck = rules[i + 1];
+ var groupname = field.attr("name");
+ var groupSize = form.find("input[name='" + groupname + "']:checked").size();
+ if (groupSize > nbCheck) {
+ options.showArrow = false;
+ if (options.allrules.maxCheckbox.alertText2)
+ return options.allrules.maxCheckbox.alertText + " " + nbCheck + " " + options.allrules.maxCheckbox.alertText2;
+ return options.allrules.maxCheckbox.alertText;
+ }
+ },
+ /**
+ * Min number of checkbox selected
+ *
+ * @param {jqObject} field
+ * @param {Array[String]} rules
+ * @param {int} i rules index
+ * @param {Map}
+ * user options
+ * @return an error string if validation failed
+ */
+ _minCheckbox: function (form, field, rules, i, options) {
+
+ var nbCheck = rules[i + 1];
+ var groupname = field.attr("name");
+ var groupSize = form.find("input[name='" + groupname + "']:checked").size();
+ if (groupSize < nbCheck) {
+ options.showArrow = false;
+ return options.allrules.minCheckbox.alertText + " " + nbCheck + " " + options.allrules.minCheckbox.alertText2;
+ }
+ },
+ /**
+ * Checks that it is a valid credit card number according to the
+ * Luhn checksum algorithm.
+ *
+ * @param {jqObject} field
+ * @param {Array[String]} rules
+ * @param {int} i rules index
+ * @param {Map}
+ * user options
+ * @return an error string if validation failed
+ */
+ _creditCard: function (field, rules, i, options) {
+ //spaces and dashes may be valid characters, but must be stripped to calculate the checksum.
+ var valid = false, cardNumber = field.val().replace(/ +/g, '').replace(/-+/g, '');
+
+ var numDigits = cardNumber.length;
+ if (numDigits >= 14 && numDigits <= 16 && parseInt(cardNumber) > 0) {
+
+ let sum = 0, i = numDigits - 1, pos = 1, digit, luhn = new String();
+ do {
+ digit = parseInt(cardNumber.charAt(i));
+ luhn += (pos++ % 2 == 0) ? digit * 2 : digit;
+ } while (--i >= 0)
+
+ for (i = 0; i < luhn.length; i++) {
+ sum += parseInt(luhn.charAt(i));
+ }
+ valid = sum % 10 == 0;
+ }
+ if (!valid) return options.allrules.creditCard.alertText;
+ },
+ /**
+ * Ajax field validation
+ *
+ * @param {jqObject} field
+ * @param {Array[String]} rules
+ * @param {int} i rules index
+ * @param {Map}
+ * user options
+ * @return nothing! the ajax validator handles the prompts itself
+ */
+ _ajax: function (field, rules, i, options) {
+
+ var errorSelector = rules[i + 1];
+ var rule = options.allrules[errorSelector];
+ var extraData = rule.extraData;
+ var extraDataDynamic = rule.extraDataDynamic;
+ var data = {
+ "fieldId": field.attr("id"),
+ "fieldValue": field.val()
+ };
+
+ if (typeof extraData === "object") {
+ $.extend(data, extraData);
+ } else if (typeof extraData === "string") {
+ var tempData = extraData.split("&");
+ for (let i = 0; i < tempData.length; i++) {
+ var values = tempData[i].split("=");
+ if (values[0] && values[0]) {
+ data[values[0]] = values[1];
+ }
+ }
+ }
+
+ if (extraDataDynamic) {
+ var tmpData = [];
+ var domIds = String(extraDataDynamic).split(",");
+ for (let i = 0; i < domIds.length; i++) {
+ var id = domIds[i];
+ if ($(id).length) {
+ var inputValue = field.closest("form, .validationEngineContainer").find(id).val();
+ var keyValue = id.replace('#', '') + '=' + escape(inputValue);
+ data[id.replace('#', '')] = inputValue;
+ }
+ }
+ }
+
+ // If a field change event triggered this we want to clear the cache for this ID
+ if (options.eventTrigger == "field") {
+ delete (options.ajaxValidCache[field.attr("id")]);
+ }
+
+ // If there is an error or if the the field is already validated, do not re-execute AJAX
+ if (!options.isError && !methods._checkAjaxFieldStatus(field.attr("id"), options)) {
+ $.ajax({
+ type: options.ajaxFormValidationMethod,
+ url: rule.url,
+ cache: false,
+ dataType: "json",
+ data: data,
+ field: field,
+ rule: rule,
+ methods: methods,
+ options: options,
+ beforeSend: function () { },
+ error: function (data, transport) {
+ if (options.onFailure) {
+ options.onFailure(data, transport);
+ } else {
+ methods._ajaxError(data, transport);
+ }
+ },
+ success: function (json) {
+
+ // asynchronously called on success, data is the json answer from the server
+ var errorFieldId = json[0];
+ //var errorField = $($("#" + errorFieldId)[0]);
+ var errorField = $("#" + errorFieldId).eq(0);
+
+ // make sure we found the element
+ if (errorField.length == 1) {
+ var status = json[1];
+ // read the optional msg from the server
+ var msg = json[2];
+ if (!status) {
+ // Houston we got a problem - display an red prompt
+ options.ajaxValidCache[errorFieldId] = false;
+ options.isError = true;
+
+ // resolve the msg prompt
+ if (msg) {
+ if (options.allrules[msg]) {
+ var txt = options.allrules[msg].alertText;
+ if (txt) {
+ msg = txt;
+ }
+ }
+ }
+ else
+ msg = rule.alertText;
+
+ if (options.showPrompts) methods._showPrompt(errorField, msg, "", true, options);
+ } else {
+ options.ajaxValidCache[errorFieldId] = true;
+
+ // resolves the msg prompt
+ if (msg) {
+ if (options.allrules[msg]) {
+ let txt = options.allrules[msg].alertTextOk;
+ if (txt) {
+ msg = txt;
+ }
+ }
+ }
+ else
+ msg = rule.alertTextOk;
+
+ if (options.showPrompts) {
+ // see if we should display a green prompt
+ if (msg)
+ methods._showPrompt(errorField, msg, "pass", true, options);
+ else
+ methods._closePrompt(errorField);
+ }
+
+ // If a submit form triggered this, we want to re-submit the form
+ if (options.eventTrigger == "submit")
+ field.closest("form").submit();
+ }
+ }
+ errorField.trigger("jqv.field.result", [errorField, options.isError, msg]);
+ }
+ });
+
+ return rule.alertTextLoad;
+ }
+ },
+ /**
+ * Common method to handle ajax errors
+ *
+ * @param {Object} data
+ * @param {Object} transport
+ */
+ _ajaxError: function (data, transport) {
+ if (data.status == 0 && transport == null)
+ alert("The page is not served from a server! ajax call failed");
+ else if (typeof console != "undefined")
+ console.log("Ajax error: " + data.status + " " + transport);
+ },
+ /**
+ * date -> string
+ *
+ * @param {Object} date
+ */
+ _dateToString: function (date) {
+ return date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + date.getDate();
+ },
+ /**
+ * Parses an ISO date
+ * @param {String} d
+ */
+ _parseDate: function (d) {
+
+ var dateParts = d.split("-");
+ if (dateParts == d)
+ dateParts = d.split("/");
+ if (dateParts == d) {
+ dateParts = d.split(".");
+ return new Date(dateParts[2], (dateParts[1] - 1), dateParts[0]);
+ }
+ return new Date(dateParts[0], (dateParts[1] - 1), dateParts[2]);
+ },
+ /**
+ * Builds or updates a prompt with the given information
+ *
+ * @param {jqObject} field
+ * @param {String} promptText html text to display type
+ * @param {String} type the type of bubble: 'pass' (green), 'load' (black) anything else (red)
+ * @param {boolean} ajaxed - use to mark fields than being validated with ajax
+ * @param {Map} options user options
+ */
+ _showPrompt: function (field, promptText, type, ajaxed, options, ajaxform) {
+ //Check if we need to adjust what element to show the prompt on
+ if (field.data('jqv-prompt-at') instanceof jQuery) {
+ field = field.data('jqv-prompt-at');
+ } else if (field.data('jqv-prompt-at')) {
+ field = $(field.data('jqv-prompt-at'));
+ }
+
+ var prompt = methods._getPrompt(field);
+ // The ajax submit errors are not see has an error in the form,
+ // When the form errors are returned, the engine see 2 bubbles, but those are ebing closed by the engine at the same time
+ // Because no error was found befor submitting
+ if (ajaxform) prompt = false;
+ // Check that there is indded text
+ if ($.trim(promptText)) {
+ if (prompt)
+ methods._updatePrompt(field, prompt, promptText, type, ajaxed, options);
+ else
+ methods._buildPrompt(field, promptText, type, ajaxed, options);
+ }
+ },
+ /**
+ * Builds and shades a prompt for the given field.
+ *
+ * @param {jqObject} field
+ * @param {String} promptText html text to display type
+ * @param {String} type the type of bubble: 'pass' (green), 'load' (black) anything else (red)
+ * @param {boolean} ajaxed - use to mark fields than being validated with ajax
+ * @param {Map} options user options
+ */
+ _buildPrompt: function (field, promptText, type, ajaxed, options) {
+
+ // create the prompt
+ var prompt = $('');
+ prompt.addClass(methods._getClassName(field.attr("id")) + "formError");
+ // add a class name to identify the parent form of the prompt
+ prompt.addClass("parentForm" + methods._getClassName(field.closest('form, .validationEngineContainer').attr("id")));
+ prompt.addClass("formError");
+
+ switch (type) {
+ case "pass":
+ prompt.addClass("greenPopup");
+ break;
+ case "load":
+ prompt.addClass("blackPopup");
+ break;
+ default:
+ /* it has error */
+ //alert("unknown popup type:"+type);
+ }
+ if (ajaxed)
+ prompt.addClass("ajaxed");
+
+ // create the prompt content
+ var promptContent = $('
').addClass("formErrorContent").html(promptText).appendTo(prompt);
+
+ // determine position type
+ var positionType = field.data("promptPosition") || options.promptPosition;
+
+ // create the css arrow pointing at the field
+ // note that there is no triangle on max-checkbox and radio
+ if (options.showArrow) {
+ var arrow = $('
').addClass("formErrorArrow");
+
+ //prompt positioning adjustment support. Usage: positionType:Xshift,Yshift (for ex.: bottomLeft:+20 or bottomLeft:-20,+10)
+ if (typeof (positionType) == 'string') {
+ var pos = positionType.indexOf(":");
+ if (pos != -1)
+ positionType = positionType.substring(0, pos);
+ }
+
+ switch (positionType) {
+ case "bottomLeft":
+ case "bottomRight":
+ prompt.find(".formErrorContent").before(arrow);
+ arrow.addClass("formErrorArrowBottom").html('
');
+ break;
+ case "topLeft":
+ case "topRight":
+ arrow.html('
');
+ prompt.append(arrow);
+ break;
+ }
+ }
+ // Add custom prompt class
+ if (options.addPromptClass)
+ prompt.addClass(options.addPromptClass);
+
+ // Add custom prompt class defined in element
+ var requiredOverride = field.attr('data-required-class');
+ if (requiredOverride !== undefined) {
+ prompt.addClass(requiredOverride);
+ } else {
+ if (options.prettySelect) {
+ if ($('#' + field.attr('id')).next().is('select')) {
+ var prettyOverrideClass = $('#' + field.attr('id').substr(options.usePrefix.length).substring(options.useSuffix.length)).attr('data-required-class');
+ if (prettyOverrideClass !== undefined) {
+ prompt.addClass(prettyOverrideClass);
+ }
+ }
+ }
+ }
+
+ prompt.css({
+ "opacity": 0
+ });
+ if (positionType === 'inline') {
+ prompt.addClass("inline");
+ if (typeof field.attr('data-prompt-target') !== 'undefined' && $('#' + field.attr('data-prompt-target')).length > 0) {
+ prompt.appendTo($('#' + field.attr('data-prompt-target')));
+ } else {
+ field.after(prompt);
+ }
+ } else {
+ field.before(prompt);
+ }
+
+ pos = methods._calculatePosition(field, prompt, options);
+ // Support RTL layouts by @yasser_lotfy ( Yasser Lotfy )
+ if ($('body').hasClass('rtl')) {
+ prompt.css({
+ 'position': positionType === 'inline' ? 'relative' : 'absolute',
+ "top": pos.callerTopPosition,
+ "left": "initial",
+ "right": pos.callerleftPosition,
+ "marginTop": pos.marginTopSize,
+ "opacity": 0
+ }).data("callerField", field);
+ } else {
+ prompt.css({
+ 'position': positionType === 'inline' ? 'relative' : 'absolute',
+ "top": pos.callerTopPosition,
+ "left": pos.callerleftPosition,
+ "right": "initial",
+ "marginTop": pos.marginTopSize,
+ "opacity": 0
+ }).data("callerField", field);
+ }
+
+
+ if (options.autoHidePrompt) {
+ setTimeout(function () {
+ prompt.animate({
+ "opacity": 0
+ }, function () {
+ prompt.closest('.formError').remove();
+ });
+ }, options.autoHideDelay);
+ }
+ return prompt.animate({
+ "opacity": 0.87
+ });
+ },
+ /**
+ * Updates the prompt text field - the field for which the prompt
+ * @param {jqObject} field
+ * @param {String} promptText html text to display type
+ * @param {String} type the type of bubble: 'pass' (green), 'load' (black) anything else (red)
+ * @param {boolean} ajaxed - use to mark fields than being validated with ajax
+ * @param {Map} options user options
+ */
+ _updatePrompt: function (field, prompt, promptText, type, ajaxed, options, noAnimation) {
+
+ if (prompt) {
+ if (typeof type !== "undefined") {
+ if (type == "pass")
+ prompt.addClass("greenPopup");
+ else
+ prompt.removeClass("greenPopup");
+
+ if (type == "load")
+ prompt.addClass("blackPopup");
+ else
+ prompt.removeClass("blackPopup");
+ }
+ if (ajaxed)
+ prompt.addClass("ajaxed");
+ else
+ prompt.removeClass("ajaxed");
+
+ prompt.find(".formErrorContent").html(promptText);
+
+ var pos = methods._calculatePosition(field, prompt, options);
+ // Support RTL layouts by @yasser_lotfy ( Yasser Lotfy )
+ var css;
+ if ($('body').hasClass('rtl')) {
+ css = {
+ "top": pos.callerTopPosition,
+ "left": "initial",
+ "right": pos.callerleftPosition,
+ "marginTop": pos.marginTopSize,
+ "opacity": 0.87
+ };
+ } else {
+ css = {
+ "top": pos.callerTopPosition,
+ "left": pos.callerleftPosition,
+ "right": "initial",
+ "marginTop": pos.marginTopSize,
+ "opacity": 0.87
+ };
+ }
+
+ prompt.css({
+ "opacity": 0,
+ "display": "block"
+ });
+
+ if (noAnimation)
+ prompt.css(css);
+ else
+ prompt.animate(css);
+ }
+ },
+ /**
+ * Closes the prompt associated with the given field
+ *
+ * @param {jqObject}
+ * field
+ */
+ _closePrompt: function (field) {
+ var prompt = methods._getPrompt(field);
+ if (prompt)
+ prompt.fadeTo("fast", 0, function () {
+ prompt.closest('.formError').remove();
+ });
+ },
+ closePrompt: function (field) {
+ return methods._closePrompt(field);
+ },
+ /**
+ * Returns the error prompt matching the field if any
+ *
+ * @param {jqObject}
+ * field
+ * @return undefined or the error prompt (jqObject)
+ */
+ _getPrompt: function (field) {
+ var formId = $(field).closest('form, .validationEngineContainer').attr('id');
+ var className = methods._getClassName(field.attr("id")) + "formError";
+ var match = $("." + methods._escapeExpression(className) + '.parentForm' + methods._getClassName(formId))[0];
+ if (match)
+ return $(match);
+ },
+ /**
+ * Returns the escapade classname
+ *
+ * @param {selector}
+ * className
+ */
+ _escapeExpression: function (selector) {
+ return selector.replace(/([#;&,\.\+\*\~':"\!\^$\[\]\(\)=>\|])/g, "\\$1");
+ },
+ /**
+ * returns true if we are in a RTLed document
+ *
+ * @param {jqObject} field
+ */
+ isRTL: function (field) {
+ var $document = $(document);
+ var $body = $('body');
+ var rtl =
+ (field && field.hasClass('rtl')) ||
+ (field && (field.attr('dir') || '').toLowerCase() === 'rtl') ||
+ $document.hasClass('rtl') ||
+ ($document.attr('dir') || '').toLowerCase() === 'rtl' ||
+ $body.hasClass('rtl') ||
+ ($body.attr('dir') || '').toLowerCase() === 'rtl';
+ return Boolean(rtl);
+ },
+ /**
+ * Calculates prompt position
+ *
+ * @param {jqObject}
+ * field
+ * @param {jqObject}
+ * the prompt
+ * @param {Map}
+ * options
+ * @return positions
+ */
+ _calculatePosition: function (field, promptElmt, options) {
+
+ var promptTopPosition, promptleftPosition, marginTopSize;
+ var fieldWidth = field.width();
+ var fieldLeft = field.position().left;
+ var fieldTop = field.position().top;
+ var fieldHeight = field.height();
+ var promptHeight = promptElmt.height();
+
+
+ // is the form contained in an overflown container?
+ promptTopPosition = promptleftPosition = 0;
+ // compensation for the arrow
+ marginTopSize = -promptHeight;
+
+
+ //prompt positioning adjustment support
+ //now you can adjust prompt position
+ //usage: positionType:Xshift,Yshift
+ //for example:
+ // bottomLeft:+20 means bottomLeft position shifted by 20 pixels right horizontally
+ // topRight:20, -15 means topRight position shifted by 20 pixels to right and 15 pixels to top
+ //You can use +pixels, - pixels. If no sign is provided than + is default.
+ var positionType = field.data("promptPosition") || options.promptPosition;
+ var shift1 = "";
+ var shift2 = "";
+ var shiftX = 0;
+ var shiftY = 0;
+ if (typeof (positionType) == 'string') {
+ //do we have any position adjustments ?
+ if (positionType.indexOf(":") != -1) {
+ shift1 = positionType.substring(positionType.indexOf(":") + 1);
+ positionType = positionType.substring(0, positionType.indexOf(":"));
+
+ //if any advanced positioning will be needed (percents or something else) - parser should be added here
+ //for now we use simple parseInt()
+
+ //do we have second parameter?
+ if (shift1.indexOf(",") != -1) {
+ shift2 = shift1.substring(shift1.indexOf(",") + 1);
+ shift1 = shift1.substring(0, shift1.indexOf(","));
+ shiftY = parseInt(shift2);
+ if (isNaN(shiftY)) shiftY = 0;
+ }
+
+ shiftX = parseInt(shift1);
+ if (isNaN(shift1)) shift1 = 0;
+
+ }
+ }
+
+
+ switch (positionType) {
+ default:
+ case "topRight":
+ promptleftPosition += fieldLeft + fieldWidth - 27;
+ promptTopPosition += fieldTop;
+ break;
+
+ case "topLeft":
+ promptTopPosition += fieldTop;
+ promptleftPosition += fieldLeft;
+ break;
+
+ case "centerRight":
+ promptTopPosition = fieldTop + 4;
+ marginTopSize = 0;
+ promptleftPosition = fieldLeft + field.outerWidth(true) + 5;
+ break;
+ case "centerLeft":
+ promptleftPosition = fieldLeft - (promptElmt.width() + 2);
+ promptTopPosition = fieldTop + 4;
+ marginTopSize = 0;
+
+ break;
+
+ case "bottomLeft":
+ promptTopPosition = fieldTop + field.height() + 5;
+ marginTopSize = 0;
+ promptleftPosition = fieldLeft;
+ break;
+ case "bottomRight":
+ promptleftPosition = fieldLeft + fieldWidth - 27;
+ promptTopPosition = fieldTop + field.height() + 5;
+ marginTopSize = 0;
+ break;
+ case "inline":
+ promptleftPosition = 0;
+ promptTopPosition = 0;
+ marginTopSize = 0;
+ }
+
+
+
+ //apply adjusments if any
+ promptleftPosition += shiftX;
+ promptTopPosition += shiftY;
+
+ return {
+ "callerTopPosition": promptTopPosition + "px",
+ "callerleftPosition": promptleftPosition + "px",
+ "marginTopSize": marginTopSize + "px"
+ };
+ },
+ /**
+ * Saves the user options and variables in the form.data
+ *
+ * @param {jqObject}
+ * form - the form where the user option should be saved
+ * @param {Map}
+ * options - the user options
+ * @return the user options (extended from the defaults)
+ */
+ _saveOptions: function (form, options) {
+
+ // is there a language localisation ?
+ if ($.validationEngineLanguage)
+ var allRules = $.validationEngineLanguage.allRules;
+ else
+ $.error("jQuery.validationEngine rules are not loaded, plz add localization files to the page");
+ // --- Internals DO NOT TOUCH or OVERLOAD ---
+ // validation rules and i18
+ $.validationEngine.defaults.allrules = allRules;
+
+ var userOptions = $.extend(true, {}, $.validationEngine.defaults, options);
+
+ form.data('jqv', userOptions);
+ return userOptions;
+ },
+
+ /**
+ * Removes forbidden characters from class name
+ * @param {String} className
+ */
+ _getClassName: function (className) {
+ if (className)
+ return className.replace(/:/g, "_").replace(/\./g, "_");
+ },
+ /**
+ * Escape special character for jQuery selector
+ * http://totaldev.com/content/escaping-characters-get-valid-jquery-id
+ * @param {String} selector
+ */
+ _jqSelector: function (str) {
+ return str.replace(/([;&,\.\+\*\~':"\!\^#$%@\[\]\(\)=>\|])/g, '\\$1');
+ },
+ /**
+ * Conditionally required field
+ *
+ * @param {jqObject} field
+ * @param {Array[String]} rules
+ * @param {int} i rules index
+ * @param {Map}
+ * user options
+ * @return an error string if validation failed
+ */
+ _condRequired: function (field, rules, i, options) {
+ var idx, dependingField;
+
+ for (idx = (i + 1); idx < rules.length; idx++) {
+ dependingField = jQuery("#" + rules[idx]).first();
+
+ /* Use _required for determining wether dependingField has a value.
+ * There is logic there for handling all field types, and default value; so we won't replicate that here
+ * Indicate this special use by setting the last parameter to true so we only validate the dependingField on chackboxes and radio buttons (#462)
+ */
+ if (dependingField.length && methods._required(dependingField, ["required"], 0, options, true) == undefined) {
+ /* We now know any of the depending fields has a value,
+ * so we can validate this field as per normal required code
+ */
+ return methods._required(field, ["required"], 0, options);
+ }
+ }
+ },
+
+ _submitButtonClick: function (event) {
+ var button = $(this);
+ var form = button.closest('form, .validationEngineContainer');
+ form.data("jqv_submitButton", button.attr("id"));
+ }
+ };
+
+ /**
+ * Plugin entry point.
+ * You may pass an action as a parameter or a list of options.
+ * if none, the init and attach methods are being called.
+ * Remember: if you pass options, the attached method is NOT called automatically
+ *
+ * @param {String}
+ * method (optional) action
+ */
+ $.fn.validationEngine = function (method) {
+
+ var form = $(this);
+ if (!form[0]) return form; // stop here if the form does not exist
+
+ if (typeof (method) == 'string' && method.charAt(0) != '_' && methods[method]) {
+
+ // make sure init is called once
+ if (method != "showPrompt" && method != "hide" && method != "hideAll")
+ methods.init.apply(form);
+
+ return methods[method].apply(form, Array.prototype.slice.call(arguments, 1));
+ } else if (typeof method == 'object' || !method) {
+
+ // default constructor with or without arguments
+ methods.init.apply(form, arguments);
+ return methods.attach.apply(form);
+ } else {
+ $.error('Method ' + method + ' does not exist in jQuery.validationEngine');
+ }
+ };
+
+
+
+ // LEAK GLOBAL OPTIONS
+ $.validationEngine = {
+ fieldIdCounter: 0, defaults: {
+
+ // Name of the event triggering field validation
+ validationEventTrigger: "blur",
+ // Automatically scroll viewport to the first error
+ scroll: true,
+ // Focus on the first input
+ focusFirstField: true,
+ // Show prompts, set to false to disable prompts
+ showPrompts: true,
+ // Should we attempt to validate non-visible input fields contained in the form? (Useful in cases of tabbed containers, e.g. jQuery-UI tabs)
+ validateNonVisibleFields: false,
+ // ignore the validation for fields with this specific class (Useful in cases of tabbed containers AND hidden fields we don't want to validate)
+ ignoreFieldsWithClass: 'ignoreMe',
+ // Opening box position, possible locations are: topLeft,
+ // topRight, bottomLeft, centerRight, bottomRight, inline
+ // inline gets inserted after the validated field or into an element specified in data-prompt-target
+ promptPosition: "topRight",
+ bindMethod: "bind",
+ // internal, automatically set to true when it parse a _ajax rule
+ inlineAjax: false,
+ // if set to true, the form data is sent asynchronously via ajax to the form.action url (get)
+ ajaxFormValidation: false,
+ // The url to send the submit ajax validation (default to action)
+ ajaxFormValidationURL: false,
+ // HTTP method used for ajax validation
+ ajaxFormValidationMethod: 'get',
+ // Ajax form validation callback method: boolean onComplete(form, status, errors, options)
+ // retuns false if the form.submit event needs to be canceled.
+ onAjaxFormComplete: $.noop,
+ // called right before the ajax call, may return false to cancel
+ onBeforeAjaxFormValidation: $.noop,
+ // Stops form from submitting and execute function assiciated with it
+ onValidationComplete: false,
+
+ // Used when you have a form fields too close and the errors messages are on top of other disturbing viewing messages
+ doNotShowAllErrosOnSubmit: false,
+ // Object where you store custom messages to override the default error messages
+ custom_error_messages: {},
+ // true if you want to validate the input fields on blur event
+ binded: true,
+ // set to true if you want to validate the input fields on blur only if the field it's not empty
+ notEmpty: false,
+ // set to true, when the prompt arrow needs to be displayed
+ showArrow: true,
+ // set to false, determines if the prompt arrow should be displayed when validating
+ // checkboxes and radio buttons
+ showArrowOnRadioAndCheckbox: false,
+ // did one of the validation fail ? kept global to stop further ajax validations
+ isError: false,
+ // Limit how many displayed errors a field can have
+ maxErrorsPerField: false,
+
+ // Caches field validation status, typically only bad status are created.
+ // the array is used during ajax form validation to detect issues early and prevent an expensive submit
+ ajaxValidCache: {},
+ // Auto update prompt position after window resize
+ autoPositionUpdate: false,
+
+ InvalidFields: [],
+ onFieldSuccess: false,
+ onFieldFailure: false,
+ onSuccess: false,
+ onFailure: false,
+ validateAttribute: "class",
+ addSuccessCssClassToField: "",
+ addFailureCssClassToField: "",
+
+ // Auto-hide prompt
+ autoHidePrompt: false,
+ // Delay before auto-hide
+ autoHideDelay: 10000,
+ // Fade out duration while hiding the validations
+ fadeDuration: 300,
+ // Use Prettify select library
+ prettySelect: false,
+ // Add css class on prompt
+ addPromptClass: "",
+ // Custom ID uses prefix
+ usePrefix: "",
+ // Custom ID uses suffix
+ useSuffix: "",
+ // Only show one message per error prompt
+ showOneMessage: false
+ }
+ };
+ $(function () { $.validationEngine.defaults.promptPosition = methods.isRTL() ? 'topLeft' : "topRight" });
+})(jQuery);
diff --git a/src/assets/plugins/jQuery-Validation-Engine/js/languages/jquery.validationEngine-zh_CN.js b/src/assets/plugins/jQuery-Validation-Engine/js/languages/jquery.validationEngine-zh_CN.js
new file mode 100644
index 0000000..9435674
--- /dev/null
+++ b/src/assets/plugins/jQuery-Validation-Engine/js/languages/jquery.validationEngine-zh_CN.js
@@ -0,0 +1,181 @@
+(function ($) {
+ $.fn.validationEngineLanguage = function () {
+ };
+ $.validationEngineLanguage = {
+ newLang: function () {
+ $.validationEngineLanguage.allRules = {
+ "required": { // Add your regex rules here, you can take telephone as an example
+ "regex": "none",
+ "alertText": "* 此处不可空白",
+ "alertTextCheckboxMultiple": "* 请选择一个项目",
+ "alertTextCheckboxe": "* 您必须钩选此栏",
+ "alertTextDateRange": "* 日期范围不可空白"
+ },
+ "requiredInFunction": {
+ "func": function (field, rules, i, options) {
+ return (field.val() == "test") ? true : false;
+ },
+ "alertText": "* Field must equal test"
+ },
+ "dateRange": {
+ "regex": "none",
+ "alertText": "* 无效的 ",
+ "alertText2": " 日期范围"
+ },
+ "dateTimeRange": {
+ "regex": "none",
+ "alertText": "* 无效的 ",
+ "alertText2": " 时间范围"
+ },
+ "minSize": {
+ "regex": "none",
+ "alertText": "* 最少 ",
+ "alertText2": " 个字符"
+ },
+ "maxSize": {
+ "regex": "none",
+ "alertText": "* 最多 ",
+ "alertText2": " 个字符"
+ },
+ "groupRequired": {
+ "regex": "none",
+ "alertText": "* 你必需选填其中一个栏位"
+ },
+ "min": {
+ "regex": "none",
+ "alertText": "* 最小值為 "
+ },
+ "max": {
+ "regex": "none",
+ "alertText": "* 最大值为 "
+ },
+ "past": {
+ "regex": "none",
+ "alertText": "* 日期必需早于 "
+ },
+ "future": {
+ "regex": "none",
+ "alertText": "* 日期必需晚于 "
+ },
+ "maxCheckbox": {
+ "regex": "none",
+ "alertText": "* 最多选取 ",
+ "alertText2": " 个项目"
+ },
+ "minCheckbox": {
+ "regex": "none",
+ "alertText": "* 请选择 ",
+ "alertText2": " 个项目"
+ },
+ "equals": {
+ "regex": "none",
+ "alertText": "* 请输入与上面相同的密码"
+ },
+ "creditCard": {
+ "regex": "none",
+ "alertText": "* 无效的信用卡号码"
+ },
+ "phone": {
+ // credit: jquery.h5validate.js / orefalo
+ "regex": /^([\+][0-9]{1,3}([ \.\-])?)?([\(][0-9]{1,6}[\)])?([0-9 \.\-]{1,32})(([A-Za-z \:]{1,11})?[0-9]{1,4}?)$/,
+ "alertText": "* 无效的电话号码"
+ },
+ "email": {
+ // Shamelessly lifted from Scott Gonzalez via the Bassistance Validation plugin http://projects.scottsplayground.com/email_address_validation/
+ "regex": /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i,
+ "alertText": "* 邮件地址无效"
+ },
+ "integer": {
+ "regex": /^[\-\+]?\d+$/,
+ "alertText": "* 不是有效的整数"
+ },
+ "number": {
+ // Number, including positive, negative, and floating decimal. credit: orefalo
+ "regex": /^[\-\+]?((([0-9]{1,3})([,][0-9]{3})*)|([0-9]+))?([\.]([0-9]+))?$/,
+ "alertText": "* 无效的数字"
+ },
+ "date": {
+ "regex": /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/,
+ "alertText": "* 无效的日期,格式必需为 YYYY-MM-DD"
+ },
+ "ipv4": {
+ "regex": /^((([01]?[0-9]{1,2})|(2[0-4][0-9])|(25[0-5]))[.]){3}(([0-1]?[0-9]{1,2})|(2[0-4][0-9])|(25[0-5]))$/,
+ "alertText": "* 无效的 IP 地址"
+ },
+ "url": {
+ "regex": /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i,
+ "alertText": "* Invalid URL"
+ },
+ "onlyNumberSp": {
+ "regex": /^[0-9\ ]+$/,
+ "alertText": "* 只能填数字"
+ },
+ "onlyLetterSp": {
+ "regex": /^[a-zA-Z\ \']+$/,
+ "alertText": "* 只接受英文字母大小写"
+ },
+ "onlyLetterAccentSp": {
+ "regex": /^[a-z\u00C0-\u017F\ ]+$/i,
+ "alertText": "* 只接受英文字母大小写"
+ },
+ "onlyLetterNumber": {
+ "regex": /^[0-9a-zA-Z]+$/,
+ "alertText": "* 不接受特殊字符"
+ },
+ // --- CUSTOM RULES -- Those are specific to the demos, they can be removed or changed to your likings
+ "ajaxUserCall": {
+ "url": "ajaxValidateFieldUser",
+ // you may want to pass extra data on the ajax call
+ "extraData": "name=eric",
+ "alertText": "* 此名称已被其他人使用",
+ "alertTextLoad": "* 正在确认名称是否有其他人使用,请稍等。"
+ },
+ "ajaxUserCallPhp": {
+ "url": "phpajax/ajaxValidateFieldUser.php",
+ // you may want to pass extra data on the ajax call
+ "extraData": "name=eric",
+ // if you provide an "alertTextOk", it will show as a green prompt when the field validates
+ "alertTextOk": "* 此帐号名称可以使用",
+ "alertText": "* 此名称已被其他人使用",
+ "alertTextLoad": "* 正在确认帐号名称是否有其他人使用,请稍等。"
+ },
+ "ajaxNameCall": {
+ // remote json service location
+ "url": "ajaxValidateFieldName",
+ // error
+ "alertText": "* 此名称可以使用",
+ // if you provide an "alertTextOk", it will show as a green prompt when the field validates
+ "alertTextOk": "* 此名称已被其他人使用",
+ // speaks by itself
+ "alertTextLoad": "* 正在确认名称是否有其他人使用,请稍等。"
+ },
+ "ajaxNameCallPhp": {
+ // remote json service location
+ "url": "phpajax/ajaxValidateFieldName.php",
+ // error
+ "alertText": "* 此名称已被其他人使用",
+ // speaks by itself
+ "alertTextLoad": "* 正在确认名称是否有其他人使用,请稍等。"
+ },
+ "validate2fields": {
+ "alertText": "* 请输入 HELLO"
+ },
+ //tls warning:homegrown not fielded
+ "dateFormat": {
+ "regex": /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$|^(?:(?:(?:0?[13578]|1[02])(\/|-)31)|(?:(?:0?[1,3-9]|1[0-2])(\/|-)(?:29|30)))(\/|-)(?:[1-9]\d\d\d|\d[1-9]\d\d|\d\d[1-9]\d|\d\d\d[1-9])$|^(?:(?:0?[1-9]|1[0-2])(\/|-)(?:0?[1-9]|1\d|2[0-8]))(\/|-)(?:[1-9]\d\d\d|\d[1-9]\d\d|\d\d[1-9]\d|\d\d\d[1-9])$|^(0?2(\/|-)29)(\/|-)(?:(?:0[48]00|[13579][26]00|[2468][048]00)|(?:\d\d)?(?:0[48]|[2468][048]|[13579][26]))$/,
+ "alertText": "* 无效的日期格式"
+ },
+ //tls warning:homegrown not fielded
+ "dateTimeFormat": {
+ "regex": /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])\s+(1[012]|0?[1-9]){1}:(0?[1-5]|[0-6][0-9]){1}:(0?[0-6]|[0-6][0-9]){1}\s+(am|pm|AM|PM){1}$|^(?:(?:(?:0?[13578]|1[02])(\/|-)31)|(?:(?:0?[1,3-9]|1[0-2])(\/|-)(?:29|30)))(\/|-)(?:[1-9]\d\d\d|\d[1-9]\d\d|\d\d[1-9]\d|\d\d\d[1-9])$|^((1[012]|0?[1-9]){1}\/(0?[1-9]|[12][0-9]|3[01]){1}\/\d{2,4}\s+(1[012]|0?[1-9]){1}:(0?[1-5]|[0-6][0-9]){1}:(0?[0-6]|[0-6][0-9]){1}\s+(am|pm|AM|PM){1})$/,
+ "alertText": "* 无效的日期或时间格式",
+ "alertText2": "可接受的格式: ",
+ "alertText3": "mm/dd/yyyy hh:mm:ss AM|PM 或 ",
+ "alertText4": "yyyy-mm-dd hh:mm:ss AM|PM"
+ }
+ };
+
+ }
+ };
+ $.validationEngineLanguage.newLang();
+})(jQuery);
diff --git a/src/assets/plugins/jquery/jquery.form.js b/src/assets/plugins/jquery/jquery.form.js
new file mode 100644
index 0000000..751a8e7
--- /dev/null
+++ b/src/assets/plugins/jquery/jquery.form.js
@@ -0,0 +1,1280 @@
+/*!
+ * jQuery Form Plugin
+ * version: 3.51.0-2014.06.20
+ * Requires jQuery v1.5 or later
+ * Copyright (c) 2014 M. Alsup
+ * Examples and documentation at: http://malsup.com/jquery/form/
+ * Project repository: https://github.com/malsup/form
+ * Dual licensed under the MIT and GPL licenses.
+ * https://github.com/malsup/form#copyright-and-license
+ */
+/*global ActiveXObject */
+
+// AMD support
+(function (factory) {
+ "use strict";
+ var define;
+ if (typeof define === 'function' && define.amd) {
+ // using AMD; register as anon module
+ define(['jquery'], factory);
+ } else {
+ // no AMD; invoke directly
+ factory((typeof (jQuery) != 'undefined') ? jQuery : window.Zepto);
+ }
+}(function ($) {
+ "use strict";
+
+ /*
+ Usage Note:
+ -----------
+ Do not use both ajaxSubmit and ajaxForm on the same form. These
+ functions are mutually exclusive. Use ajaxSubmit if you want
+ to bind your own submit handler to the form. For example,
+
+ $(document).ready(function() {
+ $('#myForm').on('submit', function(e) {
+ e.preventDefault(); // <-- important
+ $(this).ajaxSubmit({
+ target: '#output'
+ });
+ });
+ });
+
+ Use ajaxForm when you want the plugin to manage all the event binding
+ for you. For example,
+
+ $(document).ready(function() {
+ $('#myForm').ajaxForm({
+ target: '#output'
+ });
+ });
+
+ You can also use ajaxForm with delegation (requires jQuery v1.7+), so the
+ form does not have to exist when you invoke ajaxForm:
+
+ $('#myForm').ajaxForm({
+ delegation: true,
+ target: '#output'
+ });
+
+ When using ajaxForm, the ajaxSubmit function will be invoked for you
+ at the appropriate time.
+ */
+
+ /**
+ * Feature detection
+ */
+ var feature = {};
+ feature.fileapi = $("
").get(0).files !== undefined;
+ feature.formdata = window.FormData !== undefined;
+
+ var hasProp = !!$.fn.prop;
+
+ // attr2 uses prop when it can but checks the return type for
+ // an expected string. this accounts for the case where a form
+ // contains inputs with names like "action" or "method"; in those
+ // cases "prop" returns the element
+ $.fn.attr2 = function () {
+ if (!hasProp) {
+ return this.attr.apply(this, arguments);
+ }
+ var val = this.prop.apply(this, arguments);
+ if ((val && val.jquery) || typeof val === 'string') {
+ return val;
+ }
+ return this.attr.apply(this, arguments);
+ };
+
+ /**
+ * ajaxSubmit() provides a mechanism for immediately submitting
+ * an HTML form using AJAX.
+ */
+ $.fn.ajaxSubmit = function (options) {
+ /*jshint scripturl:true */
+
+ // fast fail if nothing selected (http://dev.jquery.com/ticket/2752)
+ if (!this.length) {
+ log('ajaxSubmit: skipping submit process - no element selected');
+ return this;
+ }
+
+ var method, action, url, $form = this;
+
+ if (typeof options == 'function') {
+ options = { success: options };
+ }
+ else if (options === undefined) {
+ options = {};
+ }
+
+ method = options.type || this.attr2('method');
+ action = options.url || this.attr2('action');
+
+ url = (typeof action === 'string') ? $.trim(action) : '';
+ url = url || window.location.href || '';
+ if (url) {
+ // clean url (don't include hash vaue)
+ url = (url.match(/^([^#]+)/) || [])[1];
+ }
+
+ options = $.extend(true, {
+ url: url,
+ success: $.ajaxSettings.success,
+ type: method || $.ajaxSettings.type,
+ iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank'
+ }, options);
+
+ // hook for manipulating the form data before it is extracted;
+ // convenient for use with rich editors like tinyMCE or FCKEditor
+ var veto = {};
+ this.trigger('form-pre-serialize', [this, options, veto]);
+ if (veto.veto) {
+ log('ajaxSubmit: submit vetoed via form-pre-serialize trigger');
+ return this;
+ }
+
+ // provide opportunity to alter form data before it is serialized
+ if (options.beforeSerialize && options.beforeSerialize(this, options) === false) {
+ log('ajaxSubmit: submit aborted via beforeSerialize callback');
+ return this;
+ }
+
+ var traditional = options.traditional;
+ if (traditional === undefined) {
+ traditional = $.ajaxSettings.traditional;
+ }
+
+ var elements = [];
+ var qx, a = this.formToArray(options.semantic, elements);
+ if (options.data) {
+ options.extraData = options.data;
+ qx = $.param(options.data, traditional);
+ }
+
+ // give pre-submit callback an opportunity to abort the submit
+ if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) {
+ log('ajaxSubmit: submit aborted via beforeSubmit callback');
+ return this;
+ }
+
+ // fire vetoable 'validate' event
+ this.trigger('form-submit-validate', [a, this, options, veto]);
+ if (veto.veto) {
+ log('ajaxSubmit: submit vetoed via form-submit-validate trigger');
+ return this;
+ }
+
+ var q = $.param(a, traditional);
+ if (qx) {
+ q = (q ? (q + '&' + qx) : qx);
+ }
+ if (options.type.toUpperCase() == 'GET') {
+ options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q;
+ options.data = null; // data is null for 'get'
+ }
+ else {
+ options.data = q; // data is the query string for 'post'
+ }
+
+ var callbacks = [];
+ if (options.resetForm) {
+ callbacks.push(function () { $form.resetForm(); });
+ }
+ if (options.clearForm) {
+ callbacks.push(function () { $form.clearForm(options.includeHidden); });
+ }
+
+ // perform a load on the target only if dataType is not provided
+ if (!options.dataType && options.target) {
+ var oldSuccess = options.success || function () { };
+ callbacks.push(function (data) {
+ var fn = options.replaceTarget ? 'replaceWith' : 'html';
+ $(options.target)[fn](data).each(oldSuccess, arguments);
+ });
+ }
+ else if (options.success) {
+ callbacks.push(options.success);
+ }
+
+ options.success = function (data, status, xhr) { // jQuery 1.4+ passes xhr as 3rd arg
+ var context = options.context || this; // jQuery 1.4+ supports scope context
+ for (var i = 0, max = callbacks.length; i < max; i++) {
+ callbacks[i].apply(context, [data, status, xhr || $form, $form]);
+ }
+ };
+
+ if (options.error) {
+ var oldError = options.error;
+ options.error = function (xhr, status, error) {
+ var context = options.context || this;
+ oldError.apply(context, [xhr, status, error, $form]);
+ };
+ }
+
+ if (options.complete) {
+ var oldComplete = options.complete;
+ options.complete = function (xhr, status) {
+ var context = options.context || this;
+ oldComplete.apply(context, [xhr, status, $form]);
+ };
+ }
+
+ // are there files to upload?
+
+ // [value] (issue #113), also see comment:
+ // https://github.com/malsup/form/commit/588306aedba1de01388032d5f42a60159eea9228#commitcomment-2180219
+ var fileInputs = $('input[type=file]:enabled', this).filter(function () { return $(this).val() !== ''; });
+
+ var hasFileInputs = fileInputs.length > 0;
+ var mp = 'multipart/form-data';
+ var multipart = ($form.attr('enctype') == mp || $form.attr('encoding') == mp);
+
+ var fileAPI = feature.fileapi && feature.formdata;
+ log("fileAPI :" + fileAPI);
+ var shouldUseFrame = (hasFileInputs || multipart) && !fileAPI;
+
+ var jqxhr;
+
+ // options.iframe allows user to force iframe mode
+ // 06-NOV-09: now defaulting to iframe mode if file input is detected
+ if (options.iframe !== false && (options.iframe || shouldUseFrame)) {
+ // hack to fix Safari hang (thanks to Tim Molendijk for this)
+ // see: http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d
+ if (options.closeKeepAlive) {
+ $.get(options.closeKeepAlive, function () {
+ jqxhr = fileUploadIframe(a);
+ });
+ }
+ else {
+ jqxhr = fileUploadIframe(a);
+ }
+ }
+ else if ((hasFileInputs || multipart) && fileAPI) {
+ jqxhr = fileUploadXhr(a);
+ }
+ else {
+ jqxhr = $.ajax(options);
+ }
+
+ $form.removeData('jqxhr').data('jqxhr', jqxhr);
+
+ // clear element array
+ for (var k = 0; k < elements.length; k++) {
+ elements[k] = null;
+ }
+
+ // fire 'notify' event
+ this.trigger('form-submit-notify', [this, options]);
+ return this;
+
+ // utility fn for deep serialization
+ function deepSerialize(extraData) {
+ var serialized = $.param(extraData, options.traditional).split('&');
+ var len = serialized.length;
+ var result = [];
+ var i, part;
+ for (i = 0; i < len; i++) {
+ // #252; undo param space replacement
+ serialized[i] = serialized[i].replace(/\+/g, ' ');
+ part = serialized[i].split('=');
+ // #278; use array instead of object storage, favoring array serializations
+ result.push([decodeURIComponent(part[0]), decodeURIComponent(part[1])]);
+ }
+ return result;
+ }
+
+ // XMLHttpRequest Level 2 file uploads (big hat tip to francois2metz)
+ function fileUploadXhr(a) {
+ var formdata = new FormData();
+
+ for (var i = 0; i < a.length; i++) {
+ formdata.append(a[i].name, a[i].value);
+ }
+
+ if (options.extraData) {
+ var serializedData = deepSerialize(options.extraData);
+ for (i = 0; i < serializedData.length; i++) {
+ if (serializedData[i]) {
+ formdata.append(serializedData[i][0], serializedData[i][1]);
+ }
+ }
+ }
+
+ options.data = null;
+
+ var s = $.extend(true, {}, $.ajaxSettings, options, {
+ contentType: false,
+ processData: false,
+ cache: false,
+ type: method || 'POST'
+ });
+
+ if (options.uploadProgress) {
+ // workaround because jqXHR does not expose upload property
+ s.xhr = function () {
+ var xhr = $.ajaxSettings.xhr();
+ if (xhr.upload) {
+ xhr.upload.addEventListener('progress', function (event) {
+ var percent = 0;
+ var position = event.loaded || event.position; /*event.position is deprecated*/
+ var total = event.total;
+ if (event.lengthComputable) {
+ percent = Math.ceil(position / total * 100);
+ }
+ options.uploadProgress(event, position, total, percent);
+ }, false);
+ }
+ return xhr;
+ };
+ }
+
+ s.data = null;
+ var beforeSend = s.beforeSend;
+ s.beforeSend = function (xhr, o) {
+ //Send FormData() provided by user
+ if (options.formData) {
+ o.data = options.formData;
+ }
+ else {
+ o.data = formdata;
+ }
+ if (beforeSend) {
+ beforeSend.call(this, xhr, o);
+ }
+ };
+ return $.ajax(s);
+ }
+
+ // private function for handling file uploads (hat tip to YAHOO!)
+ function fileUploadIframe(a) {
+ var form = $form[0], el, i, s, g, id, $io, io, xhr, sub, n, timedOut, timeoutHandle;
+ var deferred = $.Deferred();
+
+ // #341
+ deferred.abort = function (status) {
+ xhr.abort(status);
+ };
+
+ if (a) {
+ // ensure that every serialized input is still enabled
+ for (i = 0; i < elements.length; i++) {
+ el = $(elements[i]);
+ if (hasProp) {
+ el.prop('disabled', false);
+ }
+ else {
+ el.removeAttr('disabled');
+ }
+ }
+ }
+
+ s = $.extend(true, {}, $.ajaxSettings, options);
+ s.context = s.context || s;
+ id = 'jqFormIO' + (new Date().getTime());
+ if (s.iframeTarget) {
+ $io = $(s.iframeTarget);
+ n = $io.attr2('name');
+ if (!n) {
+ $io.attr2('name', id);
+ }
+ else {
+ id = n;
+ }
+ }
+ else {
+ $io = $('
');
+ $io.css({ position: 'absolute', top: '-1000px', left: '-1000px' });
+ }
+ io = $io[0];
+
+
+ xhr = { // mock object
+ aborted: 0,
+ responseText: null,
+ responseXML: null,
+ status: 0,
+ statusText: 'n/a',
+ getAllResponseHeaders: function () { },
+ getResponseHeader: function () { },
+ setRequestHeader: function () { },
+ abort: function (status) {
+ var e = (status === 'timeout' ? 'timeout' : 'aborted');
+ log('aborting upload... ' + e);
+ this.aborted = 1;
+
+ try { // #214, #257
+ if (io.contentWindow.document.execCommand) {
+ io.contentWindow.document.execCommand('Stop');
+ }
+ }
+ catch (e) {
+ console.error(e);
+ }
+
+ $io.attr('src', s.iframeSrc); // abort op in progress
+ xhr.error = e;
+ if (s.error) {
+ s.error.call(s.context, xhr, e, status);
+ }
+ if (g) {
+ $.event.trigger("ajaxError", [xhr, s, e]);
+ }
+ if (s.complete) {
+ s.complete.call(s.context, xhr, e);
+ }
+ }
+ };
+
+ g = s.global;
+ // trigger ajax global events so that activity/block indicators work like normal
+ if (g && 0 === $.active++) {
+ $.event.trigger("ajaxStart");
+ }
+ if (g) {
+ $.event.trigger("ajaxSend", [xhr, s]);
+ }
+
+ if (s.beforeSend && s.beforeSend.call(s.context, xhr, s) === false) {
+ if (s.global) {
+ $.active--;
+ }
+ deferred.reject();
+ return deferred;
+ }
+ if (xhr.aborted) {
+ deferred.reject();
+ return deferred;
+ }
+
+ // add submitting element to data if we know it
+ sub = form.clk;
+ if (sub) {
+ n = sub.name;
+ if (n && !sub.disabled) {
+ s.extraData = s.extraData || {};
+ s.extraData[n] = sub.value;
+ if (sub.type == "image") {
+ s.extraData[n + '.x'] = form.clk_x;
+ s.extraData[n + '.y'] = form.clk_y;
+ }
+ }
+ }
+
+ var CLIENT_TIMEOUT_ABORT = 1;
+ var SERVER_ABORT = 2;
+
+ function getDoc(frame) {
+ /* it looks like contentWindow or contentDocument do not
+ * carry the protocol property in ie8, when running under ssl
+ * frame.document is the only valid response document, since
+ * the protocol is know but not on the other two objects. strange?
+ * "Same origin policy" http://en.wikipedia.org/wiki/Same_origin_policy
+ */
+
+ var doc = null;
+
+ // IE8 cascading access check
+ try {
+ if (frame.contentWindow) {
+ doc = frame.contentWindow.document;
+ }
+ } catch (err) {
+ // IE8 access denied under ssl & missing protocol
+ log('cannot get iframe.contentWindow document: ' + err);
+ }
+
+ if (doc) { // successful getting content
+ return doc;
+ }
+
+ try { // simply checking may throw in ie8 under ssl or mismatched protocol
+ doc = frame.contentDocument ? frame.contentDocument : frame.document;
+ } catch (err) {
+ // last attempt
+ log('cannot get iframe.contentDocument: ' + err);
+ doc = frame.document;
+ }
+ return doc;
+ }
+
+ // Rails CSRF hack (thanks to Yvan Barthelemy)
+ var csrf_token = $('meta[name=csrf-token]').attr('content');
+ var csrf_param = $('meta[name=csrf-param]').attr('content');
+ if (csrf_param && csrf_token) {
+ s.extraData = s.extraData || {};
+ s.extraData[csrf_param] = csrf_token;
+ }
+
+ // take a breath so that pending repaints get some cpu time before the upload starts
+ function doSubmit() {
+ // make sure form attrs are set
+ var t = $form.attr2('target'),
+ a = $form.attr2('action'),
+ mp = 'multipart/form-data',
+ et = $form.attr('enctype') || $form.attr('encoding') || mp;
+
+ // update form attrs in IE friendly way
+ form.setAttribute('target', id);
+ if (!method || /post/i.test(method)) {
+ form.setAttribute('method', 'POST');
+ }
+ if (a != s.url) {
+ form.setAttribute('action', s.url);
+ }
+
+ // ie borks in some cases when setting encoding
+ if (!s.skipEncodingOverride && (!method || /post/i.test(method))) {
+ $form.attr({
+ encoding: 'multipart/form-data',
+ enctype: 'multipart/form-data'
+ });
+ }
+
+ // support timout
+ if (s.timeout) {
+ timeoutHandle = setTimeout(function () { timedOut = true; cb(CLIENT_TIMEOUT_ABORT); }, s.timeout);
+ }
+
+ // look for server aborts
+ function checkState() {
+ try {
+ var state = getDoc(io).readyState;
+ log('state = ' + state);
+ if (state && state.toLowerCase() == 'uninitialized') {
+ setTimeout(checkState, 50);
+ }
+ }
+ catch (e) {
+ log('Server abort: ', e, ' (', e.name, ')');
+ cb(SERVER_ABORT);
+ if (timeoutHandle) {
+ clearTimeout(timeoutHandle);
+ }
+ timeoutHandle = undefined;
+ }
+ }
+
+ // add "extra" data to form if provided in options
+ var extraInputs = [];
+ try {
+ if (s.extraData) {
+ for (var n in s.extraData) {
+ if (Object.prototype.hasOwnProperty.call(s.extraData, n)) {
+ // if using the $.param format that allows for multiple values with the same name
+ if ($.isPlainObject(s.extraData[n])
+ && Object.prototype.hasOwnProperty.call(s.extraData[n], 'name')
+ && Object.prototype.hasOwnProperty.call(s.extraData[n], 'value')) {
+ extraInputs.push(
+ $('
').val(s.extraData[n].value)
+ .appendTo(form)[0]);
+ } else {
+ extraInputs.push(
+ $('
').val(s.extraData[n])
+ .appendTo(form)[0]);
+ }
+ }
+ }
+ }
+
+ if (!s.iframeTarget) {
+ // add iframe to doc and submit the form
+ $io.appendTo('body');
+ }
+ if (io.attachEvent) {
+ io.attachEvent('onload', cb);
+ }
+ else {
+ io.addEventListener('load', cb, false);
+ }
+ setTimeout(checkState, 15);
+
+ try {
+ form.submit();
+ } catch (err) {
+ // just in case form has element with name/id of 'submit'
+ var submitFn = document.createElement('form').submit;
+ submitFn.apply(form);
+ }
+ }
+ finally {
+ // reset attrs and remove "extra" input elements
+ form.setAttribute('action', a);
+ form.setAttribute('enctype', et); // #380
+ if (t) {
+ form.setAttribute('target', t);
+ } else {
+ $form.removeAttr('target');
+ }
+ $(extraInputs).remove();
+ }
+ }
+
+ if (s.forceSync) {
+ doSubmit();
+ }
+ else {
+ setTimeout(doSubmit, 10); // this lets dom updates render
+ }
+
+ var data, doc, domCheckCount = 50, callbackProcessed;
+
+ function cb(e) {
+ if (xhr.aborted || callbackProcessed) {
+ return;
+ }
+
+ doc = getDoc(io);
+ if (!doc) {
+ log('cannot access response document');
+ e = SERVER_ABORT;
+ }
+ if (e === CLIENT_TIMEOUT_ABORT && xhr) {
+ xhr.abort('timeout');
+ deferred.reject(xhr, 'timeout');
+ return;
+ }
+ else if (e == SERVER_ABORT && xhr) {
+ xhr.abort('server abort');
+ deferred.reject(xhr, 'error', 'server abort');
+ return;
+ }
+
+ if (!doc || doc.location.href == s.iframeSrc) {
+ // response not received yet
+ if (!timedOut) {
+ return;
+ }
+ }
+ if (io.detachEvent) {
+ io.detachEvent('onload', cb);
+ }
+ else {
+ io.removeEventListener('load', cb, false);
+ }
+
+ var status = 'success', errMsg;
+ try {
+ if (timedOut) {
+ throw 'timeout';
+ }
+
+ var isXml = s.dataType == 'xml' || doc.XMLDocument || $.isXMLDoc(doc);
+ log('isXml=' + isXml);
+ if (!isXml && window.opera && (doc.body === null || !doc.body.innerHTML)) {
+ if (--domCheckCount) {
+ // in some browsers (Opera) the iframe DOM is not always traversable when
+ // the onload callback fires, so we loop a bit to accommodate
+ log('requeing onLoad callback, DOM not available');
+ setTimeout(cb, 250);
+ return;
+ }
+ // let this fall through because server response could be an empty document
+ //log('Could not access iframe DOM after mutiple tries.');
+ //throw 'DOMException: not available';
+ }
+
+ //log('response detected');
+ var docRoot = doc.body ? doc.body : doc.documentElement;
+ xhr.responseText = docRoot ? docRoot.innerHTML : null;
+ xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc;
+ if (isXml) {
+ s.dataType = 'xml';
+ }
+ xhr.getResponseHeader = function (header) {
+ var headers = { 'content-type': s.dataType };
+ return headers[header.toLowerCase()];
+ };
+ // support for XHR 'status' & 'statusText' emulation :
+ if (docRoot) {
+ xhr.status = Number(docRoot.getAttribute('status')) || xhr.status;
+ xhr.statusText = docRoot.getAttribute('statusText') || xhr.statusText;
+ }
+
+ var dt = (s.dataType || '').toLowerCase();
+ var scr = /(json|script|text)/.test(dt);
+ if (scr || s.textarea) {
+ // see if user embedded response in textarea
+ var ta = doc.getElementsByTagName('textarea')[0];
+ if (ta) {
+ xhr.responseText = ta.value;
+ // support for XHR 'status' & 'statusText' emulation :
+ xhr.status = Number(ta.getAttribute('status')) || xhr.status;
+ xhr.statusText = ta.getAttribute('statusText') || xhr.statusText;
+ }
+ else if (scr) {
+ // account for browsers injecting pre around json response
+ var pre = doc.getElementsByTagName('pre')[0];
+ var b = doc.getElementsByTagName('body')[0];
+ if (pre) {
+ xhr.responseText = pre.textContent ? pre.textContent : pre.innerText;
+ }
+ else if (b) {
+ xhr.responseText = b.textContent ? b.textContent : b.innerText;
+ }
+ }
+ }
+ else if (dt == 'xml' && !xhr.responseXML && xhr.responseText) {
+ xhr.responseXML = toXml(xhr.responseText);
+ }
+
+ try {
+ data = httpData(xhr, dt, s);
+ }
+ catch (err) {
+ status = 'parsererror';
+ xhr.error = errMsg = (err || status);
+ }
+ }
+ catch (err) {
+ log('error caught: ', err);
+ status = 'error';
+ xhr.error = errMsg = (err || status);
+ }
+
+ if (xhr.aborted) {
+ log('upload aborted');
+ status = null;
+ }
+
+ if (xhr.status) { // we've set xhr.status
+ status = (xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) ? 'success' : 'error';
+ }
+
+ // ordering of these callbacks/triggers is odd, but that's how $.ajax does it
+ if (status === 'success') {
+ if (s.success) {
+ s.success.call(s.context, data, 'success', xhr);
+ }
+ deferred.resolve(xhr.responseText, 'success', xhr);
+ if (g) {
+ $.event.trigger("ajaxSuccess", [xhr, s]);
+ }
+ }
+ else if (status) {
+ if (errMsg === undefined) {
+ errMsg = xhr.statusText;
+ }
+ if (s.error) {
+ s.error.call(s.context, xhr, status, errMsg);
+ }
+ deferred.reject(xhr, 'error', errMsg);
+ if (g) {
+ $.event.trigger("ajaxError", [xhr, s, errMsg]);
+ }
+ }
+
+ if (g) {
+ $.event.trigger("ajaxComplete", [xhr, s]);
+ }
+
+ if (g && ! --$.active) {
+ $.event.trigger("ajaxStop");
+ }
+
+ if (s.complete) {
+ s.complete.call(s.context, xhr, status);
+ }
+
+ callbackProcessed = true;
+ if (s.timeout) {
+ clearTimeout(timeoutHandle);
+ }
+
+ // clean up
+ setTimeout(function () {
+ if (!s.iframeTarget) {
+ $io.remove();
+ }
+ else { //adding else to clean up existing iframe response.
+ $io.attr('src', s.iframeSrc);
+ }
+ xhr.responseXML = null;
+ }, 100);
+ }
+
+ var toXml = $.parseXML || function (s, doc) { // use parseXML if available (jQuery 1.5+)
+ if (window.ActiveXObject) {
+ doc = new ActiveXObject('Microsoft.XMLDOM');
+ doc.async = 'false';
+ doc.loadXML(s);
+ }
+ else {
+ doc = (new DOMParser()).parseFromString(s, 'text/xml');
+ }
+ return (doc && doc.documentElement && doc.documentElement.nodeName != 'parsererror') ? doc : null;
+ };
+ var parseJSON = $.parseJSON || function (s) {
+ /*jslint evil:true */
+ return window['eval']('(' + s + ')');
+ };
+
+ var httpData = function (xhr, type, s) { // mostly lifted from jq1.4.4
+
+ var ct = xhr.getResponseHeader('content-type') || '',
+ xml = type === 'xml' || !type && ct.indexOf('xml') >= 0,
+ data = xml ? xhr.responseXML : xhr.responseText;
+
+ if (xml && data.documentElement.nodeName === 'parsererror') {
+ if ($.error) {
+ $.error('parsererror');
+ }
+ }
+ if (s && s.dataFilter) {
+ data = s.dataFilter(data, type);
+ }
+ if (typeof data === 'string') {
+ if (type === 'json' || !type && ct.indexOf('json') >= 0) {
+ data = parseJSON(data);
+ } else if (type === "script" || !type && ct.indexOf("javascript") >= 0) {
+ $.globalEval(data);
+ }
+ }
+ return data;
+ };
+
+ return deferred;
+ }
+ };
+
+ /**
+ * ajaxForm() provides a mechanism for fully automating form submission.
+ *
+ * The advantages of using this method instead of ajaxSubmit() are:
+ *
+ * 1: This method will include coordinates for
elements (if the element
+ * is used to submit the form).
+ * 2. This method will include the submit element's name/value data (for the element that was
+ * used to submit the form).
+ * 3. This method binds the submit() method to the form for you.
+ *
+ * The options argument for ajaxForm works exactly as it does for ajaxSubmit. ajaxForm merely
+ * passes the options argument along after properly binding events for submit elements and
+ * the form itself.
+ */
+ $.fn.ajaxForm = function (options) {
+ options = options || {};
+ options.delegation = options.delegation && $.isFunction($.fn.on);
+
+ // in jQuery 1.3+ we can fix mistakes with the ready state
+ if (!options.delegation && this.length === 0) {
+ var o = { s: this.selector, c: this.context };
+ if (!$.isReady && o.s) {
+ log('DOM not ready, queuing ajaxForm');
+ $(function () {
+ $(o.s, o.c).ajaxForm(options);
+ });
+ return this;
+ }
+ // is your DOM ready? http://docs.jquery.com/Tutorials:Introducing_$(document).ready()
+ log('terminating; zero elements found by selector' + ($.isReady ? '' : ' (DOM not ready)'));
+ return this;
+ }
+
+ if (options.delegation) {
+ $(document)
+ .off('submit.form-plugin', this.selector, doAjaxSubmit)
+ .off('click.form-plugin', this.selector, captureSubmittingElement)
+ .on('submit.form-plugin', this.selector, options, doAjaxSubmit)
+ .on('click.form-plugin', this.selector, options, captureSubmittingElement);
+ return this;
+ }
+
+ return this.ajaxFormUnbind()
+ .bind('submit.form-plugin', options, doAjaxSubmit)
+ .bind('click.form-plugin', options, captureSubmittingElement);
+ };
+
+ // private event handlers
+ function doAjaxSubmit(e) {
+ /*jshint validthis:true */
+ var options = e.data;
+ if (!e.isDefaultPrevented()) { // if event has been canceled, don't proceed
+ e.preventDefault();
+ $(e.target).ajaxSubmit(options); // #365
+ }
+ }
+
+ function captureSubmittingElement(e) {
+ /*jshint validthis:true */
+ var target = e.target;
+ var $el = $(target);
+ if (!($el.is("[type=submit],[type=image]"))) {
+ // is this a child element of the submit el? (ex: a span within a button)
+ var t = $el.closest('[type=submit]');
+ if (t.length === 0) {
+ return;
+ }
+ target = t[0];
+ }
+ var form = this;
+ form.clk = target;
+ if (target.type == 'image') {
+ if (e.offsetX !== undefined) {
+ form.clk_x = e.offsetX;
+ form.clk_y = e.offsetY;
+ } else if (typeof $.fn.offset == 'function') {
+ var offset = $el.offset();
+ form.clk_x = e.pageX - offset.left;
+ form.clk_y = e.pageY - offset.top;
+ } else {
+ form.clk_x = e.pageX - target.offsetLeft;
+ form.clk_y = e.pageY - target.offsetTop;
+ }
+ }
+ // clear form vars
+ setTimeout(function () { form.clk = form.clk_x = form.clk_y = null; }, 100);
+ }
+
+
+ // ajaxFormUnbind unbinds the event handlers that were bound by ajaxForm
+ $.fn.ajaxFormUnbind = function () {
+ return this.unbind('submit.form-plugin click.form-plugin');
+ };
+
+ /**
+ * formToArray() gathers form element data into an array of objects that can
+ * be passed to any of the following ajax functions: $.get, $.post, or load.
+ * Each object in the array has both a 'name' and 'value' property. An example of
+ * an array for a simple login form might be:
+ *
+ * [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ]
+ *
+ * It is this array that is passed to pre-submit callback functions provided to the
+ * ajaxSubmit() and ajaxForm() methods.
+ */
+ $.fn.formToArray = function (semantic, elements) {
+ var a = [];
+ if (this.length === 0) {
+ return a;
+ }
+
+ var form = this[0];
+ var formId = this.attr('id');
+ var els = semantic ? form.getElementsByTagName('*') : form.elements;
+ var els2;
+
+ if (els && !/MSIE [678]/.test(navigator.userAgent)) { // #390
+ els = $(els).get(); // convert to standard array
+ }
+
+ // #386; account for inputs outside the form which use the 'form' attribute
+ if (formId) {
+ els2 = $(':input[form="' + formId + '"]').get(); // hat tip @thet
+ if (els2.length) {
+ els = (els || []).concat(els2);
+ }
+ }
+
+ if (!els || !els.length) {
+ return a;
+ }
+
+ var i, j, n, v, el, max, jmax;
+ for (i = 0, max = els.length; i < max; i++) {
+ el = els[i];
+ n = el.name;
+ if (!n || el.disabled) {
+ continue;
+ }
+
+ if (semantic && form.clk && el.type == "image") {
+ // handle image inputs on the fly when semantic == true
+ if (form.clk == el) {
+ a.push({ name: n, value: $(el).val(), type: el.type });
+ a.push({ name: n + '.x', value: form.clk_x }, { name: n + '.y', value: form.clk_y });
+ }
+ continue;
+ }
+
+ v = $.fieldValue(el, true);
+ if (v && v.constructor == Array) {
+ if (elements) {
+ elements.push(el);
+ }
+ for (j = 0, jmax = v.length; j < jmax; j++) {
+ a.push({ name: n, value: v[j] });
+ }
+ }
+ else if (feature.fileapi && el.type == 'file') {
+ if (elements) {
+ elements.push(el);
+ }
+ var files = el.files;
+ if (files.length) {
+ for (j = 0; j < files.length; j++) {
+ a.push({ name: n, value: files[j], type: el.type });
+ }
+ }
+ else {
+ // #180
+ a.push({ name: n, value: '', type: el.type });
+ }
+ }
+ else if (v !== null && typeof v != 'undefined') {
+ if (elements) {
+ elements.push(el);
+ }
+ a.push({ name: n, value: v, type: el.type, required: el.required });
+ }
+ }
+
+ if (!semantic && form.clk) {
+ // input type=='image' are not found in elements array! handle it here
+ var $input = $(form.clk), input = $input[0];
+ n = input.name;
+ if (n && !input.disabled && input.type == 'image') {
+ a.push({ name: n, value: $input.val() });
+ a.push({ name: n + '.x', value: form.clk_x }, { name: n + '.y', value: form.clk_y });
+ }
+ }
+ return a;
+ };
+
+ /**
+ * Serializes form data into a 'submittable' string. This method will return a string
+ * in the format: name1=value1&name2=value2
+ */
+ $.fn.formSerialize = function (semantic) {
+ //hand off to jQuery.param for proper encoding
+ return $.param(this.formToArray(semantic));
+ };
+
+ /**
+ * Serializes all field elements in the jQuery object into a query string.
+ * This method will return a string in the format: name1=value1&name2=value2
+ */
+ $.fn.fieldSerialize = function (successful) {
+ var a = [];
+ this.each(function () {
+ var n = this.name;
+ if (!n) {
+ return;
+ }
+ var v = $.fieldValue(this, successful);
+ if (v && v.constructor == Array) {
+ for (var i = 0, max = v.length; i < max; i++) {
+ a.push({ name: n, value: v[i] });
+ }
+ }
+ else if (v !== null && typeof v != 'undefined') {
+ a.push({ name: this.name, value: v });
+ }
+ });
+ //hand off to jQuery.param for proper encoding
+ return $.param(a);
+ };
+
+ /**
+ * Returns the value(s) of the element in the matched set. For example, consider the following form:
+ *
+ *
+ *
+ * var v = $('input[type=text]').fieldValue();
+ * // if no values are entered into the text inputs
+ * v == ['','']
+ * // if values entered into the text inputs are 'foo' and 'bar'
+ * v == ['foo','bar']
+ *
+ * var v = $('input[type=checkbox]').fieldValue();
+ * // if neither checkbox is checked
+ * v === undefined
+ * // if both checkboxes are checked
+ * v == ['B1', 'B2']
+ *
+ * var v = $('input[type=radio]').fieldValue();
+ * // if neither radio is checked
+ * v === undefined
+ * // if first radio is checked
+ * v == ['C1']
+ *
+ * The successful argument controls whether or not the field element must be 'successful'
+ * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
+ * The default value of the successful argument is true. If this value is false the value(s)
+ * for each element is returned.
+ *
+ * Note: This method *always* returns an array. If no valid value can be determined the
+ * array will be empty, otherwise it will contain one or more values.
+ */
+ $.fn.fieldValue = function (successful) {
+ for (var val = [], i = 0, max = this.length; i < max; i++) {
+ var el = this[i];
+ var v = $.fieldValue(el, successful);
+ if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length)) {
+ continue;
+ }
+ if (v.constructor == Array) {
+ $.merge(val, v);
+ }
+ else {
+ val.push(v);
+ }
+ }
+ return val;
+ };
+
+ /**
+ * Returns the value of the field element.
+ */
+ $.fieldValue = function (el, successful) {
+ var n = el.name, t = el.type, tag = el.tagName.toLowerCase();
+ if (successful === undefined) {
+ successful = true;
+ }
+
+ if (successful && (!n || el.disabled || t == 'reset' || t == 'button' ||
+ (t == 'checkbox' || t == 'radio') && !el.checked ||
+ (t == 'submit' || t == 'image') && el.form && el.form.clk != el ||
+ tag == 'select' && el.selectedIndex == -1)) {
+ return null;
+ }
+
+ if (tag == 'select') {
+ var index = el.selectedIndex;
+ if (index < 0) {
+ return null;
+ }
+ var a = [], ops = el.options;
+ var one = (t == 'select-one');
+ var max = (one ? index + 1 : ops.length);
+ for (var i = (one ? index : 0); i < max; i++) {
+ var op = ops[i];
+ if (op.selected) {
+ var v = op.value;
+ if (!v) { // extra pain for IE...
+ v = (op.attributes && op.attributes.value && !(op.attributes.value.specified)) ? op.text : op.value;
+ }
+ if (one) {
+ return v;
+ }
+ a.push(v);
+ }
+ }
+ return a;
+ }
+ return $(el).val();
+ };
+
+ /**
+ * Clears the form data. Takes the following actions on the form's input fields:
+ * - input text fields will have their 'value' property set to the empty string
+ * - select elements will have their 'selectedIndex' property set to -1
+ * - checkbox and radio inputs will have their 'checked' property set to false
+ * - inputs of type submit, button, reset, and hidden will *not* be effected
+ * - button elements will *not* be effected
+ */
+ $.fn.clearForm = function (includeHidden) {
+ return this.each(function () {
+ $('input,select,textarea', this).clearFields(includeHidden);
+ });
+ };
+
+ /**
+ * Clears the selected form elements.
+ */
+ $.fn.clearFields = $.fn.clearInputs = function (includeHidden) {
+ var re = /^(?:color|date|datetime|email|month|number|password|range|search|tel|text|time|url|week)$/i; // 'hidden' is not in this list
+ return this.each(function () {
+ var t = this.type, tag = this.tagName.toLowerCase();
+ if (re.test(t) || tag == 'textarea') {
+ this.value = '';
+ }
+ else if (t == 'checkbox' || t == 'radio') {
+ this.checked = false;
+ }
+ else if (tag == 'select') {
+ this.selectedIndex = -1;
+ }
+ else if (t == "file") {
+ if (/MSIE/.test(navigator.userAgent)) {
+ $(this).replaceWith($(this).clone(true));
+ } else {
+ $(this).val('');
+ }
+ }
+ else if (includeHidden) {
+ // includeHidden can be the value true, or it can be a selector string
+ // indicating a special test; for example:
+ // $('#myForm').clearForm('.special:hidden')
+ // the above would clean hidden inputs that have the class of 'special'
+ if ((includeHidden === true && /hidden/.test(t)) ||
+ (typeof includeHidden == 'string' && $(this).is(includeHidden))) {
+ this.value = '';
+ }
+ }
+ });
+ };
+
+ /**
+ * Resets the form data. Causes all form elements to be reset to their original value.
+ */
+ $.fn.resetForm = function () {
+ return this.each(function () {
+ // guard against an input with the name of 'reset'
+ // note that IE reports the reset function as an 'object'
+ if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType)) {
+ this.reset();
+ }
+ });
+ };
+
+ /**
+ * Enables or disables any matching elements.
+ */
+ $.fn.enable = function (b) {
+ if (b === undefined) {
+ b = true;
+ }
+ return this.each(function () {
+ this.disabled = !b;
+ });
+ };
+
+ /**
+ * Checks/unchecks any matching checkboxes or radio buttons and
+ * selects/deselects and matching option elements.
+ */
+ $.fn.selected = function (select) {
+ if (select === undefined) {
+ select = true;
+ }
+ return this.each(function () {
+ var t = this.type;
+ if (t == 'checkbox' || t == 'radio') {
+ this.checked = select;
+ }
+ else if (this.tagName.toLowerCase() == 'option') {
+ var $sel = $(this).parent('select');
+ if (select && $sel[0] && $sel[0].type == 'select-one') {
+ // deselect all other options
+ $sel.find('option').selected(false);
+ }
+ this.selected = select;
+ }
+ });
+ };
+
+ // expose debug var
+ $.fn.ajaxSubmit.debug = false;
+
+ // helper fn for console logging
+ function log() {
+ if (!$.fn.ajaxSubmit.debug) {
+ return;
+ }
+ var msg = '[jquery.form] ' + Array.prototype.join.call(arguments, '');
+ if (window.console && window.console.log) {
+ window.console.log(msg);
+ }
+ else if (window.opera && window.opera.postError) {
+ window.opera.postError(msg);
+ }
+ }
+
+}));
diff --git a/src/components/footer/index.vue b/src/components/footer/index.vue
new file mode 100644
index 0000000..4ad4340
--- /dev/null
+++ b/src/components/footer/index.vue
@@ -0,0 +1,20 @@
+
+
+
+ Version 2.0.0
+
+ Copyright © 2023 触海网络 . All rights
+ reserved.
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/header/index.vue b/src/components/header/index.vue
new file mode 100644
index 0000000..3b05396
--- /dev/null
+++ b/src/components/header/index.vue
@@ -0,0 +1,95 @@
+
+
+
+
+
+
+ Y M
+
+ 音萌 管理系统
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/maintainer/index.vue b/src/components/maintainer/index.vue
new file mode 100644
index 0000000..65a4df9
--- /dev/null
+++ b/src/components/maintainer/index.vue
@@ -0,0 +1,209 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/constants/global.js b/src/constants/global.js
new file mode 100644
index 0000000..8e805dd
--- /dev/null
+++ b/src/constants/global.js
@@ -0,0 +1,8 @@
+export default {
+ KEY: "ym",
+ EXCLUDES: [
+ "/login/login.action",
+ "/login/sendSmsCode.action",
+ ],
+ NEED_LOGOUT: "needLogout",
+};
\ No newline at end of file
diff --git a/src/css/login.css b/src/css/login.css
new file mode 100644
index 0000000..a9d283d
--- /dev/null
+++ b/src/css/login.css
@@ -0,0 +1,216 @@
+@charset "utf-8";
+
+/* CSS Document */
+.main_box {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ margin-top: -160px;
+ margin-left: -250px;
+ padding: 30px;
+ width: 500px;
+ height: 320px;
+ background: url(../assets/images/login_bg.png);
+ border-radius: 10px;
+}
+
+.main_box .setting {
+ position: absolute;
+ top: 5px;
+ right: 10px;
+ width: 10px;
+ height: 10px;
+}
+
+.main_box .setting a {
+ color: #FF6600;
+}
+
+.main_box .setting a:hover {
+ color: #555;
+}
+
+.login_logo {
+ height: 45px;
+ line-height: 45px;
+ position: relative;
+ text-align: center;
+}
+
+.login_logo img {
+ height: 45px;
+}
+
+.login_msg {
+ text-align: center;
+ font-size: 16px;
+}
+
+.login_form {
+ padding-top: 20px;
+ font-size: 16px;
+}
+
+.login_box .form-control {
+ display: inline-block;
+ zoom: 1;
+ width: auto;
+ font-size: 18px;
+}
+
+.login_box .form-control.x319 {
+ width: 319px;
+ background: rgba(255, 255, 255, 0.6);
+ outline: none;
+ border-color: transparent;
+}
+
+.login_box .form-control.x164 {
+ width: 164px;
+}
+
+.login_box .form-group {
+ margin-bottom: 20px;
+ text-align: center;
+}
+
+.login_box .form-group label.t {
+ /*width: 120px;*/
+ text-align: right;
+ cursor: pointer;
+}
+
+.login_box .form-group.space {
+ padding-top: 15px;
+ border-top: 1px #FFF dotted;
+}
+
+.login_box .form-group img {
+ margin-top: 1px;
+ height: 32px;
+ vertical-align: top;
+}
+
+.login_box .m {
+ cursor: pointer;
+}
+
+.bottom {
+ text-align: center;
+ font-size: 12px;
+}
+
+/* 动态背景设置 */
+#bubble-wrapper {
+ margin: 0;
+ padding: 0;
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ z-index: -1;
+ overflow: hidden;
+ background: linear-gradient(to bottom right, #FFD700,#DAA520);
+}
+
+#bubble-wrapper li {
+ position: absolute;
+ bottom: -160px;
+ width: 40px;
+ height: 40px;
+ background-color: rgba(255, 255, 255, 0.15);
+ list-style: none;
+ animation: square 15s infinite;
+ transition-timing-function: linear;
+}
+
+#bubble-wrapper li:nth-child(1) {
+ left: 10%;
+}
+
+#bubble-wrapper li:nth-child(2) {
+ left: 20%;
+ width: 90px;
+ height: 90px;
+ animation-delay: 2s;
+ animation-duration: 7s;
+}
+
+#bubble-wrapper li:nth-child(3) {
+ left: 25%;
+ animation-delay: 4s;
+}
+
+#bubble-wrapper li:nth-child(4) {
+ left: 40%;
+ width: 60px;
+ height: 60px;
+ animation-duration: 8s;
+ background-color: rgba(255, 255, 255, 0.3);
+}
+
+#bubble-wrapper li:nth-child(5) {
+ left: 70%;
+}
+
+#bubble-wrapper li:nth-child(6) {
+ left: 80%;
+ width: 120px;
+ height: 120px;
+ animation-delay: 3s;
+ background-color: rgba(255, 255, 255, 0.2);
+}
+
+#bubble-wrapper li:nth-child(7) {
+ left: 32%;
+ width: 120px;
+ height: 120px;
+ animation-delay: 2s;
+}
+
+#bubble-wrapper li:nth-child(8) {
+ left: 55%;
+ width: 20px;
+ height: 20px;
+ animation-delay: 4s;
+ animation-duration: 15s;
+}
+
+#bubble-wrapper li:nth-child(9) {
+ left: 25%;
+ width: 30px;
+ height: 30px;
+ animation-delay: 2s;
+ animation-duration: 12s;
+ background-color: rgba(255, 255, 255, 0.3);
+}
+
+#bubble-wrapper li:nth-child(10) {
+ left: 85%;
+ width: 160px;
+ height: 160px;
+ animation-delay: 5s;
+}
+
+@keyframes square {
+ 0% {
+ opacity: 0.5;
+ transform: translateY(0px) rotate(45deg);
+ }
+
+ 25% {
+ opacity: 0.75;
+ transform: translateY(-400px) rotate(90deg)
+ }
+
+ 50% {
+ opacity: 1;
+ transform: translateY(-600px) rotate(135deg);
+ }
+
+ 100% {
+ opacity: 0;
+ transform: translateY(-1000px) rotate(180deg);
+ }
+}
\ No newline at end of file
diff --git a/src/css/main.css b/src/css/main.css
new file mode 100644
index 0000000..62db105
--- /dev/null
+++ b/src/css/main.css
@@ -0,0 +1,9 @@
+@charset "utf-8";
+
+.tbar {
+ margin-top: 8px;
+}
+
+.tbar span {
+ cursor: pointer;
+}
\ No newline at end of file
diff --git a/src/css/supersized.css b/src/css/supersized.css
new file mode 100644
index 0000000..5a78c17
--- /dev/null
+++ b/src/css/supersized.css
@@ -0,0 +1,99 @@
+/*
+
+ Supersized - Fullscreen Slideshow jQuery Plugin
+ Version : 3.2.7
+ Site : www.buildinternet.com/project/supersized
+
+ Author : Sam Dunn
+ Company : One Mighty Roar (www.onemightyroar.com)
+ License : MIT License / GPL License
+
+*/
+
+* {
+ margin: 0;
+ padding: 0;
+}
+
+body {
+ background: #111;
+ height: 100%;
+}
+
+img {
+ border: none;
+}
+
+#supersized {
+ display: block;
+ position: fixed;
+ left: 0;
+ top: 0;
+ overflow: hidden;
+ z-index: -999;
+ height: 100%;
+ width: 100%;
+}
+
+#supersized img {
+ width: auto;
+ height: auto;
+ position: relative;
+ display: none;
+ outline: none;
+ border: none;
+}
+
+#supersized.speed img {
+ -ms-interpolation-mode: nearest-neighbor;
+ image-rendering: -moz-crisp-edges;
+}
+
+/*Speed*/
+
+#supersized.quality img {
+ -ms-interpolation-mode: bicubic;
+ image-rendering: optimizeQuality;
+}
+
+/*Quality*/
+
+#supersized li {
+ display: block;
+ list-style: none;
+ z-index: -30;
+ position: fixed;
+ overflow: hidden;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: #111;
+}
+
+#supersized a {
+ width: 100%;
+ height: 100%;
+ display: block;
+}
+
+#supersized li.prevslide {
+ z-index: -20;
+}
+
+#supersized li.activeslide {
+ z-index: -10;
+}
+
+#supersized li.image-loading img {
+ visibility: hidden;
+}
+
+#supersized li.prevslide img,
+#supersized li.activeslide img {
+ display: inline;
+}
+
+#supersized img {
+ max-width: none !important
+}
\ No newline at end of file
diff --git a/src/main.js b/src/main.js
new file mode 100644
index 0000000..5a31343
--- /dev/null
+++ b/src/main.js
@@ -0,0 +1,52 @@
+import { createApp } from 'vue'
+import App from './App.vue'
+import router from './router'
+import store from './store'
+
+import 'jquery'
+import 'jquery.md5'
+
+import 'bootstrap/dist/css/bootstrap.min.css'
+import 'bootstrap/dist/js/bootstrap.min.js'
+
+import 'font-awesome/css/font-awesome.min.css'
+import 'ionicons/css/ionicons.min.css'
+
+import 'admin-lte/dist/css/AdminLTE.min.css'
+import 'admin-lte/dist/css/skins/skin-yellow-light.min.css'
+import 'admin-lte/dist/js/app.min.js'
+
+import '@/assets/plugins/bootstrap-table/css/bootstrap-table.css'
+import '@/assets/plugins/bootstrap-table/js/bootstrap-table.js'
+import '@/assets/plugins/bootstrap-table/js/locale/bootstrap-table-zh-CN.js'
+import '@/assets/plugins/bootstrap-table/js/extensions/editable/bootstrap-table-editable.js'
+
+import '@/assets/plugins/jquery/jquery.form.js'
+
+import '@/assets/plugins/bootstrap-datepicker/css/datepicker3.css'
+import '@/assets/plugins/bootstrap-datepicker/js/bootstrap-datepicker.js'
+
+import '@/assets/plugins/bootstrap-datetimepicker/css/bootstrap-datetimepicker.css'
+import '@/assets/plugins/bootstrap-datetimepicker/js/bootstrap-datetimepicker.min.js'
+import '@/assets/plugins/bootstrap-datetimepicker/js/locales/bootstrap-datetimepicker.zh-CN.js'
+
+import '@/assets/plugins/bootstrap-combobox/css/bootstrap-combobox.css'
+import '@/assets/plugins/bootstrap-combobox/js/bootstrap-combobox.js'
+import '@/assets/plugins/bootstrap-combobox/js/bootstrap-combobox-helper.js'
+
+import '@/assets/plugins/bootstrap-select/css/bootstrap-select.css'
+import '@/assets/plugins/bootstrap-select/js/bootstrap-select.js'
+
+import '@/assets/plugins/bootstrap-multiselect/css/bootstrap-multiselect.css'
+import '@/assets/plugins/bootstrap-multiselect/js/bootstrap-multiselect.js'
+
+import '@/assets/plugins/jQuery-Validation-Engine/css/validationEngine.jquery.css'
+import '@/assets/plugins/jQuery-Validation-Engine/js/jquery.validationEngine.js'
+import '@/assets/plugins/jQuery-Validation-Engine/js/languages/jquery.validationEngine-zh_CN.js'
+
+import '@/assets/plugins/bootstrap-treeview/css/bootstrap-treeview.min.css'
+import '@/assets/plugins/bootstrap-treeview/js/bootstrap-treeview.min.js'
+
+import components from '@/utils/components.js'
+
+createApp(App).use(store).use(router).use(components).mount('#app')
diff --git a/src/router/index.js b/src/router/index.js
new file mode 100644
index 0000000..7c2ba97
--- /dev/null
+++ b/src/router/index.js
@@ -0,0 +1,29 @@
+import { createRouter, createWebHashHistory } from 'vue-router'
+import HomeView from '../views/home/index.vue'
+import LoginView from '../views/login/index.vue'
+import BlankView from '../views/BlankView.vue'
+
+const routes = [
+ {
+ path: '/',
+ name: 'login',
+ component: LoginView
+ },
+ {
+ path: '/home',
+ name: 'home',
+ component: HomeView
+ },
+ {
+ path: '/blank',
+ name: 'blank',
+ component: BlankView
+ }
+]
+
+const router = createRouter({
+ history: createWebHashHistory(),
+ routes
+})
+
+export default router
diff --git a/src/store/index.js b/src/store/index.js
new file mode 100644
index 0000000..69f5ff4
--- /dev/null
+++ b/src/store/index.js
@@ -0,0 +1,25 @@
+import { createStore } from 'vuex'
+import user from './modules/user'
+import menu from './modules/menu'
+
+export default createStore({
+ state: {
+ },
+ getters: {
+ adminUser: state => state.user,
+ adminId: state => state.user.adminId,
+ username: state => state.user.username,
+ avatar: state => state.user.avatar,
+ lastTime: state => state.user.lastTime,
+ parentMenus: state => state.menu.parentMenus,
+ childMenus: state => state.menu.childMenus,
+ },
+ mutations: {
+ },
+ actions: {
+ },
+ modules: {
+ user,
+ menu,
+ }
+})
diff --git a/src/store/modules/menu.js b/src/store/modules/menu.js
new file mode 100644
index 0000000..59c4d6b
--- /dev/null
+++ b/src/store/modules/menu.js
@@ -0,0 +1,62 @@
+import { getMenuAll } from '@/api/common/menu';
+import { setStore, getStore } from '@/utils/store';
+import { toCamelCase, upperFirst } from '@/utils/string';
+
+export default {
+ state: {
+ parentMenus: getStore({ name: 'parent_menus' }) || [],
+ childMenus: getStore({ name: 'child_menus' }) || [],
+ },
+ mutations: {
+ setParentMenus(state, parentMenus) {
+ state.parentMenus = parentMenus;
+ setStore({
+ name: "parent_menus",
+ content: state.parentMenus,
+ type: "session"
+ });
+ },
+ setChildMenus(state, childMenus) {
+ state.childMenus = childMenus;
+ setStore({
+ name: "child_menus",
+ content: state.childMenus,
+ type: "session"
+ });
+ }
+ },
+ actions: {
+ async getMenu({ commit }) {
+ const res = await getMenuAll();
+ if (res) {
+ const sortBy = (a, b) => {
+ if (a.showorder > b.showorder) {
+ return -1;
+ } else if (a.showorder < b.showorder) {
+ return 1;
+ } else {
+ return a.name.localeCompare(b.name);
+ }
+ };
+ if (res.parents && res.parents.length > 0) {
+ const parents = res.parents.sort(sortBy);
+ commit('setParentMenus', parents);
+ }
+ if (res.childs && res.childs.length > 0) {
+ const childs = res.childs.sort(sortBy);
+ commit('setChildMenus', childs);
+ }
+ }
+ return res;
+ },
+ getViewComponent(context, path) {
+ let component = path;
+ if (path && path.endsWith('.html')) {
+ const pathArray = path.split('/');
+ const routeName = toCamelCase(pathArray[pathArray.length - 1].replace('.html', ''));
+ component = upperFirst(routeName) + 'View';
+ }
+ return component;
+ }
+ },
+};
\ No newline at end of file
diff --git a/src/store/modules/user.js b/src/store/modules/user.js
new file mode 100644
index 0000000..0e5f5fb
--- /dev/null
+++ b/src/store/modules/user.js
@@ -0,0 +1,85 @@
+import router from '@/router';
+import { setStore, getStore } from '@/utils/store';
+import { getUser, logout } from '@/api/common/user';
+import { dateFormat } from '@/utils/date';
+
+import avatar from '@/assets/images/woman.jpg';
+
+export default {
+ state: {
+ adminId: getStore({ name: 'admin_id' }) || 0,
+ username: getStore({ name: 'username' }) || "",
+ avatar: getStore({ name: 'avatar' }) || "",
+ lastTime: getStore({ name: 'last_time' }) || "",
+ },
+ mutations: {
+ updateUser(state, user) {
+ if (user.adminId) {
+ console.log(user.adminId);
+ state.adminId = user.adminId;
+ setStore({
+ name: "admin_id",
+ content: state.adminId,
+ type: "session"
+ });
+ }
+ if (user.username) {
+ console.log(user.username);
+ state.username = user.username;
+ setStore({
+ name: "username",
+ content: state.username,
+ type: "session"
+ });
+ }
+ let userAvatar = user.avatar;
+ if (userAvatar) {
+ if (userAvatar != "") {
+ userAvatar = (userAvatar.startsWith('https') || userAvatar.startsWith('http')) ? userAvatar : avatar;
+ }
+ state.avatar = userAvatar;
+ setStore({
+ name: "avatar",
+ content: state.avatar,
+ type: "session"
+ });
+ }
+ if (user.lastTime) {
+ state.lastTime = user.lastTime;
+ setStore({
+ name: "last_time",
+ content: state.lastTime,
+ type: "session"
+ });
+ }
+ }
+ },
+ actions: {
+ async getUser({ commit }, adminId) {
+ const res = await getUser(adminId);
+ var data = res.entity || {};
+ commit("updateUser", {
+ avatar: data.headimg,
+ lastTime: dateFormat(new Date(data.lastlogin))
+ });
+ return data;
+ },
+ logout({ commit }) {
+ return new Promise((resolve, reject) => {
+ logout()
+ .then(res => {
+ commit("updateUser", {
+ adminId: 0,
+ username: "",
+ avatar: "",
+ lastTime: ""
+ });
+ resolve(res);
+ router.push("/");
+ }).catch(() => {
+ reject();
+ });
+ });
+ }
+ },
+};
\ No newline at end of file
diff --git a/src/utils/ajaxfileupload.js b/src/utils/ajaxfileupload.js
new file mode 100644
index 0000000..4c87d0c
--- /dev/null
+++ b/src/utils/ajaxfileupload.js
@@ -0,0 +1,206 @@
+jQuery.extend({
+ handleError: function (s, xhr, status, e) {
+ // If a local callback was specified, fire it
+ if (s.error) {
+ s.error.call(s.context || s, xhr, status, e);
+ }
+
+ // Fire the global callback
+ if (s.global) {
+ (s.context ? jQuery(s.context) : jQuery.event).trigger("ajaxError", [xhr, s, e]);
+ }
+ },
+ createUploadIframe: function (id, uri) {
+ //create frame
+ var frameId = 'jUploadFrame' + id;
+
+ if (window.ActiveXObject) {
+ var io = document.createElement('
');
+ if (typeof uri == 'boolean') {
+ io.src = 'javascript:false';
+ }
+ else if (typeof uri == 'string') {
+ io.src = uri;
+ }
+ }
+ else {
+ io = document.createElement('iframe');
+ io.id = frameId;
+ io.name = frameId;
+ }
+ io.style.position = 'absolute';
+ io.style.top = '-1000px';
+ io.style.left = '-1000px';
+
+ document.body.appendChild(io);
+
+ return io
+ },
+ createUploadForm: function (id, fileElementId) {
+ //create form
+ var formId = 'jUploadForm' + id;
+ var fileId = 'jUploadFile' + id;
+ var form = $('
');
+ var oldElement = $('#' + fileElementId);
+ var newElement = $(oldElement).clone();
+ $(oldElement).attr('id', fileId);
+ $(oldElement).before(newElement);
+ $(oldElement).appendTo(form);
+ //set attributes
+ $(form).css('position', 'absolute');
+ $(form).css('top', '-1200px');
+ $(form).css('left', '-1200px');
+ $(form).appendTo('body');
+ return form;
+ },
+
+ ajaxFileUpload: function (s) {
+ // TODO introduce global settings, allowing the client to modify them for all requests, not only timeout
+ s = jQuery.extend({}, jQuery.ajaxSettings, s);
+ var id = s.fileElementId;
+ var form = jQuery.createUploadForm(id, s.fileElementId);
+ var io = jQuery.createUploadIframe(id, s.secureuri);
+ var frameId = 'jUploadFrame' + id;
+ var formId = 'jUploadForm' + id;
+ // Watch for a new set of requests
+ if (s.global && !jQuery.active++) {
+ jQuery.event.trigger("ajaxStart");
+ }
+ var requestDone = false;
+ // Create the request object
+ var xml = {}
+ if (s.global)
+ jQuery.event.trigger("ajaxSend", [xml, s]);
+ // Wait for a response to come back
+ var uploadCallback = function (isTimeout) {
+ io = document.getElementById(frameId);
+ try {
+ if (io.contentWindow) {
+ xml.responseText = io.contentWindow.document.body ? io.contentWindow.document.body.innerHTML : null;
+ xml.responseXML = io.contentWindow.document.XMLDocument ? io.contentWindow.document.XMLDocument : io.contentWindow.document;
+
+ } else if (io.contentDocument) {
+ xml.responseText = io.contentDocument.document.body ? io.contentDocument.document.body.innerHTML : null;
+ xml.responseXML = io.contentDocument.document.XMLDocument ? io.contentDocument.document.XMLDocument : io.contentDocument.document;
+ }
+ } catch (e) {
+ jQuery.handleError(s, xml, null, e);
+ }
+ if (xml || isTimeout == "timeout") {
+ requestDone = true;
+ var status;
+ try {
+ status = isTimeout != "timeout" ? "success" : "error";
+ // Make sure that the request was successful or notmodified
+ if (status != "error") {
+ // process the data (runs the xml through httpData regardless of callback)
+ var data = jQuery.uploadHttpData(xml, s.dataType);
+ // If a local callback was specified, fire it and pass it the data
+ if (s.success)
+ s.success(data, status);
+
+ // Fire the global callback
+ if (s.global)
+ jQuery.event.trigger("ajaxSuccess", [xml, s]);
+ } else
+ jQuery.handleError(s, xml, status);
+ } catch (e) {
+ status = "error";
+ jQuery.handleError(s, xml, status, e);
+ }
+
+ // The request was completed
+ if (s.global)
+ jQuery.event.trigger("ajaxComplete", [xml, s]);
+
+ // Handle the global AJAX counter
+ if (s.global && ! --jQuery.active)
+ jQuery.event.trigger("ajaxStop");
+
+ // Process result
+ if (s.complete)
+ s.complete(xml, status);
+
+ jQuery(io).unbind()
+
+ setTimeout(function () {
+ try {
+ $(io).remove();
+ $(form).remove();
+
+ } catch (e) {
+ jQuery.handleError(s, xml, null, e);
+ }
+
+ }, 100)
+
+ xml = null
+
+ }
+ }
+ // Timeout checker
+ if (s.timeout > 0) {
+ setTimeout(function () {
+ // Check to see if the request is still happening
+ if (!requestDone) uploadCallback("timeout");
+ }, s.timeout);
+ }
+ try {
+ // var io = $('#' + frameId);
+ form = $('#' + formId);
+ $(form).attr('action', s.url);
+ $(form).attr('method', 'POST');
+ $(form).attr('target', frameId);
+ if (form.encoding) {
+ form.encoding = 'multipart/form-data';
+ }
+ else {
+ form.enctype = 'multipart/form-data';
+ }
+ $(form).submit();
+
+ } catch (e) {
+ jQuery.handleError(s, xml, null, e);
+ }
+ if (window.attachEvent) {
+ document.getElementById(frameId).attachEvent('onload', uploadCallback);
+ }
+ else {
+ document.getElementById(frameId).addEventListener('load', uploadCallback, false);
+ }
+ return { abort: function () { } };
+
+ },
+
+ uploadHttpData: function (r, type) {
+ var data = !type;
+ data = type == "xml" || data ? r.responseXML : r.responseText;
+ console.log(data);
+ // If the type is "script", eval it in global context
+ if (type == "script")
+ jQuery.globalEval(data);
+ // Get the JavaScript object, if JSON is used.
+ if (type == "json")
+ data = r.responseText;
+ var temp;
+ var start = data.indexOf(">");
+ if (start != -1) {
+ let end = data.indexOf("<", start + 1);
+ if (end != -1) {
+ temp = data.substring(start + 1, end);
+ }
+ }
+ if (!temp) {
+ start = data.indexOf("{");
+ temp = data.substring(start, data.lastIndexOf("}") + 1);
+ }
+ data = temp;
+ eval("data = " + data);
+ // evaluate scripts within html
+ if (type == "html")
+ jQuery("
").html(data).evalScripts();
+ //alert($('param', data).each(function(){alert($(this).attr('value'));}));
+ return data;
+ }
+})
+
diff --git a/src/utils/bootstrap-table-helper.js b/src/utils/bootstrap-table-helper.js
new file mode 100644
index 0000000..29f61ac
--- /dev/null
+++ b/src/utils/bootstrap-table-helper.js
@@ -0,0 +1,42 @@
+export default {
+ idstr: null,
+ // 是否有且只选择了一项
+ isSelectOne: function (idstr) {
+ if ($(idstr).bootstrapTable('getSelections').length == 1) {
+ return true;
+ }
+ return false;
+ },
+ //是否选择了至少一项
+ hasSelectAny: function (idstr) {
+ if ($(idstr).bootstrapTable('getSelections').length > 0) {
+ return true;
+ }
+ return false;
+ },
+ // 获取选择的一项
+ getOneSelectItem: function (idstr) {
+ return $(idstr).bootstrapTable('getSelections')[0];
+ },
+ // 已经选择的记录
+ getAllSelectItems: function (idstr) {
+ return $(idstr).bootstrapTable('getSelections');
+ },
+ getRowByUniqueId: function (idstr, id) {
+ return $(idstr).bootstrapTable('getRowByUniqueId', id);
+ },
+ // 已选择的项数量
+ selectLength: function (idstr) {
+ return $(idstr).bootstrapTable('getSelections').length;
+ },
+ // 刷新
+ doRefresh: function (idstr) {
+ $(idstr).bootstrapTable('refresh');
+ },
+ unCheckAll: function (idstr) {
+ $(idstr).bootstrapTable('uncheckAll');
+ },
+ doRefreshAndToPage1: function (idstr) {
+ $(idstr).bootstrapTable('selectPage', 1);
+ },
+}
\ No newline at end of file
diff --git a/src/utils/components.js b/src/utils/components.js
new file mode 100644
index 0000000..7b3a3cd
--- /dev/null
+++ b/src/utils/components.js
@@ -0,0 +1,14 @@
+export default {
+ install: function (Vue) {
+ const files = require.context('@/views', true, /\.vue$/)
+ let components = {};
+ files.keys().forEach(key => {
+ components[key.replace(/(\.\/|\.vue)/g, '')] = files(key).default;
+ });
+ Object.keys(components).forEach(item => {
+ if (components[item].name) {
+ Vue.component(components[item].name, components[item]);
+ }
+ });
+ },
+}
\ No newline at end of file
diff --git a/src/utils/date.js b/src/utils/date.js
new file mode 100644
index 0000000..e56282d
--- /dev/null
+++ b/src/utils/date.js
@@ -0,0 +1,49 @@
+export const calcDate = (date1, date2) => {
+ var date3 = date2 - date1;
+ var days = Math.floor(date3 / (24 * 3600 * 1000));
+ // 计算天数后剩余的毫秒数
+ var leave1 = date3 % (24 * 3600 * 1000);
+ var hours = Math.floor(leave1 / (3600 * 1000));
+ // 计算小时数后剩余的毫秒数
+ var leave2 = leave1 % (3600 * 1000);
+ var minutes = Math.floor(leave2 / (60 * 1000));
+ // 计算分钟数后剩余的毫秒数
+ var leave3 = leave2 % (60 * 1000);
+ var seconds = Math.round(date3 / 1000);
+ return {
+ leave1,
+ leave2,
+ leave3,
+ days: days,
+ hours: hours,
+ minutes: minutes,
+ seconds: seconds
+ };
+}
+
+/**
+ * 日期格式化
+ */
+export function dateFormat(date) {
+ let format = 'yyyy-MM-dd hh:mm:ss';
+ if (date != 'Invalid Date') {
+ var o = {
+ "M+": date.getMonth() + 1, //month
+ "d+": date.getDate(), //day
+ "h+": date.getHours(), //hour
+ "m+": date.getMinutes(), //minute
+ "s+": date.getSeconds(), //second
+ "q+": Math.floor((date.getMonth() + 3) / 3), //quarter
+ "S": date.getMilliseconds() //millisecond
+ }
+ if (/(y+)/.test(format)) format = format.replace(RegExp.$1,
+ (date.getFullYear() + "").substr(4 - RegExp.$1.length));
+ for (var k in o)
+ if (new RegExp("(" + k + ")").test(format))
+ format = format.replace(RegExp.$1,
+ RegExp.$1.length == 1 ? o[k] :
+ ("00" + o[k]).substr(("" + o[k]).length));
+ return format;
+ }
+ return '';
+}
diff --git a/src/utils/maintainer.js b/src/utils/maintainer.js
new file mode 100644
index 0000000..497ce80
--- /dev/null
+++ b/src/utils/maintainer.js
@@ -0,0 +1,59 @@
+export function showLoading() {
+ $(".loadingGif").css('top', window.innerHeight / 2);
+ $(".loadingGif").css('left', window.innerWidth / 2);
+ $(".loading").css('z-index', 3000);
+ $(".loading").modal('show');
+}
+
+export function hideLoading() {
+ $(".loading").modal('hide');
+}
+
+export function formatTime(val) {
+ var date;
+ if (val) {
+ // 兼容Safari
+ var userAgent = navigator.userAgent;
+ if (userAgent.indexOf('Version') > -1) {
+ date = new Date(val.split('+')[0]);
+ } else {
+ date = new Date(val);
+ }
+ return date.format('yyyy-MM-dd hh:mm:ss');
+ } else {
+ return '';
+ }
+}
+
+export function cleanArray(actual) {
+ const newArray = []
+ for (let i = 0; i < actual.length; i++) {
+ if (actual[i]) {
+ newArray.push(actual[i])
+ }
+ }
+ return newArray
+}
+
+export function serverError(req) {
+ $("#tipMsg").text(req.responseJSON.message);
+ $("#tipModal").modal('show');
+}
+
+export function apiResult(json) {
+ if (json.code == 200 && json.message == 'success') {
+ return true;
+ }
+ $("#tipMsg").text("请求失败,错误信息:" + json.message);
+ $("#tipModal").modal('show');
+ return false;
+}
+
+export function param(json) {
+ if (!json) return ''
+ return cleanArray(Object.keys(json).map(key => {
+ if (json[key] === undefined) return ''
+ return encodeURIComponent(key) + '=' +
+ encodeURIComponent(json[key])
+ })).join('&')
+}
\ No newline at end of file
diff --git a/src/utils/notify.js b/src/utils/notify.js
new file mode 100644
index 0000000..36252d7
--- /dev/null
+++ b/src/utils/notify.js
@@ -0,0 +1,59 @@
+export const notifyNotice = () => {
+ var notifyInterval;
+ console.log(window.Notification.permission);
+ if (window.Notification) {
+ $.ajax({
+ url: "/admin/dynamic/verify/notifySwitch.action",
+ success: function (json) {
+ if (json == 'true') {
+ notifyInterval = setInterval(notify, 50000);
+ console.log('notifyInterval : ' + notifyInterval);
+ }
+ }
+ });
+ } else {
+ alert('浏览器不支持Notification');
+ }
+
+ function notify() {
+ $.ajax({
+ url: "/admin/dynamic/verify/notify.action",
+ success: function (json) {
+ if (json != null && json != "" && json != undefined && json != 'undefined') {
+ var dynamicCount = json.dynamic;
+ var voiceCount = json.voice;
+ if ((dynamicCount != null && dynamicCount > 0) || (voiceCount != null && voiceCount > 0)) {
+ if (Notification.permission == "granted") {
+ popNotice(dynamicCount, voiceCount);
+ } else if (Notification.permission != "denied") {
+ Notification.requestPermission(function (permission) {
+ console.log(permission);
+ popNotice(dynamicCount, voiceCount);
+ });
+ }
+ }
+ }
+ }
+ });
+ }
+
+ function popNotice(dynamic, voice) {
+ if (Notification.permission == "granted") {
+ var bodyStr = '您有';
+ if (dynamic) {
+ bodyStr += '【' + dynamic + '】条待审核动态';
+ }
+ if (voice) {
+ bodyStr += '【' + voice + '】条待审核声音瓶子';
+ }
+ var notification = new Notification("【66后台】系统推送", {
+ body: bodyStr,
+ type: 'info',
+ offset: 100,
+ });
+ notification.onclick = function () {
+ notification.close();
+ };
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/utils/request.js b/src/utils/request.js
new file mode 100644
index 0000000..e1a9113
--- /dev/null
+++ b/src/utils/request.js
@@ -0,0 +1,51 @@
+import axios from "axios";
+import store from "@/store";
+import global from "@/constants/global";
+
+const service = axios.create();
+
+service.interceptors.request.use(config => {
+ return config;
+}, error => {
+ Promise.reject(error);
+});
+
+service.interceptors.response.use(res => {
+ userLogout(res.headers[global.NEED_LOGOUT.toLowerCase()]);
+ return res.data;
+}, error => {
+ return Promise.reject(error);
+});
+
+$.ajaxSetup({
+ headers: {
+ 'Access-Control-Allow-Origin': '*',
+ },
+ beforeSend: function(xhr) {
+ console.log(xhr);
+ },
+ complete: function(xhr) {
+ if (xhr && typeof(xhr.getResponseHeader) == 'function') {
+ userLogout(xhr.getResponseHeader(global.NEED_LOGOUT));
+ }
+ }
+});
+
+/**
+ * 强制退出
+ */
+function userLogout(needLogout) {
+ try {
+ if (global.NEED_LOGOUT == needLogout) {
+ var win = window;
+ while (win != win.top) {
+ win = win.top;
+ }
+ store.dispatch("logout");
+ }
+ } catch (error) {
+ console.error(error);
+ }
+}
+
+export default service;
diff --git a/src/utils/store.js b/src/utils/store.js
new file mode 100644
index 0000000..1f5caa1
--- /dev/null
+++ b/src/utils/store.js
@@ -0,0 +1,118 @@
+import { validateNull } from '@/utils/validate';
+import global from '@/constants/global';
+
+const keyName = global.KEY + '_';
+
+/**
+ * 存储localStorage
+ */
+export const setStore = (params = {}) => {
+ let {
+ name,
+ content,
+ type,
+ } = params;
+ name = keyName + name;
+ let obj = {
+ dataType: typeof (content),
+ content: content,
+ type: type,
+ datetime: new Date().getTime()
+ };
+ if (type) window.sessionStorage.setItem(name, JSON.stringify(obj));
+ else window.localStorage.setItem(name, JSON.stringify(obj));
+}
+
+/**
+ * 获取localStorage
+ */
+export const getStore = (params = {}) => {
+ let {
+ name,
+ debug
+ } = params;
+ name = keyName + name;
+ let obj = {},
+ content;
+ obj = window.sessionStorage.getItem(name);
+ if (validateNull(obj)) obj = window.localStorage.getItem(name);
+ if (validateNull(obj)) return;
+ try {
+ obj = JSON.parse(obj);
+ } catch {
+ return obj;
+ }
+ if (debug) {
+ return obj;
+ }
+ if (obj.dataType == 'string') {
+ content = obj.content;
+ } else if (obj.dataType == 'number') {
+ content = Number(obj.content);
+ } else if (obj.dataType == 'boolean') {
+ content = eval(obj.content);
+ } else if (obj.dataType == 'object') {
+ content = obj.content;
+ }
+ return content;
+}
+
+/**
+ * 删除localStorage
+ */
+export const removeStore = (params = {}) => {
+ let {
+ name,
+ type
+ } = params;
+ name = keyName + name;
+ if (type) {
+ window.sessionStorage.removeItem(name);
+ } else {
+ window.localStorage.removeItem(name);
+ }
+}
+
+/**
+ * 获取全部localStorage
+ */
+export const getAllStore = (params = {}) => {
+ let list = [];
+ let {
+ type
+ } = params;
+ if (type) {
+ for (let i = 0; i <= window.sessionStorage.length; i++) {
+ list.push({
+ name: window.sessionStorage.key(i),
+ content: getStore({
+ name: window.sessionStorage.key(i),
+ type: 'session'
+ })
+ })
+ }
+ } else {
+ for (let i = 0; i <= window.localStorage.length; i++) {
+ list.push({
+ name: window.localStorage.key(i),
+ content: getStore({
+ name: window.localStorage.key(i),
+ })
+ })
+
+ }
+ }
+ return list;
+}
+
+/**
+ * 清空全部localStorage
+ */
+export const clearStore = (params = {}) => {
+ let { type } = params;
+ if (type) {
+ window.sessionStorage.clear();
+ } else {
+ window.localStorage.clear();
+ }
+}
diff --git a/src/utils/string.js b/src/utils/string.js
new file mode 100644
index 0000000..c8fa9c0
--- /dev/null
+++ b/src/utils/string.js
@@ -0,0 +1,29 @@
+/**
+ * 下划线转驼峰
+ */
+export function toCamelCase(str) {
+ return str.replace(/_[a-z]/g, function (s) {
+ return s.substring(1).toUpperCase();
+ });
+}
+
+/**
+ * 首字母大写
+ */
+export function upperFirst(str) {
+ return str.charAt(0).toUpperCase() + str.slice(1);
+}
+
+/**
+ * 首字母小写
+ */
+export function lowerFirst(str) {
+ return str.charAt(0).toLowerCase() + str.slice(1);
+}
+
+/**
+ * 是否为数字
+ */
+export function isNumber(str) {
+ return /^[0-9]+.?[0-9]*/.test(str);
+}
\ No newline at end of file
diff --git a/src/utils/system-helper.js b/src/utils/system-helper.js
new file mode 100644
index 0000000..43edf12
--- /dev/null
+++ b/src/utils/system-helper.js
@@ -0,0 +1,6 @@
+//获取url中的参数
+function getUrlParam(name) {
+ var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); //构造一个含有目标参数的正则表达式对象
+ var r = window.location.search.substr(1).match(reg); //匹配目标参数
+ if (r != null) return unescape(r[2]); return null; //返回参数值
+}
\ No newline at end of file
diff --git a/src/utils/validate.js b/src/utils/validate.js
new file mode 100644
index 0000000..8c6ba00
--- /dev/null
+++ b/src/utils/validate.js
@@ -0,0 +1,20 @@
+/**
+ * 判断是否为空
+ */
+export function validateNull(val) {
+ if (typeof val === 'boolean') {
+ return false;
+ }
+ if (typeof val === 'number') {
+ return false;
+ }
+ if (val instanceof Array) {
+ if (val.length == 0) return true;
+ } else if (val instanceof Object) {
+ if (JSON.stringify(val) === '{}') return true;
+ } else {
+ if (val == 'null' || val == null || val == 'undefined' || val == undefined || val == '') return true;
+ return false;
+ }
+ return false;
+}
\ No newline at end of file
diff --git a/src/views/BlankView.vue b/src/views/BlankView.vue
new file mode 100644
index 0000000..20806a7
--- /dev/null
+++ b/src/views/BlankView.vue
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/OperationSmsAdminView.vue b/src/views/OperationSmsAdminView.vue
new file mode 100644
index 0000000..c392ea5
--- /dev/null
+++ b/src/views/OperationSmsAdminView.vue
@@ -0,0 +1,386 @@
+
+
+
+
+
+
+
diff --git a/src/views/QiniuUploadAdminView.vue b/src/views/QiniuUploadAdminView.vue
new file mode 100644
index 0000000..97cf37c
--- /dev/null
+++ b/src/views/QiniuUploadAdminView.vue
@@ -0,0 +1,193 @@
+
+
+
+
+
+
+
+
+
+
+ 上传文件
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/TencentUploadAdminView.vue b/src/views/TencentUploadAdminView.vue
new file mode 100644
index 0000000..adfc3c6
--- /dev/null
+++ b/src/views/TencentUploadAdminView.vue
@@ -0,0 +1,194 @@
+
+
+
+
+
+
+
+
+
+
+ 上传文件
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/activity/ActTwelveStarConfigAdminView.vue b/src/views/activity/ActTwelveStarConfigAdminView.vue
new file mode 100644
index 0000000..ad7d3c7
--- /dev/null
+++ b/src/views/activity/ActTwelveStarConfigAdminView.vue
@@ -0,0 +1,551 @@
+
+
+
+
+
+
+
+
diff --git a/src/views/activity/ActivityAwardAdminView.vue b/src/views/activity/ActivityAwardAdminView.vue
new file mode 100644
index 0000000..56e674c
--- /dev/null
+++ b/src/views/activity/ActivityAwardAdminView.vue
@@ -0,0 +1,617 @@
+
+
+
+
+
+
+
+
+ 奖品类别:
+ --全部--
+ 金币
+ 线上礼物
+ 座驾
+ 头饰
+ 实体奖品
+ 锤子
+ 贵族爵位
+ 萝卜
+ 祝福语
+ 铭牌
+
+
+ 增加
+
+ 查询
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/activity/ActivityPackAdminView.vue b/src/views/activity/ActivityPackAdminView.vue
new file mode 100644
index 0000000..c6affbf
--- /dev/null
+++ b/src/views/activity/ActivityPackAdminView.vue
@@ -0,0 +1,757 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/activity/ChargeActivityAdminView.vue b/src/views/activity/ChargeActivityAdminView.vue
new file mode 100644
index 0000000..d046e38
--- /dev/null
+++ b/src/views/activity/ChargeActivityAdminView.vue
@@ -0,0 +1,1128 @@
+
+
+
+
+
+
+
+
diff --git a/src/views/activity/FamilyPkManageAdminView.vue b/src/views/activity/FamilyPkManageAdminView.vue
new file mode 100644
index 0000000..ec6d900
--- /dev/null
+++ b/src/views/activity/FamilyPkManageAdminView.vue
@@ -0,0 +1,568 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/activity/LuckySeaItemAdminView.vue b/src/views/activity/LuckySeaItemAdminView.vue
new file mode 100644
index 0000000..228c92e
--- /dev/null
+++ b/src/views/activity/LuckySeaItemAdminView.vue
@@ -0,0 +1,549 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ID
+ 名称
+ 图片
+ 倍数
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/activity/LuckySeaPlatformAdminView.vue b/src/views/activity/LuckySeaPlatformAdminView.vue
new file mode 100644
index 0000000..c49dbaf
--- /dev/null
+++ b/src/views/activity/LuckySeaPlatformAdminView.vue
@@ -0,0 +1,166 @@
+
+
+
+
+
+
diff --git a/src/views/activity/LuckySeaRecordAdminView.vue b/src/views/activity/LuckySeaRecordAdminView.vue
new file mode 100644
index 0000000..8bd8086
--- /dev/null
+++ b/src/views/activity/LuckySeaRecordAdminView.vue
@@ -0,0 +1,285 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/activity/LuckySeaUserstatAdminView.vue b/src/views/activity/LuckySeaUserstatAdminView.vue
new file mode 100644
index 0000000..7d3341a
--- /dev/null
+++ b/src/views/activity/LuckySeaUserstatAdminView.vue
@@ -0,0 +1,131 @@
+
+
+
+
+
diff --git a/src/views/activity/OperationActAdminView.vue b/src/views/activity/OperationActAdminView.vue
new file mode 100644
index 0000000..684903d
--- /dev/null
+++ b/src/views/activity/OperationActAdminView.vue
@@ -0,0 +1,272 @@
+
+
+
+
+
+
+
+
diff --git a/src/views/activity/PageActivityView.vue b/src/views/activity/PageActivityView.vue
new file mode 100644
index 0000000..027d7b4
--- /dev/null
+++ b/src/views/activity/PageActivityView.vue
@@ -0,0 +1,264 @@
+
+
+
+
+
+
+
+
diff --git a/src/views/activity/UserDrawRecordAdminView.vue b/src/views/activity/UserDrawRecordAdminView.vue
new file mode 100644
index 0000000..6c1ba94
--- /dev/null
+++ b/src/views/activity/UserDrawRecordAdminView.vue
@@ -0,0 +1,161 @@
+
+
+
+
+
+
diff --git a/src/views/activity/WeekStarConfigAdminView.vue b/src/views/activity/WeekStarConfigAdminView.vue
new file mode 100644
index 0000000..165675b
--- /dev/null
+++ b/src/views/activity/WeekStarConfigAdminView.vue
@@ -0,0 +1,413 @@
+
+
+
+
+
+
+
+
+
+
+ 礼物
+
+
+
+
+ 魅力榜奖励
+
+
+
+
+ 豪气榜奖励
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 礼物
+
+
+
+
+ 魅力榜奖励
+
+
+
+
+ 豪气榜奖励
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/activitystatistic/DrawLotteryStatsDetailView.vue b/src/views/activitystatistic/DrawLotteryStatsDetailView.vue
new file mode 100644
index 0000000..568abe6
--- /dev/null
+++ b/src/views/activitystatistic/DrawLotteryStatsDetailView.vue
@@ -0,0 +1,216 @@
+
+
+
+
+
+
+
diff --git a/src/views/activitystatistic/DrawLotteryStatsView.vue b/src/views/activitystatistic/DrawLotteryStatsView.vue
new file mode 100644
index 0000000..d2372ef
--- /dev/null
+++ b/src/views/activitystatistic/DrawLotteryStatsView.vue
@@ -0,0 +1,212 @@
+
+
+
+
+
+
+
diff --git a/src/views/activitystatistic/LinearlyStatsDetailView.vue b/src/views/activitystatistic/LinearlyStatsDetailView.vue
new file mode 100644
index 0000000..76ea023
--- /dev/null
+++ b/src/views/activitystatistic/LinearlyStatsDetailView.vue
@@ -0,0 +1,226 @@
+
+
+
+
+
+
+
diff --git a/src/views/activitystatistic/LinearlyStatsView.vue b/src/views/activitystatistic/LinearlyStatsView.vue
new file mode 100644
index 0000000..188ea4c
--- /dev/null
+++ b/src/views/activitystatistic/LinearlyStatsView.vue
@@ -0,0 +1,212 @@
+
+
+
+
+
+
+
diff --git a/src/views/activitystatistic/SingleHeartbeatDarwView.vue b/src/views/activitystatistic/SingleHeartbeatDarwView.vue
new file mode 100644
index 0000000..e32ae9f
--- /dev/null
+++ b/src/views/activitystatistic/SingleHeartbeatDarwView.vue
@@ -0,0 +1,168 @@
+
+
+
+
+
+
diff --git a/src/views/administrator/SuperAdminOperateRecordView.vue b/src/views/administrator/SuperAdminOperateRecordView.vue
new file mode 100644
index 0000000..0a9145e
--- /dev/null
+++ b/src/views/administrator/SuperAdminOperateRecordView.vue
@@ -0,0 +1,190 @@
+
+
+
+
+
+
diff --git a/src/views/administrator/SuperAdminView.vue b/src/views/administrator/SuperAdminView.vue
new file mode 100644
index 0000000..33fd42b
--- /dev/null
+++ b/src/views/administrator/SuperAdminView.vue
@@ -0,0 +1,207 @@
+
+
+
+
+
+
diff --git a/src/views/anchor/AnchorAdminView.vue b/src/views/anchor/AnchorAdminView.vue
new file mode 100644
index 0000000..b4d787a
--- /dev/null
+++ b/src/views/anchor/AnchorAdminView.vue
@@ -0,0 +1,252 @@
+
+
+
+
+
+
+
+
diff --git a/src/views/anchor/AnchorBillCheckView.vue b/src/views/anchor/AnchorBillCheckView.vue
new file mode 100644
index 0000000..007324f
--- /dev/null
+++ b/src/views/anchor/AnchorBillCheckView.vue
@@ -0,0 +1,241 @@
+
+
+
+
+
diff --git a/src/views/anchor/AnchorBillUploadView.vue b/src/views/anchor/AnchorBillUploadView.vue
new file mode 100644
index 0000000..35ab318
--- /dev/null
+++ b/src/views/anchor/AnchorBillUploadView.vue
@@ -0,0 +1,261 @@
+
+
+
+
+
+
+
+
+
+
+ 上传流水附件
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/anchor/AnchorFansMpAudioView.vue b/src/views/anchor/AnchorFansMpAudioView.vue
new file mode 100644
index 0000000..03bbd97
--- /dev/null
+++ b/src/views/anchor/AnchorFansMpAudioView.vue
@@ -0,0 +1,292 @@
+
+
+
+
+
+
+
diff --git a/src/views/anchor/AnchorFansPrivilegeView.vue b/src/views/anchor/AnchorFansPrivilegeView.vue
new file mode 100644
index 0000000..41c8769
--- /dev/null
+++ b/src/views/anchor/AnchorFansPrivilegeView.vue
@@ -0,0 +1,470 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/anchor/AnchorFansTeamStatsView.vue b/src/views/anchor/AnchorFansTeamStatsView.vue
new file mode 100644
index 0000000..b622fae
--- /dev/null
+++ b/src/views/anchor/AnchorFansTeamStatsView.vue
@@ -0,0 +1,210 @@
+
+
+
+
+
+
+
+ 主播ID:
+
+ 查询
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/anchor/AnchorReleaseGoldView.vue b/src/views/anchor/AnchorReleaseGoldView.vue
new file mode 100644
index 0000000..d747b29
--- /dev/null
+++ b/src/views/anchor/AnchorReleaseGoldView.vue
@@ -0,0 +1,270 @@
+
+
+
+
+
+
+
diff --git a/src/views/anchor/LevelStatisticsView.vue b/src/views/anchor/LevelStatisticsView.vue
new file mode 100644
index 0000000..d5cfaf3
--- /dev/null
+++ b/src/views/anchor/LevelStatisticsView.vue
@@ -0,0 +1,185 @@
+
+
+
+
+
diff --git a/src/views/app/AppBottomBarAdminView.vue b/src/views/app/AppBottomBarAdminView.vue
new file mode 100644
index 0000000..88b8f14
--- /dev/null
+++ b/src/views/app/AppBottomBarAdminView.vue
@@ -0,0 +1,973 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/app/AppUpdateView.vue b/src/views/app/AppUpdateView.vue
new file mode 100644
index 0000000..dea7fa1
--- /dev/null
+++ b/src/views/app/AppUpdateView.vue
@@ -0,0 +1,432 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/auditaudio/AuditAudioView.vue b/src/views/auditaudio/AuditAudioView.vue
new file mode 100644
index 0000000..55ce1da
--- /dev/null
+++ b/src/views/auditaudio/AuditAudioView.vue
@@ -0,0 +1,540 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/auditaudio/MonitorRuleView.vue b/src/views/auditaudio/MonitorRuleView.vue
new file mode 100644
index 0000000..e2dc7f5
--- /dev/null
+++ b/src/views/auditaudio/MonitorRuleView.vue
@@ -0,0 +1,150 @@
+
+
+
+
+
+
diff --git a/src/views/background/BackgroundView.vue b/src/views/background/BackgroundView.vue
new file mode 100644
index 0000000..84d2623
--- /dev/null
+++ b/src/views/background/BackgroundView.vue
@@ -0,0 +1,398 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/views/blinddate/BlindDateCapAdminView.vue b/src/views/blinddate/BlindDateCapAdminView.vue
new file mode 100644
index 0000000..32ecc26
--- /dev/null
+++ b/src/views/blinddate/BlindDateCapAdminView.vue
@@ -0,0 +1,394 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/views/blinddate/BlindDateJoinhandAdminView.vue b/src/views/blinddate/BlindDateJoinhandAdminView.vue
new file mode 100644
index 0000000..65f6e79
--- /dev/null
+++ b/src/views/blinddate/BlindDateJoinhandAdminView.vue
@@ -0,0 +1,501 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 飘屏开关* :
+
+ 关闭
+ 开启
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 飘屏开关* :
+
+ 关闭
+ 开启
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/callbattle/ActCallBattleItemAdminView.vue b/src/views/callbattle/ActCallBattleItemAdminView.vue
new file mode 100644
index 0000000..43bfb7d
--- /dev/null
+++ b/src/views/callbattle/ActCallBattleItemAdminView.vue
@@ -0,0 +1,642 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ID
+ 名称
+ 图片
+ 倍数
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/callbattle/ActCallBattlePlatformAdminView.vue b/src/views/callbattle/ActCallBattlePlatformAdminView.vue
new file mode 100644
index 0000000..8b71f19
--- /dev/null
+++ b/src/views/callbattle/ActCallBattlePlatformAdminView.vue
@@ -0,0 +1,158 @@
+
+
+
+
+
+
diff --git a/src/views/callbattle/ActCallBattleRecordAdminView.vue b/src/views/callbattle/ActCallBattleRecordAdminView.vue
new file mode 100644
index 0000000..86f1544
--- /dev/null
+++ b/src/views/callbattle/ActCallBattleRecordAdminView.vue
@@ -0,0 +1,286 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/callbattle/ActCallBattleUserstatAdminView.vue b/src/views/callbattle/ActCallBattleUserstatAdminView.vue
new file mode 100644
index 0000000..624f5a0
--- /dev/null
+++ b/src/views/callbattle/ActCallBattleUserstatAdminView.vue
@@ -0,0 +1,131 @@
+
+
+
+
+
diff --git a/src/views/car/CarAdminView.vue b/src/views/car/CarAdminView.vue
new file mode 100644
index 0000000..3e6e09d
--- /dev/null
+++ b/src/views/car/CarAdminView.vue
@@ -0,0 +1,284 @@
+
+
+
+
+
+
+
+
diff --git a/src/views/car/CarGoodsAdminView.vue b/src/views/car/CarGoodsAdminView.vue
new file mode 100644
index 0000000..d2e7be4
--- /dev/null
+++ b/src/views/car/CarGoodsAdminView.vue
@@ -0,0 +1,989 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/car/CarRecordView.vue b/src/views/car/CarRecordView.vue
new file mode 100644
index 0000000..473486e
--- /dev/null
+++ b/src/views/car/CarRecordView.vue
@@ -0,0 +1,133 @@
+
+
+
+
+
diff --git a/src/views/car/CarStatisticsView.vue b/src/views/car/CarStatisticsView.vue
new file mode 100644
index 0000000..43a0036
--- /dev/null
+++ b/src/views/car/CarStatisticsView.vue
@@ -0,0 +1,125 @@
+
+
+
+
+
diff --git a/src/views/channel/ChannelContentPartitionAdminView.vue b/src/views/channel/ChannelContentPartitionAdminView.vue
new file mode 100644
index 0000000..0416400
--- /dev/null
+++ b/src/views/channel/ChannelContentPartitionAdminView.vue
@@ -0,0 +1,471 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/charge/FirstChargeRewardConfigView.vue b/src/views/charge/FirstChargeRewardConfigView.vue
new file mode 100644
index 0000000..8fbbcb8
--- /dev/null
+++ b/src/views/charge/FirstChargeRewardConfigView.vue
@@ -0,0 +1,471 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/charge/FirstChargeRewardRecordView.vue b/src/views/charge/FirstChargeRewardRecordView.vue
new file mode 100644
index 0000000..7a52423
--- /dev/null
+++ b/src/views/charge/FirstChargeRewardRecordView.vue
@@ -0,0 +1,253 @@
+
+
+
+
+
+
+
diff --git a/src/views/charge/LimitFirstChargeRewardRecordView.vue b/src/views/charge/LimitFirstChargeRewardRecordView.vue
new file mode 100644
index 0000000..de3a80b
--- /dev/null
+++ b/src/views/charge/LimitFirstChargeRewardRecordView.vue
@@ -0,0 +1,217 @@
+
+
+
+
+
+
+
diff --git a/src/views/charge/RedeemcodeAdminView.vue b/src/views/charge/RedeemcodeAdminView.vue
new file mode 100644
index 0000000..80748d8
--- /dev/null
+++ b/src/views/charge/RedeemcodeAdminView.vue
@@ -0,0 +1,195 @@
+
+
+
+
+
diff --git a/src/views/chatbubble/ChatbubbleManageView.vue b/src/views/chatbubble/ChatbubbleManageView.vue
new file mode 100644
index 0000000..d90f2de
--- /dev/null
+++ b/src/views/chatbubble/ChatbubbleManageView.vue
@@ -0,0 +1,468 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/chatbubble/ChatbubbleRecordView.vue b/src/views/chatbubble/ChatbubbleRecordView.vue
new file mode 100644
index 0000000..d43b18f
--- /dev/null
+++ b/src/views/chatbubble/ChatbubbleRecordView.vue
@@ -0,0 +1,245 @@
+
+
+
+
+
+
diff --git a/src/views/cleanup/CleanupAdminView.vue b/src/views/cleanup/CleanupAdminView.vue
new file mode 100644
index 0000000..70115f2
--- /dev/null
+++ b/src/views/cleanup/CleanupAdminView.vue
@@ -0,0 +1,62 @@
+
+
+
+
+ 清除游乐园数据
+
+
+
+
+
+ 暴走玩法下架通知
+
+
+
+
+
+
+
diff --git a/src/views/discovery/DiscoveryAdminView.vue b/src/views/discovery/DiscoveryAdminView.vue
new file mode 100644
index 0000000..fe7497e
--- /dev/null
+++ b/src/views/discovery/DiscoveryAdminView.vue
@@ -0,0 +1,751 @@
+
+
+
+
+
+
+
+
+
+ 名称:
+
+ 上架:
+ --全部--
+ 上架
+ 下架
+
+ app:
+
+ --全部--
+
+
+ 跳转类型:
+ --全部--
+ 跳转链接
+ 跳转房间
+ 跳转游戏
+ 跳转App页面
+
+
+
+ 搜索
+
+
+ 增加
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 跳转游戏:
+
+
+
+
+
+
+
+
+
+
+
+
+ app:
+
+ 请选择...
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/dressShop/DressShopAdminView.vue b/src/views/dressShop/DressShopAdminView.vue
new file mode 100644
index 0000000..26c3757
--- /dev/null
+++ b/src/views/dressShop/DressShopAdminView.vue
@@ -0,0 +1,380 @@
+
+
+
+
+
+
+
diff --git a/src/views/face/FaceJsonAdminView.vue b/src/views/face/FaceJsonAdminView.vue
new file mode 100644
index 0000000..b20f5a9
--- /dev/null
+++ b/src/views/face/FaceJsonAdminView.vue
@@ -0,0 +1,870 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/family/FamilyAdminView.vue b/src/views/family/FamilyAdminView.vue
new file mode 100644
index 0000000..78bb35b
--- /dev/null
+++ b/src/views/family/FamilyAdminView.vue
@@ -0,0 +1,757 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/family/FamilyMemberAdminView.vue b/src/views/family/FamilyMemberAdminView.vue
new file mode 100644
index 0000000..7469b89
--- /dev/null
+++ b/src/views/family/FamilyMemberAdminView.vue
@@ -0,0 +1,202 @@
+
+
+
+
+
+
diff --git a/src/views/family/FamilyMoneyAdminView.vue b/src/views/family/FamilyMoneyAdminView.vue
new file mode 100644
index 0000000..7ef8d6e
--- /dev/null
+++ b/src/views/family/FamilyMoneyAdminView.vue
@@ -0,0 +1,469 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/family/FamilyStatisticsView.vue b/src/views/family/FamilyStatisticsView.vue
new file mode 100644
index 0000000..cd4399f
--- /dev/null
+++ b/src/views/family/FamilyStatisticsView.vue
@@ -0,0 +1,144 @@
+
+
+
+
+
diff --git a/src/views/finance/FinanceStatisticsView.vue b/src/views/finance/FinanceStatisticsView.vue
new file mode 100644
index 0000000..4b0f4d4
--- /dev/null
+++ b/src/views/finance/FinanceStatisticsView.vue
@@ -0,0 +1,186 @@
+
+
+
+
+
diff --git a/src/views/firstpage/FirstPageActivityBannerView.vue b/src/views/firstpage/FirstPageActivityBannerView.vue
new file mode 100644
index 0000000..1c47f6a
--- /dev/null
+++ b/src/views/firstpage/FirstPageActivityBannerView.vue
@@ -0,0 +1,980 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 激活设置:
+
+ 激活
+ 不激活
+
+
+
+
+
+
+
+
+
+
+ 展示平台:
+
+ 全平台展示
+ 只展示IOS
+ 只展示安卓
+ 都不展示
+
+
+
+
+
+
+
+ h5页面是否全屏展示:
+
+ 全屏
+ 非全屏
+
+
+
+ 活动入口展示规则:
+
+ 始终展示
+ 达到限制等级展示
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 激活设置:
+
+ 激活
+ 不激活
+
+
+
+
+
+
+
+
+
+
+
+ 展示平台:
+
+ 全平台展示
+ 只展示IOS
+ 只展示安卓
+ 都不展示
+
+
+
+
+
+
+ h5页面是否全屏展示:
+
+ 全屏
+ 非全屏
+
+
+
+ 活动入口展示规则:
+
+ 始终展示
+ 达到限制等级展示
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/firstpage/FirstPageBannerView.vue b/src/views/firstpage/FirstPageBannerView.vue
new file mode 100644
index 0000000..428ccf7
--- /dev/null
+++ b/src/views/firstpage/FirstPageBannerView.vue
@@ -0,0 +1,998 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 激活设置:
+
+ 激活
+ 不激活
+
+
+
+
+
+
+
+
+
+
+ 展示平台:
+
+ 全平台展示
+ 只展示IOS
+ 只展示安卓
+ 都不展示
+
+
+
+
+
+
+
+ h5页面是否全屏展示:
+
+ 全屏
+ 非全屏
+
+
+
+ 活动入口展示规则:
+
+ 始终展示
+ 达到限制等级展示
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 激活设置:
+
+ 激活
+ 不激活
+
+
+
+
+
+
+
+
+
+
+
+ 展示平台:
+
+ 全平台展示
+ 只展示IOS
+ 只展示安卓
+ 都不展示
+
+
+
+
+
+
+ h5页面是否全屏展示:
+
+ 全屏
+ 非全屏
+
+
+
+ 活动入口展示规则:
+
+ 始终展示
+ 达到限制等级展示
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/firstpage/FirstPageOptView.vue b/src/views/firstpage/FirstPageOptView.vue
new file mode 100644
index 0000000..7228b1f
--- /dev/null
+++ b/src/views/firstpage/FirstPageOptView.vue
@@ -0,0 +1,359 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 状态:
+
+ 展示
+ 隐藏
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/firstpage/FirstPageTabRoomView.vue b/src/views/firstpage/FirstPageTabRoomView.vue
new file mode 100644
index 0000000..2b4b835
--- /dev/null
+++ b/src/views/firstpage/FirstPageTabRoomView.vue
@@ -0,0 +1,570 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ tab名称:
+
+
+
+ 用户ID:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/firstpage/FirstPageTabView.vue b/src/views/firstpage/FirstPageTabView.vue
new file mode 100644
index 0000000..94e5f13
--- /dev/null
+++ b/src/views/firstpage/FirstPageTabView.vue
@@ -0,0 +1,490 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/firstpage/RecommendResourceAdminView.vue b/src/views/firstpage/RecommendResourceAdminView.vue
new file mode 100644
index 0000000..db21f15
--- /dev/null
+++ b/src/views/firstpage/RecommendResourceAdminView.vue
@@ -0,0 +1,795 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/firstpage/RecommendRoomAdminView.vue b/src/views/firstpage/RecommendRoomAdminView.vue
new file mode 100644
index 0000000..4d6c477
--- /dev/null
+++ b/src/views/firstpage/RecommendRoomAdminView.vue
@@ -0,0 +1,323 @@
+
+
+
+
+
+
+
+
diff --git a/src/views/flowteam/FlowTeamGroupManageView.vue b/src/views/flowteam/FlowTeamGroupManageView.vue
new file mode 100644
index 0000000..4087b0c
--- /dev/null
+++ b/src/views/flowteam/FlowTeamGroupManageView.vue
@@ -0,0 +1,469 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/flowteam/FlowTeamInvitecodeManageView.vue b/src/views/flowteam/FlowTeamInvitecodeManageView.vue
new file mode 100644
index 0000000..a390d28
--- /dev/null
+++ b/src/views/flowteam/FlowTeamInvitecodeManageView.vue
@@ -0,0 +1,392 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/flowteam/FlowTeamMemberAdminView.vue b/src/views/flowteam/FlowTeamMemberAdminView.vue
new file mode 100644
index 0000000..03ba508
--- /dev/null
+++ b/src/views/flowteam/FlowTeamMemberAdminView.vue
@@ -0,0 +1,461 @@
+
+
+
+
+
+
+
diff --git a/src/views/flowteam/FlowTeamSettlementView.vue b/src/views/flowteam/FlowTeamSettlementView.vue
new file mode 100644
index 0000000..aea5518
--- /dev/null
+++ b/src/views/flowteam/FlowTeamSettlementView.vue
@@ -0,0 +1,337 @@
+
+
+
+
+
+
+
+
diff --git a/src/views/flowteam/FlowTeamStatisticView.vue b/src/views/flowteam/FlowTeamStatisticView.vue
new file mode 100644
index 0000000..b50c4f6
--- /dev/null
+++ b/src/views/flowteam/FlowTeamStatisticView.vue
@@ -0,0 +1,765 @@
+
+
+
+
+
+
+
+
+ 分组统计展示每个小组的整体数据,按不同的小组分别显示,查询前需要:
+ 1)输入查询的小组:非必填,不填写展示全部小组
+ 2)选择被邀请用户的新增时间范围:指的是被邀请的人新增的时间段,非必填,不填写展示截止到目前的全部数据
+ 3)选择被邀请用户的充值时间范围:指的是被邀请的人的充值行为发生的时间段,非必填,不填写展示截止到目前的全部数据
+ 表格按照选取的被邀请用户新增时间展示累计新增用户数
+ 表头说明:
+ --新增用户数:该小组在所设置的被邀请用户新增时间范围内所引入的新用户数量
+ --新增充值人数:该小组满足新增时间筛选的新增用户,在所设置的充值时间范围内发生首次充值的人数
+ --付费转化:付费转化=表格显示的新增充值人数/表格显示的新增用户数
+ --充值次数:该小组满足新增时间筛选的新增用户,在所设置的充值时间范围内发生的累计充值次数
+ --充值金额:该小组满足新增时间筛选的新增用户,在所设置的充值时间范围内发生的累计充值金额
+ --送礼金额:该小组满足新增时间筛选的新增用户,截止到目前时刻的送礼金额
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/flowteam/RefillInviteCodeView.vue b/src/views/flowteam/RefillInviteCodeView.vue
new file mode 100644
index 0000000..3a7f356
--- /dev/null
+++ b/src/views/flowteam/RefillInviteCodeView.vue
@@ -0,0 +1,272 @@
+
+
+
+
+
+
+
+
diff --git a/src/views/game/GameAccessUrlView.vue b/src/views/game/GameAccessUrlView.vue
new file mode 100644
index 0000000..b9de158
--- /dev/null
+++ b/src/views/game/GameAccessUrlView.vue
@@ -0,0 +1,328 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/game/GameActivityRankView.vue b/src/views/game/GameActivityRankView.vue
new file mode 100644
index 0000000..f4fed12
--- /dev/null
+++ b/src/views/game/GameActivityRankView.vue
@@ -0,0 +1,762 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 统计类型:
+
+ week
+ delta
+
+
+
+
+ 胜利类型:
+
+ 连胜
+ 累计获胜
+ 连胜和累积获胜
+
+
+
+ 榜单入口是否展示:
+
+ 否
+ 是
+
+
+
+ 状态:
+
+ 无效
+ 有效
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/game/GameChannelView.vue b/src/views/game/GameChannelView.vue
new file mode 100644
index 0000000..8219165
--- /dev/null
+++ b/src/views/game/GameChannelView.vue
@@ -0,0 +1,356 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/game/GameFaceView.vue b/src/views/game/GameFaceView.vue
new file mode 100644
index 0000000..b12ca3f
--- /dev/null
+++ b/src/views/game/GameFaceView.vue
@@ -0,0 +1,385 @@
+
+
+
+
+
+
+
+
+
+
+ 增加
+
+ 表情类型:
+ --全部--
+ 游戏
+
+ 查询
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 类型:
+
+ 游戏
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/game/GameInfoView.vue b/src/views/game/GameInfoView.vue
new file mode 100644
index 0000000..6df168b
--- /dev/null
+++ b/src/views/game/GameInfoView.vue
@@ -0,0 +1,886 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/gamemanage/GameBillRecordAdminView.vue b/src/views/gamemanage/GameBillRecordAdminView.vue
new file mode 100644
index 0000000..92b67c1
--- /dev/null
+++ b/src/views/gamemanage/GameBillRecordAdminView.vue
@@ -0,0 +1,202 @@
+
+
+
+
+
+
diff --git a/src/views/gamemanage/GameManageBannerView.vue b/src/views/gamemanage/GameManageBannerView.vue
new file mode 100644
index 0000000..0b24fda
--- /dev/null
+++ b/src/views/gamemanage/GameManageBannerView.vue
@@ -0,0 +1,993 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 激活设置:
+
+ 激活
+ 不激活
+
+
+
+
+
+
+
+
+
+
+ 展示平台:
+
+ 全平台展示
+ 只展示IOS
+ 只展示安卓
+ 都不展示
+
+
+
+
+
+
+
+ h5页面是否全屏展示:
+
+ 全屏
+ 非全屏
+
+
+
+ 活动入口展示规则:
+
+ 始终展示
+ 达到限制等级展示
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 激活设置:
+
+ 激活
+ 不激活
+
+
+
+
+
+
+
+
+
+
+
+ 展示平台:
+
+ 全平台展示
+ 只展示IOS
+ 只展示安卓
+ 都不展示
+
+
+
+
+
+
+ h5页面是否全屏展示:
+
+ 全屏
+ 非全屏
+
+
+
+ 活动入口展示规则:
+
+ 始终展示
+ 达到限制等级展示
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/gamemanage/GameManageChannelTicketView.vue b/src/views/gamemanage/GameManageChannelTicketView.vue
new file mode 100644
index 0000000..7e6449e
--- /dev/null
+++ b/src/views/gamemanage/GameManageChannelTicketView.vue
@@ -0,0 +1,525 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/gamemanage/GameManageGiveTicketView.vue b/src/views/gamemanage/GameManageGiveTicketView.vue
new file mode 100644
index 0000000..80a77b7
--- /dev/null
+++ b/src/views/gamemanage/GameManageGiveTicketView.vue
@@ -0,0 +1,99 @@
+
+
+
+
+
diff --git a/src/views/gamemanage/GameManageGroupAdminView.vue b/src/views/gamemanage/GameManageGroupAdminView.vue
new file mode 100644
index 0000000..8f8911b
--- /dev/null
+++ b/src/views/gamemanage/GameManageGroupAdminView.vue
@@ -0,0 +1,376 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/views/gamemanage/GameManageInfoAdminView.vue b/src/views/gamemanage/GameManageInfoAdminView.vue
new file mode 100644
index 0000000..66ccdf4
--- /dev/null
+++ b/src/views/gamemanage/GameManageInfoAdminView.vue
@@ -0,0 +1,1191 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/gamemanage/GameManageQuickGameInfoAdminView.vue b/src/views/gamemanage/GameManageQuickGameInfoAdminView.vue
new file mode 100644
index 0000000..1148da6
--- /dev/null
+++ b/src/views/gamemanage/GameManageQuickGameInfoAdminView.vue
@@ -0,0 +1,1288 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/gamemanage/GameManageTicketAccessView.vue b/src/views/gamemanage/GameManageTicketAccessView.vue
new file mode 100644
index 0000000..177a827
--- /dev/null
+++ b/src/views/gamemanage/GameManageTicketAccessView.vue
@@ -0,0 +1,298 @@
+
+
+
+
+
+
+
diff --git a/src/views/gamemanage/GameManageTicketHistoryAdminView.vue b/src/views/gamemanage/GameManageTicketHistoryAdminView.vue
new file mode 100644
index 0000000..7665d53
--- /dev/null
+++ b/src/views/gamemanage/GameManageTicketHistoryAdminView.vue
@@ -0,0 +1,221 @@
+
+
+
+
+
+
diff --git a/src/views/gamemanage/GameManageWithdrawAdminView.vue b/src/views/gamemanage/GameManageWithdrawAdminView.vue
new file mode 100644
index 0000000..9cc456a
--- /dev/null
+++ b/src/views/gamemanage/GameManageWithdrawAdminView.vue
@@ -0,0 +1,565 @@
+
+
+
+
+
+
+
+
diff --git a/src/views/gamemanage/TicketManageView.vue b/src/views/gamemanage/TicketManageView.vue
new file mode 100644
index 0000000..3479044
--- /dev/null
+++ b/src/views/gamemanage/TicketManageView.vue
@@ -0,0 +1,369 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/gamepartner/GamePartnerOrderDetailView.vue b/src/views/gamepartner/GamePartnerOrderDetailView.vue
new file mode 100644
index 0000000..0cd9509
--- /dev/null
+++ b/src/views/gamepartner/GamePartnerOrderDetailView.vue
@@ -0,0 +1,230 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/gamepartner/GamePartnerOrderView.vue b/src/views/gamepartner/GamePartnerOrderView.vue
new file mode 100644
index 0000000..acbb3f4
--- /dev/null
+++ b/src/views/gamepartner/GamePartnerOrderView.vue
@@ -0,0 +1,175 @@
+
+
+
+
+
+
+
diff --git a/src/views/gamepartner/UserGamePartnerInfoAdminView.vue b/src/views/gamepartner/UserGamePartnerInfoAdminView.vue
new file mode 100644
index 0000000..9605af0
--- /dev/null
+++ b/src/views/gamepartner/UserGamePartnerInfoAdminView.vue
@@ -0,0 +1,450 @@
+
+
+
+
+
+
+
diff --git a/src/views/giftwall/GiftAchievementAdminView.vue b/src/views/giftwall/GiftAchievementAdminView.vue
new file mode 100644
index 0000000..b874995
--- /dev/null
+++ b/src/views/giftwall/GiftAchievementAdminView.vue
@@ -0,0 +1,590 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/giftwall/GiftAchievementStatisticsAdminView.vue b/src/views/giftwall/GiftAchievementStatisticsAdminView.vue
new file mode 100644
index 0000000..8cf4efe
--- /dev/null
+++ b/src/views/giftwall/GiftAchievementStatisticsAdminView.vue
@@ -0,0 +1,205 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/views/giftwall/GiftAchievementTypeAdminView.vue b/src/views/giftwall/GiftAchievementTypeAdminView.vue
new file mode 100644
index 0000000..1684261
--- /dev/null
+++ b/src/views/giftwall/GiftAchievementTypeAdminView.vue
@@ -0,0 +1,441 @@
+
+
+
+
+
+
+
+
+ 分类名称:
+ 状态:
+ 全部
+ 展示
+ 隐藏
+
+
+
+ 搜索
+
+
+ 增加
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/guild/GuildRoomAdminView.vue b/src/views/guild/GuildRoomAdminView.vue
new file mode 100644
index 0000000..a208145
--- /dev/null
+++ b/src/views/guild/GuildRoomAdminView.vue
@@ -0,0 +1,502 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/hall/ClanAdminView.vue b/src/views/hall/ClanAdminView.vue
new file mode 100644
index 0000000..06a3b14
--- /dev/null
+++ b/src/views/hall/ClanAdminView.vue
@@ -0,0 +1,692 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/hall/ClanFlowStatisAdminView.vue b/src/views/hall/ClanFlowStatisAdminView.vue
new file mode 100644
index 0000000..a2d631a
--- /dev/null
+++ b/src/views/hall/ClanFlowStatisAdminView.vue
@@ -0,0 +1,332 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/hall/ClanLevelSettingView.vue b/src/views/hall/ClanLevelSettingView.vue
new file mode 100644
index 0000000..3b9960a
--- /dev/null
+++ b/src/views/hall/ClanLevelSettingView.vue
@@ -0,0 +1,396 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/hall/HallAdminView.vue b/src/views/hall/HallAdminView.vue
new file mode 100644
index 0000000..100353c
--- /dev/null
+++ b/src/views/hall/HallAdminView.vue
@@ -0,0 +1,134 @@
+
+
+
+
+
diff --git a/src/views/hall/HallMemberView.vue b/src/views/hall/HallMemberView.vue
new file mode 100644
index 0000000..658f5a7
--- /dev/null
+++ b/src/views/hall/HallMemberView.vue
@@ -0,0 +1,333 @@
+
+
+
+
+
+
+
diff --git a/src/views/headwear/HeadwearAdminView.vue b/src/views/headwear/HeadwearAdminView.vue
new file mode 100644
index 0000000..c7e8692
--- /dev/null
+++ b/src/views/headwear/HeadwearAdminView.vue
@@ -0,0 +1,859 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/headwear/HeadwearRecordView.vue b/src/views/headwear/HeadwearRecordView.vue
new file mode 100644
index 0000000..c14787f
--- /dev/null
+++ b/src/views/headwear/HeadwearRecordView.vue
@@ -0,0 +1,182 @@
+
+
+
+
+
diff --git a/src/views/headwear/HeadwearStatisticsView.vue b/src/views/headwear/HeadwearStatisticsView.vue
new file mode 100644
index 0000000..577ca60
--- /dev/null
+++ b/src/views/headwear/HeadwearStatisticsView.vue
@@ -0,0 +1,128 @@
+
+
+
+
+
diff --git a/src/views/home/BannerAdminView.vue b/src/views/home/BannerAdminView.vue
new file mode 100644
index 0000000..76e02a1
--- /dev/null
+++ b/src/views/home/BannerAdminView.vue
@@ -0,0 +1,967 @@
+
+
+
+
+
+
+
+
+ 跳转类型:
+ --全部--
+
+ 聊天室
+ H5页面
+ tab页面
+ 跳转App页面
+
+ 状态:
+ --全部--
+ 激活启用中
+ 未激活
+
+ app:
+ --全部--
+
+ banner位置:
+ --全部--
+ 首页
+ 家族广场
+ 首页游戏banner
+ 声控福利房
+ 房间分类列表
+ 发现页
+ 新版首页Tab
+ 话题首页
+
+
+ 查询
+
+
+ 增加
+
+
+
+ 删除选中
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 激活设置:
+
+ 激活
+ 不激活
+
+
+
+ app:
+
+ 66
+ 侧耳
+ 兔兔星球
+ 马甲
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 激活设置:
+
+ 激活
+ 不激活
+
+
+
+ app:
+
+ 请选择
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/home/ChatpickAdminView.vue b/src/views/home/ChatpickAdminView.vue
new file mode 100644
index 0000000..f5b7a7e
--- /dev/null
+++ b/src/views/home/ChatpickAdminView.vue
@@ -0,0 +1,209 @@
+
+
+
+
+
+
+
diff --git a/src/views/home/PanelAdminView.vue b/src/views/home/PanelAdminView.vue
new file mode 100644
index 0000000..eab2e0e
--- /dev/null
+++ b/src/views/home/PanelAdminView.vue
@@ -0,0 +1,356 @@
+
+
+
+
+
+
+
+
+
+
+
+ 增加
+
+
+
+ 批量删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 跳转类型
+
+ App页面
+ 聊天室
+ H5页面
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/home/RecommandAdminView.vue b/src/views/home/RecommandAdminView.vue
new file mode 100644
index 0000000..597ca3c
--- /dev/null
+++ b/src/views/home/RecommandAdminView.vue
@@ -0,0 +1,343 @@
+
+
+
+
+
+
+
+
diff --git a/src/views/home/RisingStarAdminView.vue b/src/views/home/RisingStarAdminView.vue
new file mode 100644
index 0000000..e7658a1
--- /dev/null
+++ b/src/views/home/RisingStarAdminView.vue
@@ -0,0 +1,647 @@
+
+
+
+
+
+
+
+
+ 音萌号:
+ --全部--
+
+ 聊天室
+ H5页面
+
+ 状态:
+ --全部--
+ 激活启用中
+ 未激活
+
+ banner位置:
+ --全部--
+ 首页
+ 家族广场
+
+ 查询
+
+
+ 增加
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 激活设置:
+
+ 激活
+ 不激活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 激活设置:
+
+ 激活
+ 不激活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/home/index.vue b/src/views/home/index.vue
new file mode 100644
index 0000000..250c47c
--- /dev/null
+++ b/src/views/home/index.vue
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/infocard/InfocardManageView.vue b/src/views/infocard/InfocardManageView.vue
new file mode 100644
index 0000000..5b56ad4
--- /dev/null
+++ b/src/views/infocard/InfocardManageView.vue
@@ -0,0 +1,450 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/infocard/InfocardRecordView.vue b/src/views/infocard/InfocardRecordView.vue
new file mode 100644
index 0000000..d18c0c7
--- /dev/null
+++ b/src/views/infocard/InfocardRecordView.vue
@@ -0,0 +1,245 @@
+
+
+
+
+
+
diff --git a/src/views/ktv/MusicErrorAdminView.vue b/src/views/ktv/MusicErrorAdminView.vue
new file mode 100644
index 0000000..0ba7b9a
--- /dev/null
+++ b/src/views/ktv/MusicErrorAdminView.vue
@@ -0,0 +1,207 @@
+
+
+
+
+
diff --git a/src/views/ktv/MusicLibraryAdminView.vue b/src/views/ktv/MusicLibraryAdminView.vue
new file mode 100644
index 0000000..abaecf3
--- /dev/null
+++ b/src/views/ktv/MusicLibraryAdminView.vue
@@ -0,0 +1,432 @@
+
+
+
+
+
+
+
diff --git a/src/views/linearlypool/PlatformPrizeDataAdminDayView.vue b/src/views/linearlypool/PlatformPrizeDataAdminDayView.vue
new file mode 100644
index 0000000..9eb1922
--- /dev/null
+++ b/src/views/linearlypool/PlatformPrizeDataAdminDayView.vue
@@ -0,0 +1,271 @@
+
+
+
+
+
+
diff --git a/src/views/linearlypool/PlatformPrizeDataAdminView.vue b/src/views/linearlypool/PlatformPrizeDataAdminView.vue
new file mode 100644
index 0000000..c7fede1
--- /dev/null
+++ b/src/views/linearlypool/PlatformPrizeDataAdminView.vue
@@ -0,0 +1,271 @@
+
+
+
+
+
+
diff --git a/src/views/linearlypool/PoolItemAdminView.vue b/src/views/linearlypool/PoolItemAdminView.vue
new file mode 100644
index 0000000..37f011f
--- /dev/null
+++ b/src/views/linearlypool/PoolItemAdminView.vue
@@ -0,0 +1,868 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 礼物个数:
+
+
+
+ 礼物价值:
+
+
+
+
+
+ 名称
+ 平台价值
+ 个数
+ 总价值
+ 核算概率
+ 展示概率
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 礼物个数:
+
+
+
+ 礼物价值:
+
+
+
+
+
+ 名称
+ 平台价值
+ 个数
+ 总价值
+ 核算概率
+ 展示概率
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
期望值 变为
+
当前奖池线:
+
生效奖池线:
+
确认发布?
+
+
+
+
+
+
+
+
+
diff --git a/src/views/linearlypool/PoolItemShowratioAdminView.vue b/src/views/linearlypool/PoolItemShowratioAdminView.vue
new file mode 100644
index 0000000..017036a
--- /dev/null
+++ b/src/views/linearlypool/PoolItemShowratioAdminView.vue
@@ -0,0 +1,482 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 名称
+ 平台价值
+ 个数
+ 总价值
+ 奖池类型
+ 核算概率
+ 展示概率
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/linearlypool/PrizeDrawRecordAdminView.vue b/src/views/linearlypool/PrizeDrawRecordAdminView.vue
new file mode 100644
index 0000000..aba0f6e
--- /dev/null
+++ b/src/views/linearlypool/PrizeDrawRecordAdminView.vue
@@ -0,0 +1,141 @@
+
+
+
+
+
+
diff --git a/src/views/linearlypool/UserPrizeDataAdminView.vue b/src/views/linearlypool/UserPrizeDataAdminView.vue
new file mode 100644
index 0000000..0ffdc91
--- /dev/null
+++ b/src/views/linearlypool/UserPrizeDataAdminView.vue
@@ -0,0 +1,155 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/views/live101/ApplyAdminView.vue b/src/views/live101/ApplyAdminView.vue
new file mode 100644
index 0000000..e7e4eb2
--- /dev/null
+++ b/src/views/live101/ApplyAdminView.vue
@@ -0,0 +1,452 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/live101/IdentityAdminView.vue b/src/views/live101/IdentityAdminView.vue
new file mode 100644
index 0000000..cfead64
--- /dev/null
+++ b/src/views/live101/IdentityAdminView.vue
@@ -0,0 +1,438 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/live101/OptRecordAdminView.vue b/src/views/live101/OptRecordAdminView.vue
new file mode 100644
index 0000000..c0afd09
--- /dev/null
+++ b/src/views/live101/OptRecordAdminView.vue
@@ -0,0 +1,418 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/live101/SkillTagAdminView.vue b/src/views/live101/SkillTagAdminView.vue
new file mode 100644
index 0000000..b883315
--- /dev/null
+++ b/src/views/live101/SkillTagAdminView.vue
@@ -0,0 +1,756 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
删除当前大标签及包含的小标签,用户数据将无法恢复
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/login/index.vue b/src/views/login/index.vue
new file mode 100644
index 0000000..2263b32
--- /dev/null
+++ b/src/views/login/index.vue
@@ -0,0 +1,232 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/luckybag/LuckyBagPoolView.vue b/src/views/luckybag/LuckyBagPoolView.vue
new file mode 100644
index 0000000..8d5b7ca
--- /dev/null
+++ b/src/views/luckybag/LuckyBagPoolView.vue
@@ -0,0 +1,486 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/luckybag/LuckyBagRecordView.vue b/src/views/luckybag/LuckyBagRecordView.vue
new file mode 100644
index 0000000..822f4c4
--- /dev/null
+++ b/src/views/luckybag/LuckyBagRecordView.vue
@@ -0,0 +1,181 @@
+
+
+
+
+
diff --git a/src/views/luckybag/LuckyBagStatsView.vue b/src/views/luckybag/LuckyBagStatsView.vue
new file mode 100644
index 0000000..d23cf5a
--- /dev/null
+++ b/src/views/luckybag/LuckyBagStatsView.vue
@@ -0,0 +1,219 @@
+
+
+
+
+
+
diff --git a/src/views/match/HpjyGameManageView.vue b/src/views/match/HpjyGameManageView.vue
new file mode 100644
index 0000000..f9f7373
--- /dev/null
+++ b/src/views/match/HpjyGameManageView.vue
@@ -0,0 +1,574 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/mentor/MentorAdminView.vue b/src/views/mentor/MentorAdminView.vue
new file mode 100644
index 0000000..d9aab42
--- /dev/null
+++ b/src/views/mentor/MentorAdminView.vue
@@ -0,0 +1,101 @@
+
+
+
+
+
diff --git a/src/views/monster/MonsterAdminView.vue b/src/views/monster/MonsterAdminView.vue
new file mode 100644
index 0000000..2abcbcc
--- /dev/null
+++ b/src/views/monster/MonsterAdminView.vue
@@ -0,0 +1,393 @@
+
+
+
+
+
+
+
+
+
+
+
+ 增加
+
+
+
+ 批量删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/monster/MonsterKindAdminView.vue b/src/views/monster/MonsterKindAdminView.vue
new file mode 100644
index 0000000..1465d9f
--- /dev/null
+++ b/src/views/monster/MonsterKindAdminView.vue
@@ -0,0 +1,513 @@
+
+
+
+
+
+
+
+
+
+
+
+ 增加
+
+
+
+ 批量删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/monster/MonsterTaskAdminView.vue b/src/views/monster/MonsterTaskAdminView.vue
new file mode 100644
index 0000000..1b36b47
--- /dev/null
+++ b/src/views/monster/MonsterTaskAdminView.vue
@@ -0,0 +1,259 @@
+
+
+
+
+
+
+
diff --git a/src/views/nameplate/NameplateAuditRecordAdminView.vue b/src/views/nameplate/NameplateAuditRecordAdminView.vue
new file mode 100644
index 0000000..6e7e21e
--- /dev/null
+++ b/src/views/nameplate/NameplateAuditRecordAdminView.vue
@@ -0,0 +1,329 @@
+
+
+
+
+
+
+
diff --git a/src/views/nameplate/NameplateInfoView.vue b/src/views/nameplate/NameplateInfoView.vue
new file mode 100644
index 0000000..c2b1214
--- /dev/null
+++ b/src/views/nameplate/NameplateInfoView.vue
@@ -0,0 +1,625 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/nameplate/NameplateRecordView.vue b/src/views/nameplate/NameplateRecordView.vue
new file mode 100644
index 0000000..b890461
--- /dev/null
+++ b/src/views/nameplate/NameplateRecordView.vue
@@ -0,0 +1,220 @@
+
+
+
+
+
+
diff --git a/src/views/nameplate/NameplateStyleView.vue b/src/views/nameplate/NameplateStyleView.vue
new file mode 100644
index 0000000..07758df
--- /dev/null
+++ b/src/views/nameplate/NameplateStyleView.vue
@@ -0,0 +1,618 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/newLuckyBag/LuckyBagLinearPoolView.vue b/src/views/newLuckyBag/LuckyBagLinearPoolView.vue
new file mode 100644
index 0000000..a088894
--- /dev/null
+++ b/src/views/newLuckyBag/LuckyBagLinearPoolView.vue
@@ -0,0 +1,788 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ 礼物个数:
+
+
+
+ 礼物价值:
+
+
+
+
+
+ 名称
+ 礼物等级
+ 平台价值
+ 个数
+ 总价值
+ 核算概率
+ 展示概率
+
+
+
+
+
+
+
+ 礼物个数:
+
+
+
+ 礼物价值:
+
+
+
+
+
+ 名称
+ 礼物等级
+ 平台价值
+ 个数
+ 总价值
+ 核算概率
+ 展示概率
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
奖池长度: | 高级奖池长度: |
+ 普通奖池长度:
+
高级奖池:
+
普通奖池:
+
+
+
+
+
+
+
+
diff --git a/src/views/newLuckyBag/LuckyBagManageView.vue b/src/views/newLuckyBag/LuckyBagManageView.vue
new file mode 100644
index 0000000..9e407f7
--- /dev/null
+++ b/src/views/newLuckyBag/LuckyBagManageView.vue
@@ -0,0 +1,1423 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 新增礼物
+
+
+
+ 礼物种类:
+
+
+
+ 期望值:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 新增礼物
+
+
+
+ 礼物种类:
+
+
+
+ 期望值:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/newLuckyBag/NewLuckyBagDeviateRangeView.vue b/src/views/newLuckyBag/NewLuckyBagDeviateRangeView.vue
new file mode 100644
index 0000000..8539612
--- /dev/null
+++ b/src/views/newLuckyBag/NewLuckyBagDeviateRangeView.vue
@@ -0,0 +1,270 @@
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+
+ 新增范围
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/newLuckyBag/NewLuckyBagDeviateView.vue b/src/views/newLuckyBag/NewLuckyBagDeviateView.vue
new file mode 100644
index 0000000..8f5346a
--- /dev/null
+++ b/src/views/newLuckyBag/NewLuckyBagDeviateView.vue
@@ -0,0 +1,490 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/newLuckyBag/NewLuckyBagRecordView.vue b/src/views/newLuckyBag/NewLuckyBagRecordView.vue
new file mode 100644
index 0000000..83dbfcd
--- /dev/null
+++ b/src/views/newLuckyBag/NewLuckyBagRecordView.vue
@@ -0,0 +1,181 @@
+
+
+
+
+
diff --git a/src/views/newLuckyBag/NewLuckyBagStatsView.vue b/src/views/newLuckyBag/NewLuckyBagStatsView.vue
new file mode 100644
index 0000000..4037dc7
--- /dev/null
+++ b/src/views/newLuckyBag/NewLuckyBagStatsView.vue
@@ -0,0 +1,173 @@
+
+
+
+
+
diff --git a/src/views/newuser/NewUserInRoomGiftAdminView.vue b/src/views/newuser/NewUserInRoomGiftAdminView.vue
new file mode 100644
index 0000000..621d161
--- /dev/null
+++ b/src/views/newuser/NewUserInRoomGiftAdminView.vue
@@ -0,0 +1,414 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/newuserstart/NewUserSayHelloAdminView.vue b/src/views/newuserstart/NewUserSayHelloAdminView.vue
new file mode 100644
index 0000000..2a17340
--- /dev/null
+++ b/src/views/newuserstart/NewUserSayHelloAdminView.vue
@@ -0,0 +1,736 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/newwithdraw/UserWithdrawInfoView.vue b/src/views/newwithdraw/UserWithdrawInfoView.vue
new file mode 100644
index 0000000..1d2d9a9
--- /dev/null
+++ b/src/views/newwithdraw/UserWithdrawInfoView.vue
@@ -0,0 +1,183 @@
+
+
+
+
+
+
diff --git a/src/views/newwithdraw/WithdrawConfigView.vue b/src/views/newwithdraw/WithdrawConfigView.vue
new file mode 100644
index 0000000..7e31edc
--- /dev/null
+++ b/src/views/newwithdraw/WithdrawConfigView.vue
@@ -0,0 +1,717 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/newwithdraw/WithdrawRecordView.vue b/src/views/newwithdraw/WithdrawRecordView.vue
new file mode 100644
index 0000000..465e911
--- /dev/null
+++ b/src/views/newwithdraw/WithdrawRecordView.vue
@@ -0,0 +1,599 @@
+
+
+
+
+
+
+
+
+
+
+
+ 真实姓名:
+
+
+
+ 支付宝账号:
+
+
+
+ 银行卡账号:
+
+
+
+ 提现渠道:
+
+ 支付宝
+ 银行卡
+
+
+
+ 提现金额:
+
+
+
+
+ 消耗金币:
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/noble/NobleAdminView.vue b/src/views/noble/NobleAdminView.vue
new file mode 100644
index 0000000..bb08e0b
--- /dev/null
+++ b/src/views/noble/NobleAdminView.vue
@@ -0,0 +1,503 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/noble/NobleExperAdminView.vue b/src/views/noble/NobleExperAdminView.vue
new file mode 100644
index 0000000..7746c65
--- /dev/null
+++ b/src/views/noble/NobleExperAdminView.vue
@@ -0,0 +1,202 @@
+
+
+
+
+
+
diff --git a/src/views/noble/NoblePrivilegeAdminView.vue b/src/views/noble/NoblePrivilegeAdminView.vue
new file mode 100644
index 0000000..f0387d5
--- /dev/null
+++ b/src/views/noble/NoblePrivilegeAdminView.vue
@@ -0,0 +1,240 @@
+
+
+
+
+
+
+
+
diff --git a/src/views/noble/PrivilegeAdminView.vue b/src/views/noble/PrivilegeAdminView.vue
new file mode 100644
index 0000000..6b52b5f
--- /dev/null
+++ b/src/views/noble/PrivilegeAdminView.vue
@@ -0,0 +1,240 @@
+
+
+
+
+
+
+
+
diff --git a/src/views/noble/ResourceAdminView.vue b/src/views/noble/ResourceAdminView.vue
new file mode 100644
index 0000000..204f4e2
--- /dev/null
+++ b/src/views/noble/ResourceAdminView.vue
@@ -0,0 +1,830 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/personalCenter/PersonalCenterAdminView.vue b/src/views/personalCenter/PersonalCenterAdminView.vue
new file mode 100644
index 0000000..baf67ac
--- /dev/null
+++ b/src/views/personalCenter/PersonalCenterAdminView.vue
@@ -0,0 +1,352 @@
+
+
+
+
+
+
+
diff --git a/src/views/picture/AdminPictureView.vue b/src/views/picture/AdminPictureView.vue
new file mode 100644
index 0000000..30de74b
--- /dev/null
+++ b/src/views/picture/AdminPictureView.vue
@@ -0,0 +1,459 @@
+
+
+
+
+
+
+
+
+
+
+ --全部--
+
+
+ 查询
+
+
+ 增加
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/pretty/PrettyNoAdminView.vue b/src/views/pretty/PrettyNoAdminView.vue
new file mode 100644
index 0000000..5680dd8
--- /dev/null
+++ b/src/views/pretty/PrettyNoAdminView.vue
@@ -0,0 +1,651 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
确认解绑?
+ 解绑后,使用人会恢复原ID
+
解绑叙述:
+
+
+
+
+
+
+
+
+
+
+
+
+
确认全面解绑?
+ 解绑后,使用人会恢复原ID
+
解绑叙述:
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/pretty/PrettyNoRecordAdminView.vue b/src/views/pretty/PrettyNoRecordAdminView.vue
new file mode 100644
index 0000000..8b03741
--- /dev/null
+++ b/src/views/pretty/PrettyNoRecordAdminView.vue
@@ -0,0 +1,150 @@
+
+
+
+
+
+
diff --git a/src/views/pretty/PrettynoCheckView.vue b/src/views/pretty/PrettynoCheckView.vue
new file mode 100644
index 0000000..8f86cdd
--- /dev/null
+++ b/src/views/pretty/PrettynoCheckView.vue
@@ -0,0 +1,322 @@
+
+
+
+
+
+
+
+
+
+
您确认审核不通过吗? 请输入原因
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/privilege/RoomPrivilegeCardCheckView.vue b/src/views/privilege/RoomPrivilegeCardCheckView.vue
new file mode 100644
index 0000000..32ebfa6
--- /dev/null
+++ b/src/views/privilege/RoomPrivilegeCardCheckView.vue
@@ -0,0 +1,369 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/privilege/RoomPrivilegeCardView.vue b/src/views/privilege/RoomPrivilegeCardView.vue
new file mode 100644
index 0000000..c64340c
--- /dev/null
+++ b/src/views/privilege/RoomPrivilegeCardView.vue
@@ -0,0 +1,468 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/prize/DeviateRangeManageAdminView.vue b/src/views/prize/DeviateRangeManageAdminView.vue
new file mode 100644
index 0000000..5bef809
--- /dev/null
+++ b/src/views/prize/DeviateRangeManageAdminView.vue
@@ -0,0 +1,247 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ 请选择
+ 幸运许愿池偏差类型
+ 梦幻许愿池池偏差类型
+
+
+ 搜索
+
+ 新增
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/prize/PrizeAdminView.vue b/src/views/prize/PrizeAdminView.vue
new file mode 100644
index 0000000..0475389
--- /dev/null
+++ b/src/views/prize/PrizeAdminView.vue
@@ -0,0 +1,826 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
奖品类型:
+
+
+
+ 金币
+ 线上礼物
+ 装扮
+ 实体奖品
+ 虚拟货币
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 奖品名称:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/prize/PrizeDataAdminExcludeView.vue b/src/views/prize/PrizeDataAdminExcludeView.vue
new file mode 100644
index 0000000..78eda3e
--- /dev/null
+++ b/src/views/prize/PrizeDataAdminExcludeView.vue
@@ -0,0 +1,258 @@
+
+
+
+
+
+
+
diff --git a/src/views/prize/PrizeDataAdminNewView.vue b/src/views/prize/PrizeDataAdminNewView.vue
new file mode 100644
index 0000000..7df56bb
--- /dev/null
+++ b/src/views/prize/PrizeDataAdminNewView.vue
@@ -0,0 +1,315 @@
+
+
+
+
+
+
diff --git a/src/views/prize/PrizeDataAdminView.vue b/src/views/prize/PrizeDataAdminView.vue
new file mode 100644
index 0000000..9fdde4a
--- /dev/null
+++ b/src/views/prize/PrizeDataAdminView.vue
@@ -0,0 +1,315 @@
+
+
+
+
+
+
diff --git a/src/views/prize/PrizeManageAdminView.vue b/src/views/prize/PrizeManageAdminView.vue
new file mode 100644
index 0000000..0f739f5
--- /dev/null
+++ b/src/views/prize/PrizeManageAdminView.vue
@@ -0,0 +1,752 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/prize/PrizeRecordAdminView.vue b/src/views/prize/PrizeRecordAdminView.vue
new file mode 100644
index 0000000..685525f
--- /dev/null
+++ b/src/views/prize/PrizeRecordAdminView.vue
@@ -0,0 +1,159 @@
+
+
+
+
+
+
diff --git a/src/views/prize/PrizeStatisAdminView.vue b/src/views/prize/PrizeStatisAdminView.vue
new file mode 100644
index 0000000..9d0a66a
--- /dev/null
+++ b/src/views/prize/PrizeStatisAdminView.vue
@@ -0,0 +1,284 @@
+
+
+
+
+
+
diff --git a/src/views/prize/PrizeStatsAdminNewView.vue b/src/views/prize/PrizeStatsAdminNewView.vue
new file mode 100644
index 0000000..057e332
--- /dev/null
+++ b/src/views/prize/PrizeStatsAdminNewView.vue
@@ -0,0 +1,284 @@
+
+
+
+
+
+
diff --git a/src/views/prize/UserCardsManageView.vue b/src/views/prize/UserCardsManageView.vue
new file mode 100644
index 0000000..36d155c
--- /dev/null
+++ b/src/views/prize/UserCardsManageView.vue
@@ -0,0 +1,464 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/radish/RadishGiftStatisticsView.vue b/src/views/radish/RadishGiftStatisticsView.vue
new file mode 100644
index 0000000..df8d438
--- /dev/null
+++ b/src/views/radish/RadishGiftStatisticsView.vue
@@ -0,0 +1,122 @@
+
+
+
+
+
diff --git a/src/views/recommend/RecommendOccupyAdminView.vue b/src/views/recommend/RecommendOccupyAdminView.vue
new file mode 100644
index 0000000..9cacaeb
--- /dev/null
+++ b/src/views/recommend/RecommendOccupyAdminView.vue
@@ -0,0 +1,294 @@
+
+
+
+
+
+
+
+
diff --git a/src/views/recommend/RecommendRecordAdminView.vue b/src/views/recommend/RecommendRecordAdminView.vue
new file mode 100644
index 0000000..9248212
--- /dev/null
+++ b/src/views/recommend/RecommendRecordAdminView.vue
@@ -0,0 +1,475 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/views/record/ChargeRecordView.vue b/src/views/record/ChargeRecordView.vue
new file mode 100644
index 0000000..b7f788c
--- /dev/null
+++ b/src/views/record/ChargeRecordView.vue
@@ -0,0 +1,189 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/record/OfficialGoldBusTypeView.vue b/src/views/record/OfficialGoldBusTypeView.vue
new file mode 100644
index 0000000..875d640
--- /dev/null
+++ b/src/views/record/OfficialGoldBusTypeView.vue
@@ -0,0 +1,273 @@
+
+
+
+
+
+
+
diff --git a/src/views/record/OfficialRadishView.vue b/src/views/record/OfficialRadishView.vue
new file mode 100644
index 0000000..b88ba33
--- /dev/null
+++ b/src/views/record/OfficialRadishView.vue
@@ -0,0 +1,281 @@
+
+
+
+
+
+
diff --git a/src/views/record/OfficicalGoldRecordView.vue b/src/views/record/OfficicalGoldRecordView.vue
new file mode 100644
index 0000000..4518e2f
--- /dev/null
+++ b/src/views/record/OfficicalGoldRecordView.vue
@@ -0,0 +1,171 @@
+
+
+
+
+
+
diff --git a/src/views/record/OfficicalGoldView.vue b/src/views/record/OfficicalGoldView.vue
new file mode 100644
index 0000000..ab68155
--- /dev/null
+++ b/src/views/record/OfficicalGoldView.vue
@@ -0,0 +1,464 @@
+
+
+
+
+
+
diff --git a/src/views/record/OfficicalKeyView.vue b/src/views/record/OfficicalKeyView.vue
new file mode 100644
index 0000000..fbe7751
--- /dev/null
+++ b/src/views/record/OfficicalKeyView.vue
@@ -0,0 +1,391 @@
+
+
+
+
+
+
diff --git a/src/views/redenvelope/RedEnvelopeView.vue b/src/views/redenvelope/RedEnvelopeView.vue
new file mode 100644
index 0000000..f977842
--- /dev/null
+++ b/src/views/redenvelope/RedEnvelopeView.vue
@@ -0,0 +1,297 @@
+
+
+
+
+
+
+
+
diff --git a/src/views/room/AutoSayHelloView.vue b/src/views/room/AutoSayHelloView.vue
new file mode 100644
index 0000000..0aadac0
--- /dev/null
+++ b/src/views/room/AutoSayHelloView.vue
@@ -0,0 +1,341 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/room/CrossRoomPkAdminView.vue b/src/views/room/CrossRoomPkAdminView.vue
new file mode 100644
index 0000000..68e6ab7
--- /dev/null
+++ b/src/views/room/CrossRoomPkAdminView.vue
@@ -0,0 +1,351 @@
+
+
+
+
+
+
+
+
diff --git a/src/views/room/CrossRoomPkingAdminView.vue b/src/views/room/CrossRoomPkingAdminView.vue
new file mode 100644
index 0000000..131d9f5
--- /dev/null
+++ b/src/views/room/CrossRoomPkingAdminView.vue
@@ -0,0 +1,338 @@
+
+
+
+
+
+
+
diff --git a/src/views/room/HomePermitView.vue b/src/views/room/HomePermitView.vue
new file mode 100644
index 0000000..ddde3b6
--- /dev/null
+++ b/src/views/room/HomePermitView.vue
@@ -0,0 +1,99 @@
+
+
+
+
+
+
+
+
+ 头像
+ 音萌号
+ 昵称
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/room/HomeRecommView.vue b/src/views/room/HomeRecommView.vue
new file mode 100644
index 0000000..2ca80af
--- /dev/null
+++ b/src/views/room/HomeRecommView.vue
@@ -0,0 +1,165 @@
+
+
+
+
+
+
diff --git a/src/views/room/HomeRiseAdminView.vue b/src/views/room/HomeRiseAdminView.vue
new file mode 100644
index 0000000..094ab79
--- /dev/null
+++ b/src/views/room/HomeRiseAdminView.vue
@@ -0,0 +1,299 @@
+
+
+
+
+
+
+
+
diff --git a/src/views/room/MiniGameStatisAdminView.vue b/src/views/room/MiniGameStatisAdminView.vue
new file mode 100644
index 0000000..243183d
--- /dev/null
+++ b/src/views/room/MiniGameStatisAdminView.vue
@@ -0,0 +1,364 @@
+
+
+
+
+
+
+
+
diff --git a/src/views/room/PrivateChatItemView.vue b/src/views/room/PrivateChatItemView.vue
new file mode 100644
index 0000000..bd022c3
--- /dev/null
+++ b/src/views/room/PrivateChatItemView.vue
@@ -0,0 +1,325 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/room/RoomActAdminView.vue b/src/views/room/RoomActAdminView.vue
new file mode 100644
index 0000000..cdf7a8d
--- /dev/null
+++ b/src/views/room/RoomActAdminView.vue
@@ -0,0 +1,426 @@
+
+
+
+
+
+
+
+
+ 状态:
+ --全部--
+ 激活启用中
+ 未激活
+
+
+ 查询
+
+
+ 增加
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 激活设置:
+
+ 激活
+ 不激活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 激活设置:
+
+ 激活
+ 不激活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/room/RoomCardView.vue b/src/views/room/RoomCardView.vue
new file mode 100644
index 0000000..5dc40c9
--- /dev/null
+++ b/src/views/room/RoomCardView.vue
@@ -0,0 +1,262 @@
+
+
+
+
+
+
+
diff --git a/src/views/room/RoomChatPartyView.vue b/src/views/room/RoomChatPartyView.vue
new file mode 100644
index 0000000..b1d58d1
--- /dev/null
+++ b/src/views/room/RoomChatPartyView.vue
@@ -0,0 +1,302 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/room/RoomDiversionAdminView.vue b/src/views/room/RoomDiversionAdminView.vue
new file mode 100644
index 0000000..60496e2
--- /dev/null
+++ b/src/views/room/RoomDiversionAdminView.vue
@@ -0,0 +1,368 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/room/RoomHideHomeView.vue b/src/views/room/RoomHideHomeView.vue
new file mode 100644
index 0000000..a6d8380
--- /dev/null
+++ b/src/views/room/RoomHideHomeView.vue
@@ -0,0 +1,256 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/views/room/RoomInsideRecommendView.vue b/src/views/room/RoomInsideRecommendView.vue
new file mode 100644
index 0000000..ca3916b
--- /dev/null
+++ b/src/views/room/RoomInsideRecommendView.vue
@@ -0,0 +1,292 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/room/RoomInviteView.vue b/src/views/room/RoomInviteView.vue
new file mode 100644
index 0000000..beae06b
--- /dev/null
+++ b/src/views/room/RoomInviteView.vue
@@ -0,0 +1,250 @@
+
+
+
+
+
+
+
diff --git a/src/views/room/RoomRecommendAdminView.vue b/src/views/room/RoomRecommendAdminView.vue
new file mode 100644
index 0000000..f33bbc5
--- /dev/null
+++ b/src/views/room/RoomRecommendAdminView.vue
@@ -0,0 +1,564 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ *数字小的排前面,必填
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 展示类型:
+
+ 3+N
+ 2*N
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/room/RoomRecommendRoomAdminView.vue b/src/views/room/RoomRecommendRoomAdminView.vue
new file mode 100644
index 0000000..c5fad3a
--- /dev/null
+++ b/src/views/room/RoomRecommendRoomAdminView.vue
@@ -0,0 +1,500 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ *填写房间用户ID,添加多个房间用“,”隔开
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 话题标题:
+
+
+
+ 用户ID:
+
+
+
+
+ *权重数字越大,房间排序越靠前
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/room/RoomSearchAdminView.vue b/src/views/room/RoomSearchAdminView.vue
new file mode 100644
index 0000000..dda24a5
--- /dev/null
+++ b/src/views/room/RoomSearchAdminView.vue
@@ -0,0 +1,1133 @@
+
+
+
+
+
+
+
+
+ 人数: (人数不能超过100)
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 房间类型:
+
+ 牌照房
+ 普通房
+ 新秀房
+ 个播房
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/room/RoomSerialView.vue b/src/views/room/RoomSerialView.vue
new file mode 100644
index 0000000..fbed1c4
--- /dev/null
+++ b/src/views/room/RoomSerialView.vue
@@ -0,0 +1,296 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 房间ID:
+
+
+
+ 房间昵称:
+
+
+
+ 收礼总钻石:
+
+
+
+ 房间抽成钻石数:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/room/RoomTabHomeView.vue b/src/views/room/RoomTabHomeView.vue
new file mode 100644
index 0000000..85ae637
--- /dev/null
+++ b/src/views/room/RoomTabHomeView.vue
@@ -0,0 +1,342 @@
+
+
+
+
+
+
+
+
diff --git a/src/views/room/RoomTabMapView.vue b/src/views/room/RoomTabMapView.vue
new file mode 100644
index 0000000..3066e97
--- /dev/null
+++ b/src/views/room/RoomTabMapView.vue
@@ -0,0 +1,423 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/room/RoomTabView.vue b/src/views/room/RoomTabView.vue
new file mode 100644
index 0000000..706b827
--- /dev/null
+++ b/src/views/room/RoomTabView.vue
@@ -0,0 +1,311 @@
+
+
+
+
+
+
+
diff --git a/src/views/room/RoomUidExchangeView.vue b/src/views/room/RoomUidExchangeView.vue
new file mode 100644
index 0000000..1198aed
--- /dev/null
+++ b/src/views/room/RoomUidExchangeView.vue
@@ -0,0 +1,171 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/views/room/RoomUnchangeAdminView.vue b/src/views/room/RoomUnchangeAdminView.vue
new file mode 100644
index 0000000..d9b03e9
--- /dev/null
+++ b/src/views/room/RoomUnchangeAdminView.vue
@@ -0,0 +1,228 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/room/RoomVisitorView.vue b/src/views/room/RoomVisitorView.vue
new file mode 100644
index 0000000..bd12448
--- /dev/null
+++ b/src/views/room/RoomVisitorView.vue
@@ -0,0 +1,449 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/room/RoompoolAdminView.vue b/src/views/room/RoompoolAdminView.vue
new file mode 100644
index 0000000..5b5e8cd
--- /dev/null
+++ b/src/views/room/RoompoolAdminView.vue
@@ -0,0 +1,229 @@
+
+
+
+
+
+
+
diff --git a/src/views/room/RoomtagAdminView.vue b/src/views/room/RoomtagAdminView.vue
new file mode 100644
index 0000000..662f62c
--- /dev/null
+++ b/src/views/room/RoomtagAdminView.vue
@@ -0,0 +1,468 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/room/RoomtagspecialconfigAdminView.vue b/src/views/room/RoomtagspecialconfigAdminView.vue
new file mode 100644
index 0000000..50d710f
--- /dev/null
+++ b/src/views/room/RoomtagspecialconfigAdminView.vue
@@ -0,0 +1,486 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/views/room/ShortcutRoomView.vue b/src/views/room/ShortcutRoomView.vue
new file mode 100644
index 0000000..515eea7
--- /dev/null
+++ b/src/views/room/ShortcutRoomView.vue
@@ -0,0 +1,429 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/room/SingleBroadcastRoomView.vue b/src/views/room/SingleBroadcastRoomView.vue
new file mode 100644
index 0000000..4da2515
--- /dev/null
+++ b/src/views/room/SingleBroadcastRoomView.vue
@@ -0,0 +1,219 @@
+
+
+
+
+
+
+
+
+
+ 是否置顶*:
+
+ 是
+ 否
+
+
+
+ 置顶排序*:
+
+
+
+
+ 首页展示设置*:
+
+ 是
+ 否
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/room/SingleRoomSortView.vue b/src/views/room/SingleRoomSortView.vue
new file mode 100644
index 0000000..166f114
--- /dev/null
+++ b/src/views/room/SingleRoomSortView.vue
@@ -0,0 +1,284 @@
+
+
+
+
+
+
+
diff --git a/src/views/seekelfin/SeekElfinItemAdminView.vue b/src/views/seekelfin/SeekElfinItemAdminView.vue
new file mode 100644
index 0000000..969e276
--- /dev/null
+++ b/src/views/seekelfin/SeekElfinItemAdminView.vue
@@ -0,0 +1,583 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ prodId
+ 名称
+ 图片
+ 倍数
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/seekelfin/SeekElfinPlatformAdminView.vue b/src/views/seekelfin/SeekElfinPlatformAdminView.vue
new file mode 100644
index 0000000..77cb80c
--- /dev/null
+++ b/src/views/seekelfin/SeekElfinPlatformAdminView.vue
@@ -0,0 +1,157 @@
+
+
+
+
+
+
diff --git a/src/views/seekelfin/SeekElfinUserRecordAdminView.vue b/src/views/seekelfin/SeekElfinUserRecordAdminView.vue
new file mode 100644
index 0000000..aed846c
--- /dev/null
+++ b/src/views/seekelfin/SeekElfinUserRecordAdminView.vue
@@ -0,0 +1,219 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/views/sensitive/SensitiveConfigView.vue b/src/views/sensitive/SensitiveConfigView.vue
new file mode 100644
index 0000000..386949c
--- /dev/null
+++ b/src/views/sensitive/SensitiveConfigView.vue
@@ -0,0 +1,331 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/sign/DrawCountWhiteAdminView.vue b/src/views/sign/DrawCountWhiteAdminView.vue
new file mode 100644
index 0000000..e0784b9
--- /dev/null
+++ b/src/views/sign/DrawCountWhiteAdminView.vue
@@ -0,0 +1,241 @@
+
+
+
+
+
+
diff --git a/src/views/sign/DrawGoldAdminView.vue b/src/views/sign/DrawGoldAdminView.vue
new file mode 100644
index 0000000..7109fb1
--- /dev/null
+++ b/src/views/sign/DrawGoldAdminView.vue
@@ -0,0 +1,201 @@
+
+
+
+
+
+
diff --git a/src/views/sign/GoldPrizeAdminView.vue b/src/views/sign/GoldPrizeAdminView.vue
new file mode 100644
index 0000000..e503136
--- /dev/null
+++ b/src/views/sign/GoldPrizeAdminView.vue
@@ -0,0 +1,318 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/sign/MissionConfigAdminView.vue b/src/views/sign/MissionConfigAdminView.vue
new file mode 100644
index 0000000..db14193
--- /dev/null
+++ b/src/views/sign/MissionConfigAdminView.vue
@@ -0,0 +1,472 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/sign/PrizeGoldPoolAdminView.vue b/src/views/sign/PrizeGoldPoolAdminView.vue
new file mode 100644
index 0000000..1126157
--- /dev/null
+++ b/src/views/sign/PrizeGoldPoolAdminView.vue
@@ -0,0 +1,610 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/sign/SignPrizeRecordAdminView.vue b/src/views/sign/SignPrizeRecordAdminView.vue
new file mode 100644
index 0000000..6d0568a
--- /dev/null
+++ b/src/views/sign/SignPrizeRecordAdminView.vue
@@ -0,0 +1,170 @@
+
+
+
+
+
+
diff --git a/src/views/sign/SignRecordAdminView.vue b/src/views/sign/SignRecordAdminView.vue
new file mode 100644
index 0000000..ce15fcc
--- /dev/null
+++ b/src/views/sign/SignRecordAdminView.vue
@@ -0,0 +1,193 @@
+
+
+
+
+
+
diff --git a/src/views/sign/SignRewardConfigAdminView.vue b/src/views/sign/SignRewardConfigAdminView.vue
new file mode 100644
index 0000000..e5e8c92
--- /dev/null
+++ b/src/views/sign/SignRewardConfigAdminView.vue
@@ -0,0 +1,487 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/singleroompk/SingleRoomPkAdminView.vue b/src/views/singleroompk/SingleRoomPkAdminView.vue
new file mode 100644
index 0000000..67da698
--- /dev/null
+++ b/src/views/singleroompk/SingleRoomPkAdminView.vue
@@ -0,0 +1,351 @@
+
+
+
+
+
+
+
+
diff --git a/src/views/singleroompk/SingleRoomPkingAdminView.vue b/src/views/singleroompk/SingleRoomPkingAdminView.vue
new file mode 100644
index 0000000..5e65250
--- /dev/null
+++ b/src/views/singleroompk/SingleRoomPkingAdminView.vue
@@ -0,0 +1,167 @@
+
+
+
+
+
+
+
diff --git a/src/views/skillcard/SkillCardAudioVerifyView.vue b/src/views/skillcard/SkillCardAudioVerifyView.vue
new file mode 100644
index 0000000..2e81c86
--- /dev/null
+++ b/src/views/skillcard/SkillCardAudioVerifyView.vue
@@ -0,0 +1,342 @@
+
+
+
+
+
+
+
+
diff --git a/src/views/statistic/ChannelCheckAdminView.vue b/src/views/statistic/ChannelCheckAdminView.vue
new file mode 100644
index 0000000..b391784
--- /dev/null
+++ b/src/views/statistic/ChannelCheckAdminView.vue
@@ -0,0 +1,309 @@
+
+
+
+
+
+
diff --git a/src/views/statistic/HallSingleRoomStatisAdminView.vue b/src/views/statistic/HallSingleRoomStatisAdminView.vue
new file mode 100644
index 0000000..d6c1739
--- /dev/null
+++ b/src/views/statistic/HallSingleRoomStatisAdminView.vue
@@ -0,0 +1,256 @@
+
+
+
+
+
+
+
diff --git a/src/views/statistic/LaborStatsView.vue b/src/views/statistic/LaborStatsView.vue
new file mode 100644
index 0000000..dc1a856
--- /dev/null
+++ b/src/views/statistic/LaborStatsView.vue
@@ -0,0 +1,216 @@
+
+
+
+
+
+
diff --git a/src/views/statistic/NewUserStatsView.vue b/src/views/statistic/NewUserStatsView.vue
new file mode 100644
index 0000000..bf29aad
--- /dev/null
+++ b/src/views/statistic/NewUserStatsView.vue
@@ -0,0 +1,151 @@
+
+
+
+
+
diff --git a/src/views/statistic/PermitRoomStatsView.vue b/src/views/statistic/PermitRoomStatsView.vue
new file mode 100644
index 0000000..62d46b8
--- /dev/null
+++ b/src/views/statistic/PermitRoomStatsView.vue
@@ -0,0 +1,160 @@
+
+
+
+
+
diff --git a/src/views/statistic/PermitRoomTimeRecordView.vue b/src/views/statistic/PermitRoomTimeRecordView.vue
new file mode 100644
index 0000000..0156ff3
--- /dev/null
+++ b/src/views/statistic/PermitRoomTimeRecordView.vue
@@ -0,0 +1,288 @@
+
+
+
+
+
+
+
+
diff --git a/src/views/statistic/RoomOptmizeStatisAdminView.vue b/src/views/statistic/RoomOptmizeStatisAdminView.vue
new file mode 100644
index 0000000..b7a8e35
--- /dev/null
+++ b/src/views/statistic/RoomOptmizeStatisAdminView.vue
@@ -0,0 +1,268 @@
+
+
+
+
+
+
diff --git a/src/views/statistic/SingleLiveTimeRecordView.vue b/src/views/statistic/SingleLiveTimeRecordView.vue
new file mode 100644
index 0000000..b3e10d7
--- /dev/null
+++ b/src/views/statistic/SingleLiveTimeRecordView.vue
@@ -0,0 +1,288 @@
+
+
+
+
+
+
+
+
diff --git a/src/views/statistic/SingleRoomStatsView.vue b/src/views/statistic/SingleRoomStatsView.vue
new file mode 100644
index 0000000..b8bcde5
--- /dev/null
+++ b/src/views/statistic/SingleRoomStatsView.vue
@@ -0,0 +1,163 @@
+
+
+
+
+
diff --git a/src/views/statistic/UserChargeStatsDetailView.vue b/src/views/statistic/UserChargeStatsDetailView.vue
new file mode 100644
index 0000000..122ddec
--- /dev/null
+++ b/src/views/statistic/UserChargeStatsDetailView.vue
@@ -0,0 +1,210 @@
+
+
+
+
+
+
+
diff --git a/src/views/statistic/UserChargeStatsView.vue b/src/views/statistic/UserChargeStatsView.vue
new file mode 100644
index 0000000..fbcffd9
--- /dev/null
+++ b/src/views/statistic/UserChargeStatsView.vue
@@ -0,0 +1,199 @@
+
+
+
+
+
+
+
diff --git a/src/views/statistic/UserDetailAdminView.vue b/src/views/statistic/UserDetailAdminView.vue
new file mode 100644
index 0000000..cbb578e
--- /dev/null
+++ b/src/views/statistic/UserDetailAdminView.vue
@@ -0,0 +1,244 @@
+
+
+
+
+
+
+
diff --git a/src/views/statistic/UserGiftStatsDetailView.vue b/src/views/statistic/UserGiftStatsDetailView.vue
new file mode 100644
index 0000000..0aafae1
--- /dev/null
+++ b/src/views/statistic/UserGiftStatsDetailView.vue
@@ -0,0 +1,235 @@
+
+
+
+
+
+
+
diff --git a/src/views/statistic/UserGiftStatsView.vue b/src/views/statistic/UserGiftStatsView.vue
new file mode 100644
index 0000000..2650f26
--- /dev/null
+++ b/src/views/statistic/UserGiftStatsView.vue
@@ -0,0 +1,229 @@
+
+
+
+
+
+
+
diff --git a/src/views/system/AppAdminView.vue b/src/views/system/AppAdminView.vue
new file mode 100644
index 0000000..5a0801a
--- /dev/null
+++ b/src/views/system/AppAdminView.vue
@@ -0,0 +1,248 @@
+
+
+
+
+
+
+
+
diff --git a/src/views/system/BlockAdminView.vue b/src/views/system/BlockAdminView.vue
new file mode 100644
index 0000000..d014c72
--- /dev/null
+++ b/src/views/system/BlockAdminView.vue
@@ -0,0 +1,248 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/system/BlockSearchUserAdminView.vue b/src/views/system/BlockSearchUserAdminView.vue
new file mode 100644
index 0000000..adf60ac
--- /dev/null
+++ b/src/views/system/BlockSearchUserAdminView.vue
@@ -0,0 +1,290 @@
+
+
+
+
+
+
+
+
diff --git a/src/views/system/ChannelDistributeAdminView.vue b/src/views/system/ChannelDistributeAdminView.vue
new file mode 100644
index 0000000..57944a0
--- /dev/null
+++ b/src/views/system/ChannelDistributeAdminView.vue
@@ -0,0 +1,341 @@
+
+
+
+
+
+
+
+
diff --git a/src/views/system/CustomserviceAdminView.vue b/src/views/system/CustomserviceAdminView.vue
new file mode 100644
index 0000000..9b93124
--- /dev/null
+++ b/src/views/system/CustomserviceAdminView.vue
@@ -0,0 +1,189 @@
+
+ -->
+
+
+
+
+
+
+
+
diff --git a/src/views/system/DictAdminView.vue b/src/views/system/DictAdminView.vue
new file mode 100644
index 0000000..51e6724
--- /dev/null
+++ b/src/views/system/DictAdminView.vue
@@ -0,0 +1,241 @@
+
+
+
+
+
+
diff --git a/src/views/system/MenuAdminView.vue b/src/views/system/MenuAdminView.vue
new file mode 100644
index 0000000..a009e21
--- /dev/null
+++ b/src/views/system/MenuAdminView.vue
@@ -0,0 +1,265 @@
+
+
+
+
+
+
+
diff --git a/src/views/system/RoleAdminView.vue b/src/views/system/RoleAdminView.vue
new file mode 100644
index 0000000..2177b25
--- /dev/null
+++ b/src/views/system/RoleAdminView.vue
@@ -0,0 +1,337 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/system/SysconfAdminView.vue b/src/views/system/SysconfAdminView.vue
new file mode 100644
index 0000000..15ed020
--- /dev/null
+++ b/src/views/system/SysconfAdminView.vue
@@ -0,0 +1,308 @@
+
+
+
+
+
+
+
+
+
+
+
+ 增加
+
+
+
+ 批量删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/system/UserAdminView.vue b/src/views/system/UserAdminView.vue
new file mode 100644
index 0000000..dfc41c6
--- /dev/null
+++ b/src/views/system/UserAdminView.vue
@@ -0,0 +1,547 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/system/UserLevelCharmAdminView.vue b/src/views/system/UserLevelCharmAdminView.vue
new file mode 100644
index 0000000..4451a33
--- /dev/null
+++ b/src/views/system/UserLevelCharmAdminView.vue
@@ -0,0 +1,81 @@
+
+
+
+
+
diff --git a/src/views/system/VersionAdminView.vue b/src/views/system/VersionAdminView.vue
new file mode 100644
index 0000000..3425ee6
--- /dev/null
+++ b/src/views/system/VersionAdminView.vue
@@ -0,0 +1,702 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/system/VersionConfigAdminView.vue b/src/views/system/VersionConfigAdminView.vue
new file mode 100644
index 0000000..f2a83a8
--- /dev/null
+++ b/src/views/system/VersionConfigAdminView.vue
@@ -0,0 +1,434 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/tarot/TarotChargeRecordView.vue b/src/views/tarot/TarotChargeRecordView.vue
new file mode 100644
index 0000000..f9838c2
--- /dev/null
+++ b/src/views/tarot/TarotChargeRecordView.vue
@@ -0,0 +1,139 @@
+
+
+
+
+
diff --git a/src/views/tarot/TarotChargeStatisView.vue b/src/views/tarot/TarotChargeStatisView.vue
new file mode 100644
index 0000000..a2f1162
--- /dev/null
+++ b/src/views/tarot/TarotChargeStatisView.vue
@@ -0,0 +1,118 @@
+
+
+
+
+
diff --git a/src/views/tarot/TarotChargeTotalView.vue b/src/views/tarot/TarotChargeTotalView.vue
new file mode 100644
index 0000000..92a72d5
--- /dev/null
+++ b/src/views/tarot/TarotChargeTotalView.vue
@@ -0,0 +1,183 @@
+
+
+
+
+
+
diff --git a/src/views/title/TitleAdminView.vue b/src/views/title/TitleAdminView.vue
new file mode 100644
index 0000000..e086223
--- /dev/null
+++ b/src/views/title/TitleAdminView.vue
@@ -0,0 +1,292 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ *数字小的排前面,必填
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/title/TitleConfigView.vue b/src/views/title/TitleConfigView.vue
new file mode 100644
index 0000000..51f585c
--- /dev/null
+++ b/src/views/title/TitleConfigView.vue
@@ -0,0 +1,349 @@
+
+
+
+
+
+
+
diff --git a/src/views/topline/ToplineAdminView.vue b/src/views/topline/ToplineAdminView.vue
new file mode 100644
index 0000000..e327c34
--- /dev/null
+++ b/src/views/topline/ToplineAdminView.vue
@@ -0,0 +1,561 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/userrole/UserRoleAdminView.vue b/src/views/userrole/UserRoleAdminView.vue
new file mode 100644
index 0000000..1322ab9
--- /dev/null
+++ b/src/views/userrole/UserRoleAdminView.vue
@@ -0,0 +1,293 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/views/users/BackListAdminView.vue b/src/views/users/BackListAdminView.vue
new file mode 100644
index 0000000..77ec823
--- /dev/null
+++ b/src/views/users/BackListAdminView.vue
@@ -0,0 +1,424 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/users/BillRecordAdminView.vue b/src/views/users/BillRecordAdminView.vue
new file mode 100644
index 0000000..472b13a
--- /dev/null
+++ b/src/views/users/BillRecordAdminView.vue
@@ -0,0 +1,208 @@
+
+
+
+
+
+
diff --git a/src/views/users/BillRecordGroupView.vue b/src/views/users/BillRecordGroupView.vue
new file mode 100644
index 0000000..e35bf49
--- /dev/null
+++ b/src/views/users/BillRecordGroupView.vue
@@ -0,0 +1,140 @@
+
+
+
+
+
+
diff --git a/src/views/users/BlockedAdminView.vue b/src/views/users/BlockedAdminView.vue
new file mode 100644
index 0000000..51c3b66
--- /dev/null
+++ b/src/views/users/BlockedAdminView.vue
@@ -0,0 +1,519 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/users/ChargeRecordDailyStatisticsView.vue b/src/views/users/ChargeRecordDailyStatisticsView.vue
new file mode 100644
index 0000000..90a32bf
--- /dev/null
+++ b/src/views/users/ChargeRecordDailyStatisticsView.vue
@@ -0,0 +1,195 @@
+
+
+
+
+
+
+
diff --git a/src/views/users/ChargeRecordPersonalAdminView.vue b/src/views/users/ChargeRecordPersonalAdminView.vue
new file mode 100644
index 0000000..2926bce
--- /dev/null
+++ b/src/views/users/ChargeRecordPersonalAdminView.vue
@@ -0,0 +1,249 @@
+
+
+
+
+
+
diff --git a/src/views/users/ChargeRecordTotalStatisticsView.vue b/src/views/users/ChargeRecordTotalStatisticsView.vue
new file mode 100644
index 0000000..9c49a89
--- /dev/null
+++ b/src/views/users/ChargeRecordTotalStatisticsView.vue
@@ -0,0 +1,215 @@
+
+
+
+
+
+
+
diff --git a/src/views/users/CommissionWhiteListView.vue b/src/views/users/CommissionWhiteListView.vue
new file mode 100644
index 0000000..9e22264
--- /dev/null
+++ b/src/views/users/CommissionWhiteListView.vue
@@ -0,0 +1,302 @@
+
+
+
+
+
+
+
diff --git a/src/views/users/EveryOneSearchView.vue b/src/views/users/EveryOneSearchView.vue
new file mode 100644
index 0000000..c97a8ad
--- /dev/null
+++ b/src/views/users/EveryOneSearchView.vue
@@ -0,0 +1,296 @@
+
+
+
+
+
+
+
diff --git a/src/views/users/FeedbackAdminView.vue b/src/views/users/FeedbackAdminView.vue
new file mode 100644
index 0000000..1a4d394
--- /dev/null
+++ b/src/views/users/FeedbackAdminView.vue
@@ -0,0 +1,124 @@
+
+
+
+
+
+
diff --git a/src/views/users/FrozenAdminView.vue b/src/views/users/FrozenAdminView.vue
new file mode 100644
index 0000000..3c2b54b
--- /dev/null
+++ b/src/views/users/FrozenAdminView.vue
@@ -0,0 +1,303 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/users/FrozenRecordAdminView.vue b/src/views/users/FrozenRecordAdminView.vue
new file mode 100644
index 0000000..aecf3cf
--- /dev/null
+++ b/src/views/users/FrozenRecordAdminView.vue
@@ -0,0 +1,106 @@
+
+
+
+
+
diff --git a/src/views/users/GenAccountView.vue b/src/views/users/GenAccountView.vue
new file mode 100644
index 0000000..790e177
--- /dev/null
+++ b/src/views/users/GenAccountView.vue
@@ -0,0 +1,421 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/users/GiftAdminView.vue b/src/views/users/GiftAdminView.vue
new file mode 100644
index 0000000..7a59d63
--- /dev/null
+++ b/src/views/users/GiftAdminView.vue
@@ -0,0 +1,163 @@
+
+
+
+
+
+
+
+
+
操作记录
+
+
+
+ 受赠人uid
+ 受赠人金币
+ 受赠人钻石
+ 操作时间
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/users/GiftCompoundView.vue b/src/views/users/GiftCompoundView.vue
new file mode 100644
index 0000000..35484ea
--- /dev/null
+++ b/src/views/users/GiftCompoundView.vue
@@ -0,0 +1,286 @@
+
+
+
+
+
+
+
diff --git a/src/views/users/GiftLimitCompoundPoolView.vue b/src/views/users/GiftLimitCompoundPoolView.vue
new file mode 100644
index 0000000..1afbebf
--- /dev/null
+++ b/src/views/users/GiftLimitCompoundPoolView.vue
@@ -0,0 +1,344 @@
+
+
+
+
+
+
+
diff --git a/src/views/users/GiftLimitCompoundView.vue b/src/views/users/GiftLimitCompoundView.vue
new file mode 100644
index 0000000..89a45a1
--- /dev/null
+++ b/src/views/users/GiftLimitCompoundView.vue
@@ -0,0 +1,270 @@
+
+
+
+
+
+
+
diff --git a/src/views/users/GiftManageView.vue b/src/views/users/GiftManageView.vue
new file mode 100644
index 0000000..c1d508b
--- /dev/null
+++ b/src/views/users/GiftManageView.vue
@@ -0,0 +1,1550 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/users/GiftNotifyConfigAdminView.vue b/src/views/users/GiftNotifyConfigAdminView.vue
new file mode 100644
index 0000000..9d27e9e
--- /dev/null
+++ b/src/views/users/GiftNotifyConfigAdminView.vue
@@ -0,0 +1,307 @@
+
+
+
+
+
+
+
+
+
+
+
+ 增加
+
+
+
+ 批量删除
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/users/GiftSendRecordView.vue b/src/views/users/GiftSendRecordView.vue
new file mode 100644
index 0000000..075d243
--- /dev/null
+++ b/src/views/users/GiftSendRecordView.vue
@@ -0,0 +1,200 @@
+
+
+
+
+
+
diff --git a/src/views/users/GiftStatisticsView.vue b/src/views/users/GiftStatisticsView.vue
new file mode 100644
index 0000000..00db050
--- /dev/null
+++ b/src/views/users/GiftStatisticsView.vue
@@ -0,0 +1,131 @@
+
+
+
+
+
diff --git a/src/views/users/InviteCodeStatsView.vue b/src/views/users/InviteCodeStatsView.vue
new file mode 100644
index 0000000..9a3e58f
--- /dev/null
+++ b/src/views/users/InviteCodeStatsView.vue
@@ -0,0 +1,157 @@
+
+
+
+
+
diff --git a/src/views/users/InviteCodeView.vue b/src/views/users/InviteCodeView.vue
new file mode 100644
index 0000000..1a67ac2
--- /dev/null
+++ b/src/views/users/InviteCodeView.vue
@@ -0,0 +1,121 @@
+
+
+
+
+
diff --git a/src/views/users/MagicManageView.vue b/src/views/users/MagicManageView.vue
new file mode 100644
index 0000000..7a70f25
--- /dev/null
+++ b/src/views/users/MagicManageView.vue
@@ -0,0 +1,575 @@
+
+
+
+
+
+
+
+
+
+
+
+ 增加
+
+
+
+ 批量删除
+
+
+
+
+
+
+
+ 全部
+ 有效
+ 无效
+
+
+
+ 查询
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/users/MessageAdminView.vue b/src/views/users/MessageAdminView.vue
new file mode 100644
index 0000000..e2d38a3
--- /dev/null
+++ b/src/views/users/MessageAdminView.vue
@@ -0,0 +1,572 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/users/PasswordLockAdminView.vue b/src/views/users/PasswordLockAdminView.vue
new file mode 100644
index 0000000..e9efbca
--- /dev/null
+++ b/src/views/users/PasswordLockAdminView.vue
@@ -0,0 +1,118 @@
+
+
+
+
+
diff --git a/src/views/users/PhoneBlackAdminView.vue b/src/views/users/PhoneBlackAdminView.vue
new file mode 100644
index 0000000..ce705ce
--- /dev/null
+++ b/src/views/users/PhoneBlackAdminView.vue
@@ -0,0 +1,270 @@
+
+
+
+
+
+
+
+
diff --git a/src/views/users/SearchHijackView.vue b/src/views/users/SearchHijackView.vue
new file mode 100644
index 0000000..bd4ffa2
--- /dev/null
+++ b/src/views/users/SearchHijackView.vue
@@ -0,0 +1,383 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/users/SpecialInviteCodeAdminView.vue b/src/views/users/SpecialInviteCodeAdminView.vue
new file mode 100644
index 0000000..92526b6
--- /dev/null
+++ b/src/views/users/SpecialInviteCodeAdminView.vue
@@ -0,0 +1,195 @@
+
+
+
+
+
+
+
diff --git a/src/views/users/TopicBoxItemAdminView.vue b/src/views/users/TopicBoxItemAdminView.vue
new file mode 100644
index 0000000..80371a5
--- /dev/null
+++ b/src/views/users/TopicBoxItemAdminView.vue
@@ -0,0 +1,266 @@
+
+
+
+
+
+
+
+
diff --git a/src/views/users/UserBackpackAdminView.vue b/src/views/users/UserBackpackAdminView.vue
new file mode 100644
index 0000000..9b4e5ff
--- /dev/null
+++ b/src/views/users/UserBackpackAdminView.vue
@@ -0,0 +1,154 @@
+
+
+
+
+
diff --git a/src/views/users/UserBankAdminView.vue b/src/views/users/UserBankAdminView.vue
new file mode 100644
index 0000000..07332db
--- /dev/null
+++ b/src/views/users/UserBankAdminView.vue
@@ -0,0 +1,323 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/views/users/UserCancelView.vue b/src/views/users/UserCancelView.vue
new file mode 100644
index 0000000..0f8d301
--- /dev/null
+++ b/src/views/users/UserCancelView.vue
@@ -0,0 +1,431 @@
+
+
+
+
+
+
+
+
diff --git a/src/views/users/UserCertifyAdminView.vue b/src/views/users/UserCertifyAdminView.vue
new file mode 100644
index 0000000..31c015a
--- /dev/null
+++ b/src/views/users/UserCertifyAdminView.vue
@@ -0,0 +1,198 @@
+
+
+
+
+
+
diff --git a/src/views/users/UserCheckAdminBaseView.vue b/src/views/users/UserCheckAdminBaseView.vue
new file mode 100644
index 0000000..a54ffb1
--- /dev/null
+++ b/src/views/users/UserCheckAdminBaseView.vue
@@ -0,0 +1,521 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/users/UserCheckAdminView.vue b/src/views/users/UserCheckAdminView.vue
new file mode 100644
index 0000000..1326d89
--- /dev/null
+++ b/src/views/users/UserCheckAdminView.vue
@@ -0,0 +1,855 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/users/UserCoupleStatisticsAdminView.vue b/src/views/users/UserCoupleStatisticsAdminView.vue
new file mode 100644
index 0000000..f319a0f
--- /dev/null
+++ b/src/views/users/UserCoupleStatisticsAdminView.vue
@@ -0,0 +1,387 @@
+
+
+
+
+
+
+
+
diff --git a/src/views/users/UserDrawProdAdminView.vue b/src/views/users/UserDrawProdAdminView.vue
new file mode 100644
index 0000000..a681da0
--- /dev/null
+++ b/src/views/users/UserDrawProdAdminView.vue
@@ -0,0 +1,436 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/users/UserImpeachAdminView.vue b/src/views/users/UserImpeachAdminView.vue
new file mode 100644
index 0000000..d19a32c
--- /dev/null
+++ b/src/views/users/UserImpeachAdminView.vue
@@ -0,0 +1,634 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/users/UserImpeachSearchView.vue b/src/views/users/UserImpeachSearchView.vue
new file mode 100644
index 0000000..45f5bcb
--- /dev/null
+++ b/src/views/users/UserImpeachSearchView.vue
@@ -0,0 +1,630 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/users/UserMuteAdminView.vue b/src/views/users/UserMuteAdminView.vue
new file mode 100644
index 0000000..6068ade
--- /dev/null
+++ b/src/views/users/UserMuteAdminView.vue
@@ -0,0 +1,201 @@
+
+
+
+
+
+
+
+
diff --git a/src/views/users/UserMuteRecordAdminView.vue b/src/views/users/UserMuteRecordAdminView.vue
new file mode 100644
index 0000000..f1710f4
--- /dev/null
+++ b/src/views/users/UserMuteRecordAdminView.vue
@@ -0,0 +1,232 @@
+
+
+
+
+
+
+
diff --git a/src/views/users/UserPasswordModifyView.vue b/src/views/users/UserPasswordModifyView.vue
new file mode 100644
index 0000000..4dbe478
--- /dev/null
+++ b/src/views/users/UserPasswordModifyView.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
diff --git a/src/views/users/UserPurseAdminView.vue b/src/views/users/UserPurseAdminView.vue
new file mode 100644
index 0000000..d966a98
--- /dev/null
+++ b/src/views/users/UserPurseAdminView.vue
@@ -0,0 +1,114 @@
+
+
+
+
+
+
diff --git a/src/views/users/UserRealNameAdminView.vue b/src/views/users/UserRealNameAdminView.vue
new file mode 100644
index 0000000..43c66ef
--- /dev/null
+++ b/src/views/users/UserRealNameAdminView.vue
@@ -0,0 +1,143 @@
+
+
+
+
+
+
diff --git a/src/views/users/UserRecordAdminView.vue b/src/views/users/UserRecordAdminView.vue
new file mode 100644
index 0000000..c664dfe
--- /dev/null
+++ b/src/views/users/UserRecordAdminView.vue
@@ -0,0 +1,246 @@
+
+
+
+
+
+
diff --git a/src/views/users/UserRelationPrivilegeAdminView.vue b/src/views/users/UserRelationPrivilegeAdminView.vue
new file mode 100644
index 0000000..2b2c291
--- /dev/null
+++ b/src/views/users/UserRelationPrivilegeAdminView.vue
@@ -0,0 +1,467 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/users/UserRelationPropsAdminView.vue b/src/views/users/UserRelationPropsAdminView.vue
new file mode 100644
index 0000000..44eae01
--- /dev/null
+++ b/src/views/users/UserRelationPropsAdminView.vue
@@ -0,0 +1,383 @@
+
+
+
+
+
+
+
diff --git a/src/views/users/WithdrawAdminView.vue b/src/views/users/WithdrawAdminView.vue
new file mode 100644
index 0000000..f80d55c
--- /dev/null
+++ b/src/views/users/WithdrawAdminView.vue
@@ -0,0 +1,564 @@
+
+
+
+
+
+
+
+
diff --git a/src/views/vip/VipAuthManageView.vue b/src/views/vip/VipAuthManageView.vue
new file mode 100644
index 0000000..7364af7
--- /dev/null
+++ b/src/views/vip/VipAuthManageView.vue
@@ -0,0 +1,416 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/vip/VipFaceView.vue b/src/views/vip/VipFaceView.vue
new file mode 100644
index 0000000..1d80cac
--- /dev/null
+++ b/src/views/vip/VipFaceView.vue
@@ -0,0 +1,413 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/vip/VipGiftView.vue b/src/views/vip/VipGiftView.vue
new file mode 100644
index 0000000..02f14bb
--- /dev/null
+++ b/src/views/vip/VipGiftView.vue
@@ -0,0 +1,422 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/vip/VipManageView.vue b/src/views/vip/VipManageView.vue
new file mode 100644
index 0000000..e4bd5b7
--- /dev/null
+++ b/src/views/vip/VipManageView.vue
@@ -0,0 +1,636 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 贵族礼物
+
+
+
+ 贵族表情
+
+
+
+
+
+
+
+
+
+
+ 隐身进房
+
+
+
+
+ 防被踢
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/vip/VipOpenRecordView.vue b/src/views/vip/VipOpenRecordView.vue
new file mode 100644
index 0000000..4f4ed11
--- /dev/null
+++ b/src/views/vip/VipOpenRecordView.vue
@@ -0,0 +1,184 @@
+
+
+
+
+
+
diff --git a/src/views/vip/VipStatView.vue b/src/views/vip/VipStatView.vue
new file mode 100644
index 0000000..11a28e0
--- /dev/null
+++ b/src/views/vip/VipStatView.vue
@@ -0,0 +1,245 @@
+
+
+
+
+
+
diff --git a/src/views/voice/PiaDramaAdminView.vue b/src/views/voice/PiaDramaAdminView.vue
new file mode 100644
index 0000000..11a2f57
--- /dev/null
+++ b/src/views/voice/PiaDramaAdminView.vue
@@ -0,0 +1,519 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/voice/VoiceVerifyAdminView.vue b/src/views/voice/VoiceVerifyAdminView.vue
new file mode 100644
index 0000000..539df2c
--- /dev/null
+++ b/src/views/voice/VoiceVerifyAdminView.vue
@@ -0,0 +1,371 @@
+
+
+
+
+
+
diff --git a/src/views/wishgift/WishGiftConfigView.vue b/src/views/wishgift/WishGiftConfigView.vue
new file mode 100644
index 0000000..6bc2219
--- /dev/null
+++ b/src/views/wishgift/WishGiftConfigView.vue
@@ -0,0 +1,351 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/wishgift/WishGiftStatView.vue b/src/views/wishgift/WishGiftStatView.vue
new file mode 100644
index 0000000..509f42a
--- /dev/null
+++ b/src/views/wishgift/WishGiftStatView.vue
@@ -0,0 +1,256 @@
+
+
+
+
+
+
+
diff --git a/src/views/withdraw/PacketWithdrawAdminView.vue b/src/views/withdraw/PacketWithdrawAdminView.vue
new file mode 100644
index 0000000..59f95ff
--- /dev/null
+++ b/src/views/withdraw/PacketWithdrawAdminView.vue
@@ -0,0 +1,438 @@
+
+
+
+
+
+
+
diff --git a/src/views/withdraw/RoomFlowPayAdminView.vue b/src/views/withdraw/RoomFlowPayAdminView.vue
new file mode 100644
index 0000000..c97543f
--- /dev/null
+++ b/src/views/withdraw/RoomFlowPayAdminView.vue
@@ -0,0 +1,507 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/views/withdraw/WithdrawApplyView.vue b/src/views/withdraw/WithdrawApplyView.vue
new file mode 100644
index 0000000..997831f
--- /dev/null
+++ b/src/views/withdraw/WithdrawApplyView.vue
@@ -0,0 +1,448 @@
+
+
+
+
+
+
+
+
diff --git a/src/views/world/WorldAdminView.vue b/src/views/world/WorldAdminView.vue
new file mode 100644
index 0000000..6e20965
--- /dev/null
+++ b/src/views/world/WorldAdminView.vue
@@ -0,0 +1,654 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/world/WorldMemberAdminView.vue b/src/views/world/WorldMemberAdminView.vue
new file mode 100644
index 0000000..d231467
--- /dev/null
+++ b/src/views/world/WorldMemberAdminView.vue
@@ -0,0 +1,298 @@
+
+
+
+
+
+
+
+
diff --git a/src/views/world/WorldTypeAdminView.vue b/src/views/world/WorldTypeAdminView.vue
new file mode 100644
index 0000000..5b6782f
--- /dev/null
+++ b/src/views/world/WorldTypeAdminView.vue
@@ -0,0 +1,409 @@
+
+
+
+
+
+
+
+
diff --git a/src/views/world/community/CommentVerifyView.vue b/src/views/world/community/CommentVerifyView.vue
new file mode 100644
index 0000000..f2619a5
--- /dev/null
+++ b/src/views/world/community/CommentVerifyView.vue
@@ -0,0 +1,693 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/views/world/community/DynamicDataView.vue b/src/views/world/community/DynamicDataView.vue
new file mode 100644
index 0000000..e781bf5
--- /dev/null
+++ b/src/views/world/community/DynamicDataView.vue
@@ -0,0 +1,834 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/world/community/DynamicStatView.vue b/src/views/world/community/DynamicStatView.vue
new file mode 100644
index 0000000..983da5d
--- /dev/null
+++ b/src/views/world/community/DynamicStatView.vue
@@ -0,0 +1,388 @@
+
+
+
+
+
+
diff --git a/src/views/world/community/DynamicVerifyView.vue b/src/views/world/community/DynamicVerifyView.vue
new file mode 100644
index 0000000..c4fdbc4
--- /dev/null
+++ b/src/views/world/community/DynamicVerifyView.vue
@@ -0,0 +1,561 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/world/community/RecommendWorldAdminView.vue b/src/views/world/community/RecommendWorldAdminView.vue
new file mode 100644
index 0000000..3282fc8
--- /dev/null
+++ b/src/views/world/community/RecommendWorldAdminView.vue
@@ -0,0 +1,513 @@
+
+
+
+
+
+
+
+
+
diff --git a/vue.config.js b/vue.config.js
new file mode 100644
index 0000000..9b8e814
--- /dev/null
+++ b/vue.config.js
@@ -0,0 +1,42 @@
+const { defineConfig } = require('@vue/cli-service')
+var webpack = require('webpack')
+var BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
+module.exports = defineConfig({
+ transpileDependencies: true,
+ chainWebpack: config => {
+ config
+ .plugin('html')
+ .tap(args => {
+ args[0].title = '音萌管理后台'
+ return args
+ })
+ },
+ configureWebpack: {
+ plugins: [
+ new webpack.ProvidePlugin({
+ $: 'jquery',
+ jQuery: 'jquery',
+ 'windows.jQuery': 'jquery',
+ Popper: ['popper.js', 'default']
+ }),
+ new BundleAnalyzerPlugin({
+ openAnalyzer: false
+ })
+ ],
+ },
+ devServer: {
+ headers: {
+ 'Access-Control-Allow-Origin': '*',
+ },
+ proxy: {
+ '/': {
+ ws: false,
+ target: process.env.VUE_APP_API_BASE_URL,
+ changeOrigin: true,
+ pathRewrite: {
+ '^/': ''
+ }
+ }
+ },
+ },
+})