diff --git a/.gitignore b/.gitignore index fa54e80..3292ceb 100644 --- a/.gitignore +++ b/.gitignore @@ -1,281 +1,26 @@ -# ---> Linux -*~ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. -# temporary files which can be created if a process still has a handle open of a deleted file -.fuse_hidden* - -# KDE directory preferences -.directory - -# Linux trash folder which might appear on any partition or disk -.Trash-* - -# .nfs files are created when an open file is removed but is still being accessed -.nfs* - -# ---> Windows -# Windows thumbnail cache files -Thumbs.db -Thumbs.db:encryptable -ehthumbs.db -ehthumbs_vista.db - -# Dump file -*.stackdump - -# Folder config file -[Dd]esktop.ini - -# Recycle Bin used on file shares -$RECYCLE.BIN/ - -# Windows Installer files -*.cab -*.msi -*.msix -*.msm -*.msp - -# Windows shortcuts -*.lnk - -# ---> macOS -# General .DS_Store -.AppleDouble -.LSOverride -# Icon must end with two \r -Icon - -# Thumbnails -._* - -# Files that might appear in the root of a volume -.DocumentRevisions-V100 -.fseventsd -.Spotlight-V100 -.TemporaryItems -.Trashes -.VolumeIcon.icns -.com.apple.timemachine.donotpresent - -# Directories potentially created on remote AFP share -.AppleDB -.AppleDesktop -Network Trash Folder -Temporary Items -.apdisk - -# ---> VisualStudioCode -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json -!.vscode/*.code-snippets - -# Local History for Visual Studio Code -.history/ - -# Built Visual Studio Code Extensions -*.vsix - -# ---> Emacs -# -*- mode: gitignore; -*- -*~ -\#*\# -/.emacs.desktop -/.emacs.desktop.lock -*.elc -auto-save-list -tramp -.\#* - -# Org-mode -.org-id-locations -*_archive - -# flymake-mode -*_flymake.* - -# eshell files -/eshell/history -/eshell/lastdir - -# elpa packages -/elpa/ - -# reftex files -*.rel - -# AUCTeX auto folder -/auto/ - -# cask packages -.cask/ -dist/ - -# Flycheck -flycheck_*.el - -# server auth directory -/server/ - -# projectiles files -.projectile - -# directory configuration -.dir-locals.el - -# network security -/network-security.data - - -# ---> Node -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* -.pnpm-debug.log* - -# Diagnostic reports (https://nodejs.org/api/report.html) -report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage -*.lcov - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories +# Generated by package manager node_modules/ -jspm_packages/ - -# Snowpack dependency directory (https://snowpack.dev/) -web_modules/ - -# TypeScript cache -*.tsbuildinfo - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Optional stylelint cache -.stylelintcache - -# Microbundle cache -.rpt2_cache/ -.rts2_cache_cjs/ -.rts2_cache_es/ -.rts2_cache_umd/ - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variable files -.env -.env.development.local -.env.test.local -.env.production.local -.env.local - -# parcel-bundler cache (https://parceljs.org/) -.cache -.parcel-cache - -# Next.js build output -.next -out - -# Nuxt.js build / generate output -.nuxt -dist - -# Gatsby files -.cache/ -# Comment in the public line in if your project uses Gatsby and not Next.js -# https://nextjs.org/blog/next-9-1#public-directory-support -# public - -# vuepress build output -.vuepress/dist - -# vuepress v2.x temp and cache directory -.temp -.cache - -# Docusaurus cache and generated files -.docusaurus - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ - -# DynamoDB Local files -.dynamodb/ - -# TernJS port file -.tern-port - -# Stores VSCode versions used for testing VSCode extensions -.vscode-test - -# yarn v2 -.yarn/cache -.yarn/unplugged -.yarn/build-state.yml -.yarn/install-state.gz -.pnp.* - -# ---> Hugo -# Generated files by hugo -/public/ -/resources/_gen/ -/assets/jsconfig.json -hugo_stats.json - -# Executable may be added to repository -hugo.exe -hugo.darwin -hugo.linux - -# Temporary lock file while building -/.hugo_build.lock +# Generated by Cordova +/plugins/ +/platforms/ diff --git a/Jenkinsfile b/Jenkinsfile deleted file mode 100644 index 950c3fb..0000000 --- a/Jenkinsfile +++ /dev/null @@ -1,47 +0,0 @@ -pipeline { - agent {label 'html'} - stages { - stage('Check host') { - steps { - withCredentials(bindings: [sshUserPrivateKey(credentialsId: '301d16da-51e4-438d-abf7-51b88a05bcec', \ - keyFileVariable: 'SSH_KEY_PEREC', usernameVariable: 'SSH_USERNAME')]) { - sh ''' - ssh -i $SSH_KEY_PEREC -o StrictHostKeyChecking=no $SSH_USERNAME@172.16.0.22 "freebsd-version" - ''' - } - } - } - - stage('Deploy site rsync') { - steps { - withCredentials(bindings: [sshUserPrivateKey(credentialsId: '301d16da-51e4-438d-abf7-51b88a05bcec', \ - keyFileVariable: 'SSH_KEY_PEREC', usernameVariable: 'SSH_USERNAME')]) { - sh ''' - rsync -avz --delete -e "ssh -i $SSH_KEY_PEREC -o StrictHostKeyChecking=no" src/ $SSH_USERNAME@172.16.0.22:/home/$SSH_USERNAME/site/web_example_static/ - ''' - } - } - } - -// stage ('Deploy site ssh){ -// steps { -// withCredentials(bindings: [sshUserPrivateKey(credentialsId: '301d16da-51e4-438d-abf7-51b88a05bcec', \ -// keyFileVariable: 'SSH_KEY_PEREC', usernameVariable: 'SSH_USERNAME')]) { -// sh ''' -// scp -rp -i $SSH_KEY_PEREC -o StrictHostKeyChecking=no src/* $SSH_USERNAME@172.16.0.22:/home/$SSH_USERNAME/site/web_example_static/ -// ''' -// } -// } -// } - } - -// post{ -// success { -// echo "success" -// } -// failure { -// echo "failure" -// } -// } - -} diff --git a/assets/drawable/splash.png b/assets/drawable/splash.png new file mode 100644 index 0000000..2e2d330 Binary files /dev/null and b/assets/drawable/splash.png differ diff --git a/assets/hdpi.png b/assets/hdpi.png new file mode 100644 index 0000000..e4b97c6 Binary files /dev/null and b/assets/hdpi.png differ diff --git a/assets/ldpi.png b/assets/ldpi.png new file mode 100644 index 0000000..0049d62 Binary files /dev/null and b/assets/ldpi.png differ diff --git a/assets/mdpi.png b/assets/mdpi.png new file mode 100644 index 0000000..ab11213 Binary files /dev/null and b/assets/mdpi.png differ diff --git a/assets/tvdpi.png b/assets/tvdpi.png new file mode 100644 index 0000000..8a4113a Binary files /dev/null and b/assets/tvdpi.png differ diff --git a/assets/xhdpi.png b/assets/xhdpi.png new file mode 100644 index 0000000..5cd3fe6 Binary files /dev/null and b/assets/xhdpi.png differ diff --git a/assets/xxhdpi.png b/assets/xxhdpi.png new file mode 100644 index 0000000..3ebd22f Binary files /dev/null and b/assets/xxhdpi.png differ diff --git a/assets/xxxhdpi.png b/assets/xxxhdpi.png new file mode 100644 index 0000000..b18c8cf Binary files /dev/null and b/assets/xxxhdpi.png differ diff --git a/config.xml b/config.xml new file mode 100644 index 0000000..0e2b35f --- /dev/null +++ b/config.xml @@ -0,0 +1,51 @@ + + + Медвежья Тропа + Sample Apache Cordova App + + Ivan Karachkov + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..8a34d78 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2855 @@ +{ + "name": "ru.fcpsr.trailtracker", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "ru.fcpsr.trailtracker", + "version": "1.0.0", + "license": "Apache-2.0", + "dependencies": { + "axios": "^1.7.2", + "bootstrap": "^5.3.3", + "bootstrap-icons": "^1.11.3", + "esri-leaflet": "^3.0.12", + "file-saver": "^2.0.5", + "fs-extra": "^11.2.0", + "gpx-parse": "^0.10.4", + "hammerjs": "^2.0.8", + "jquery": "^3.7.1", + "leaflet-makimarkers": "^3.1.0", + "leaflet-rotatedmarker": "^0.2.0", + "page": "^1.11.6" + }, + "devDependencies": { + "cordova-android": "^13.0.0", + "cordova-background-geolocation-lt": "^4.16.5", + "cordova-browser": "^7.0.0", + "cordova-plugin-android-permissions": "^1.1.5", + "cordova-plugin-background-fetch": "~7.2.4", + "cordova-plugin-camera": "^7.0.0", + "cordova-plugin-contacts": "^3.0.1", + "cordova-plugin-device": "^2.1.0", + "cordova-plugin-file": "^8.0.1", + "cordova-plugin-file-transfer": "^2.0.0", + "cordova-plugin-geolocation": "^5.0.0", + "cordova-plugin-insomnia": "^4.3.0", + "cordova-plugin-media-capture": "^5.0.0", + "cordova-plugin-network-information": "^3.0.0", + "cordova-plugin-screen-orientation": "^3.0.4", + "cordova-plugin-splashscreen": "^6.0.1", + "cordova-sqlite-storage": "^6.1.0", + "cordova.plugins.diagnostic": "github:dpa99c/cordova-diagnostic-plugin", + "es6-promise-plugin": "^4.2.2" + } + }, + "node_modules/@netflix/nerror": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@netflix/nerror/-/nerror-1.1.3.tgz", + "integrity": "sha512-b+MGNyP9/LXkapreJzNUzcvuzZslj/RGgdVVJ16P2wSlYatfLycPObImqVJSmNAdyeShvNeM/pl3sVZsObFueg==", + "dev": true, + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0", + "extsprintf": "^1.4.0", + "lodash": "^4.17.15" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "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.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@terraformer/arcgis": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@terraformer/arcgis/-/arcgis-2.1.2.tgz", + "integrity": "sha512-IvdfqehcNAUtKU1OFMKwPT8EvdKlVFZ7q7ZKzkIF8XzYZIVsZLuXuOS1UBdRh5u/o+X5Gax7jiZhD8U/4TV+Jw==", + "license": "MIT", + "dependencies": { + "@terraformer/common": "^2.1.2" + } + }, + "node_modules/@terraformer/common": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@terraformer/common/-/common-2.1.2.tgz", + "integrity": "sha512-cwPdTFzIpekZhZRrgDEkqLKNPoqbyCBQHiemaovnGIeUx0Pl336MY/eCxzJ5zXkrQLVo9zPalq/vYW5HnyKevQ==", + "license": "MIT" + }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", + "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/abbrev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/android-versions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/android-versions/-/android-versions-2.0.0.tgz", + "integrity": "sha512-07fhKL8EjV+ORQggGHcKmhLECwxBlRFimfvsjhfUCYqNDAbcH4qaEaN0AO3DnWtgHqRNfWAxhnWOpx+ZpRMymw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.2" + } + }, + "node_modules/ansi": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz", + "integrity": "sha512-iFY7JCgHbepc0b82yLaw4IMortylNb6wG4kL+4R0C3iv6i+RHGHux/yUX5BTiRvSX/shMnngjR1YyNMnXEFh5A==", + "dev": true, + "license": "MIT" + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", + "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/big-integer": { + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", + "dev": true, + "license": "Unlicense", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "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.2", + "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.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/bootstrap": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.3.tgz", + "integrity": "sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "license": "MIT", + "peerDependencies": { + "@popperjs/core": "^2.11.8" + } + }, + "node_modules/bootstrap-icons": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/bootstrap-icons/-/bootstrap-icons-1.11.3.tgz", + "integrity": "sha512-+3lpHrCw/it2/7lBL15VR0HEumaBss0+f/Lb6ZvHISn1mlK83jjFpooTLsMWbIjJMDjDjOExMsTxnXSIT4k4ww==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "license": "MIT" + }, + "node_modules/bplist-parser": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", + "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "big-integer": "1.6.x" + }, + "engines": { + "node": ">= 5.10.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "license": "MIT", + "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/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cordova-android": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/cordova-android/-/cordova-android-13.0.0.tgz", + "integrity": "sha512-uQG+cSyrB1NMi2aIzihldIupHB9WGpZVvrMMMAAtnyc6tDlEk7gweSSaFsEONyGAnteRYpIvrzg/YwDW08PcUg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "android-versions": "^2.0.0", + "cordova-common": "^5.0.0", + "dedent": "^1.5.3", + "execa": "^5.1.1", + "fast-glob": "^3.3.2", + "fs-extra": "^11.2.0", + "is-path-inside": "^3.0.3", + "nopt": "^7.2.1", + "properties-parser": "^0.6.0", + "semver": "^7.6.2", + "string-argv": "^0.3.1", + "untildify": "^4.0.0", + "which": "^4.0.0" + }, + "engines": { + "node": ">=16.13.0" + } + }, + "node_modules/cordova-background-geolocation-lt": { + "version": "4.16.5", + "resolved": "https://registry.npmjs.org/cordova-background-geolocation-lt/-/cordova-background-geolocation-lt-4.16.5.tgz", + "integrity": "sha512-XKDyP3nY2QodVwK3xdP6U/tgjvMuk1WymPFv9pdfrwHLQ//wTG2p3/OlxL9jD37PvnYCfHjL1ba+eKd6BIB4/g==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "cordovaDependencies": { + "<2.9.0": { + "cordova": ">=6.4.0", + "cordova-android": ">=6.0.0", + "cordova-ios": ">=4.3.0" + }, + "2.12.0": { + "cordova": ">=7.1.0", + "cordova-android": ">=7.0.0", + "cordova-ios": ">=4.4.0" + }, + "2.9.0": { + "cordova": ">=7.1.0", + "cordova-android": ">=6.3.0", + "cordova-ios": ">=4.4.0" + } + } + } + }, + "node_modules/cordova-browser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cordova-browser/-/cordova-browser-7.0.0.tgz", + "integrity": "sha512-gNrjlIdtZYaQInPisTpcUdtTSSaYOApa2ew6ALXT9r8ZdsczTAlJigbVzRpOm/EP1HQw6gnMkeQhFZS9RN6nJg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "cordova-common": "^5.0.0", + "cordova-serve": "^4.0.1", + "nopt": "^7.1.0", + "shelljs": "^0.8.5" + }, + "bin": { + "cordova-browser": "bin/create" + }, + "engines": { + "node": ">=16.13.0" + } + }, + "node_modules/cordova-common": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cordova-common/-/cordova-common-5.0.0.tgz", + "integrity": "sha512-6Aa7o52/iEvsKx6K94ijzFel5acCULR49KL27OUVhEpJ4oS7Dc3y2eOP1Eu0P4Wmiw/eLEDQjGXGiAa2D5zFZA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@netflix/nerror": "^1.1.3", + "ansi": "^0.3.1", + "bplist-parser": "^0.3.2", + "cross-spawn": "^7.0.3", + "elementtree": "^0.1.7", + "endent": "^2.1.0", + "fast-glob": "^3.2.12", + "fs-extra": "^11.1.0", + "glob": "^7.1.6", + "lodash.assign": "^4.2.0", + "lodash.isdate": "^4.0.1", + "lodash.isobject": "^3.0.2", + "lodash.zip": "^4.2.0", + "plist": "^3.0.6", + "q": "^1.5.1", + "read-chunk": "^3.2.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/cordova-plugin-android-permissions": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/cordova-plugin-android-permissions/-/cordova-plugin-android-permissions-1.1.5.tgz", + "integrity": "sha512-oTTV9cCMBqXTCmU+nYRebsP2IQfrtdvl2vYXHjoJgv5NHCIDgY4KFg6kJTcwXQOiymeGXuw0+MTvJJOueAdleA==", + "dev": true, + "engines": [ + { + "name": "cordova", + "version": ">=5.0.0" + } + ], + "license": "Apache 2.0" + }, + "node_modules/cordova-plugin-background-fetch": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/cordova-plugin-background-fetch/-/cordova-plugin-background-fetch-7.2.4.tgz", + "integrity": "sha512-fyjEHWPS+PyfghumNoyvkWuZOr6n932QXgyuo71sGP7f24HZISOSG3WLVna2Wv0MsJHB4oor5UPd+JzFWS6Kzw==", + "dev": true, + "license": "MIT", + "engines": { + "cordovaDependencies": { + "<5.4.0": { + "cordova": ">=6.4.0", + "cordova-android": ">=6.0.0", + "cordova-ios": ">=4.3.0" + }, + "5.4.0": { + "cordova": ">=7.1.0", + "cordova-android": ">=7.0.0", + "cordova-ios": ">=4.4.0" + } + } + } + }, + "node_modules/cordova-plugin-camera": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cordova-plugin-camera/-/cordova-plugin-camera-7.0.0.tgz", + "integrity": "sha512-OVQWZTBb18Y6e5c+bbXt3E4Z1yGnYqaywh2h5vVr/+nxMcdMIE+lm527bRK5vLN/RUqhGYP/Z+5n+O7Fk7fVNw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "cordovaDependencies": { + "3.0.0": { + "cordova-android": ">=6.3.0" + }, + "4.1.0": { + "cordova": ">=7.1.0", + "cordova-android": ">=6.3.0" + }, + "5.0.0": { + "cordova": ">=9.0.0", + "cordova-android": ">=9.0.0", + "cordova-ios": ">=5.1.0" + }, + "5.0.4-dev": { + "cordova": ">=9.0.0", + "cordova-android": "<10.0.0", + "cordova-ios": ">=5.1.0" + }, + "6.0.0": { + "cordova": ">=9.0.0", + "cordova-android": ">=10.0.0", + "cordova-ios": ">=5.1.0" + }, + "7.0.0": { + "cordova": ">=9.0.0", + "cordova-android": ">=12.0.0", + "cordova-ios": ">=5.1.0" + }, + "8.0.0": { + "cordova": ">100" + } + } + } + }, + "node_modules/cordova-plugin-contacts": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cordova-plugin-contacts/-/cordova-plugin-contacts-3.0.1.tgz", + "integrity": "sha512-gAzt6rmiOTzTYGu+hyjVB5L/pYrHnLZUDaMQB6GC3uuLQZFqeZaGiRPgxCphFzfzKQ0Fi/J0/9+7tFB0DRq4yg==", + "deprecated": "This plugin has been deprecated", + "dev": true, + "license": "Apache-2.0", + "engines": { + "cordovaDependencies": { + "3.0.0": { + "cordova-android": ">=6.3.0" + }, + "4.0.0": { + "cordova": ">100" + } + } + } + }, + "node_modules/cordova-plugin-device": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cordova-plugin-device/-/cordova-plugin-device-2.1.0.tgz", + "integrity": "sha512-FU0Lw1jZpuKOgG4v80LrfMAOIMCGfAVPumn7AwaX9S1iU/X3OPZUyoKUgP09q4bxL35IeNPkqNWVKYduAXZ1sg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "cordovaDependencies": { + "3.0.0": { + "cordova": ">100", + "cordova-electron": ">=3.0.0" + } + } + } + }, + "node_modules/cordova-plugin-file": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cordova-plugin-file/-/cordova-plugin-file-8.0.1.tgz", + "integrity": "sha512-LgFLNQN58xguoJkNc8eGBmg/Vuaah9lY3Nye27OAfWCKalXPRjExIg5r8L3qlfiJxzmzupjrF0M4KdU2Lovm3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "cordovaDependencies": { + "5.0.0": { + "cordova-android": ">=6.3.0" + }, + "7.0.0": { + "cordova-android": ">=10.0.0" + }, + "8.0.0": { + "cordova-android": ">=12.0.0" + }, + "9.0.0": { + "cordova": ">100" + } + } + } + }, + "node_modules/cordova-plugin-file-transfer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cordova-plugin-file-transfer/-/cordova-plugin-file-transfer-2.0.0.tgz", + "integrity": "sha512-PPFM4+Gf5TQ1ttln2CxdrxH9JOcHBAuho2NQzLuCtXsb9X8Ivypz3cjpSgrAlWHwnk6OPvwo9DJ4GU2FXkGsrQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "cordovaDependencies": { + "2.0.0": { + "cordova-android": ">=12.0.0" + }, + "3.0.0": { + "cordova": ">100" + } + } + } + }, + "node_modules/cordova-plugin-geolocation": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cordova-plugin-geolocation/-/cordova-plugin-geolocation-5.0.0.tgz", + "integrity": "sha512-eIk96pF59y3AK+NHeyA0si9eFhZElgOcFoGoTU9LDlnEYpfBN+V4ojRpKq3NMLCGTozew22/i9najFu9Kvb40g==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "cordovaDependencies": { + "3.0.0": { + "cordova-android": ">=6.3.0" + }, + "6.0.0": { + "cordova": ">100" + } + } + } + }, + "node_modules/cordova-plugin-insomnia": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/cordova-plugin-insomnia/-/cordova-plugin-insomnia-4.3.0.tgz", + "integrity": "sha512-MdlRFsyfmf6Q/8+npDeVSTo487eyrp7vbuGO3SPbnqR94DXmFRJWLbZGwf34dMeH6GQL45baxozUwhLTPxrQwg==", + "dev": true, + "engines": [ + { + "name": "cordova", + "version": ">=3.0.0" + } + ], + "license": "MIT" + }, + "node_modules/cordova-plugin-media-capture": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cordova-plugin-media-capture/-/cordova-plugin-media-capture-5.0.0.tgz", + "integrity": "sha512-eI8BNH3lHnWzdcpb+4Gy7mwHbN5fOKyoZfwRC1o7L/9kXiVF7S5aG5gvaga+CUSnrgsbrg4b8pSIfq70lRFrlw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "cordovaDependencies": { + "1.4.4": { + "cordova-ios": ">=4.0.0" + }, + "2.0.0": { + "cordova-android": ">=6.3.0" + }, + "4.0.0": { + "cordova-android": ">=10.0.0" + }, + "5.0.0": { + "cordova-android": ">=12.0.0" + }, + "6.0.0": { + "cordova": ">100" + } + } + } + }, + "node_modules/cordova-plugin-network-information": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cordova-plugin-network-information/-/cordova-plugin-network-information-3.0.0.tgz", + "integrity": "sha512-bBtP3PxIX8vshsfR0+F6co2e2cFLgjt18yKIdigzMwk6ANudWQ72RB3g2qMPyT6fBDWmUyE1Qd+bKQB/fZtQwQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "cordovaDependencies": { + "3.0.0": { + "cordova": ">=9" + }, + "4.0.0": { + "cordova": ">100" + } + } + } + }, + "node_modules/cordova-plugin-screen-orientation": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/cordova-plugin-screen-orientation/-/cordova-plugin-screen-orientation-3.0.4.tgz", + "integrity": "sha512-AswRuUKJ8J3HycUilTJsIB50aa9TLrwndPNBFG+wfAPhHEqIBF0HaD0q3HbAK7ypgmaj0cvbzk84qP51IcTfrQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "cordovaDependencies": { + "4.0.0": { + "cordova": ">100" + } + } + } + }, + "node_modules/cordova-plugin-splashscreen": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/cordova-plugin-splashscreen/-/cordova-plugin-splashscreen-6.0.1.tgz", + "integrity": "sha512-olJPBFRUuzunzeuB76TOBoq3yYlnhpWDk/S7ErR6MdqPz1KuK36omB9u4o//SdgfBbxHz+SsUtyvst68NrU3pA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "cordovaDependencies": { + ">=4.0.0": { + "cordova-android": ">=3.6.0", + "cordova-windows": ">=4.4.0" + }, + "2.0.0": { + "cordova-android": ">=3.6.0" + }, + "7.0.0": { + "cordova": ">100" + } + } + } + }, + "node_modules/cordova-serve": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cordova-serve/-/cordova-serve-4.0.1.tgz", + "integrity": "sha512-YbfXaZ60yr5dkqmDFQgrU7TSKnzCqYsxHgIUzDeX8RggZb6mz1F9jMfUBbaYyaU7JjcuJ0aoRPYLvwSGQVhGkw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "chalk": "^3.0.0", + "compression": "^1.7.4", + "express": "^4.17.1", + "open": "^7.0.3", + "which": "^2.0.2" + }, + "engines": { + "node": ">= 10", + "npm": ">= 5.6.0" + } + }, + "node_modules/cordova-serve/node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/cordova-serve/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cordova-sqlite-storage": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cordova-sqlite-storage/-/cordova-sqlite-storage-6.1.0.tgz", + "integrity": "sha512-ko/edy+u9MJVYrXdB6OXUklH0eIRWpa/Rvang7YkvQvsswc9vZr0pM/Ty6eX0MJtLOMJuCXIOiiHZZZbZSZikw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cordova-sqlite-storage-dependencies": "4.1.0" + } + }, + "node_modules/cordova-sqlite-storage-dependencies": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cordova-sqlite-storage-dependencies/-/cordova-sqlite-storage-dependencies-4.1.0.tgz", + "integrity": "sha512-D0ZXfNkS3z9GO+Ha2rC2odvOOMcx/moL8lpVDFxXqcsCEZbJimuki4wZfdrQrGlNd/d7r4DNodljRmO20v6Ntg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cordova.plugins.diagnostic": { + "version": "7.1.4", + "resolved": "git+ssh://git@github.com/dpa99c/cordova-diagnostic-plugin.git#8360f932e20bb3c29d9820c5563666bae2cef4bf", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "colors": "1.4.0", + "elementtree": "^0.1.6", + "minimist": "1.2.6" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-spawn/node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/dedent": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true, + "license": "MIT" + }, + "node_modules/elementtree": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/elementtree/-/elementtree-0.1.7.tgz", + "integrity": "sha512-wkgGT6kugeQk/P6VZ/f4T+4HB41BVgNBq5CDIZVbQ02nvTVqAiVTbskxxu3eA/X96lMlfYOwnLQpN2v5E1zDEg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "sax": "1.1.4" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/endent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/endent/-/endent-2.1.0.tgz", + "integrity": "sha512-r8VyPX7XL8U01Xgnb1CjZ3XV+z90cXIJ9JPE/R9SEC9vpw2P6CfsRPJmp20DppC5N7ZAMCmjYkJIa744Iyg96w==", + "dev": true, + "license": "MIT", + "dependencies": { + "dedent": "^0.7.0", + "fast-json-parse": "^1.0.3", + "objectorarray": "^1.0.5" + } + }, + "node_modules/endent/node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es6-promise-plugin": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/es6-promise-plugin/-/es6-promise-plugin-4.2.2.tgz", + "integrity": "sha512-uoA4aVplXI9oqUYJFBAVRwAqIN9/n9JgrTAUGX3qPbnSZVE5yY1+6/MsoN5f4xsaPO62WjPHOdtts6okMN6tNA==", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/esri-leaflet": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/esri-leaflet/-/esri-leaflet-3.0.12.tgz", + "integrity": "sha512-Yi7oH/mK4quOlCe920yuEYvUk0BjJRjmmE78ReAdJT5EbibW5wJoT9DtvG3JEJD22mQ0oF1LhcfL0Wb5jRhDAQ==", + "license": "Apache-2.0", + "dependencies": { + "@terraformer/arcgis": "^2.1.0", + "tiny-binary-search": "^1.0.3" + }, + "peerDependencies": { + "leaflet": "^1.0.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "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" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.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/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/extsprintf": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", + "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "license": "MIT", + "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-json-parse": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fast-json-parse/-/fast-json-parse-1.0.3.tgz", + "integrity": "sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-saver": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", + "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==", + "license": "MIT" + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "license": "MIT", + "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/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "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==", + "license": "MIT", + "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.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "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": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gpx-parse": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/gpx-parse/-/gpx-parse-0.10.4.tgz", + "integrity": "sha512-4PUA2Hzp4m5EjDEa4YB1CKWh5Cjm1cgJuDe+nL6B77DgtFuYR7VtvBbmvbwjx6M40iA96q2BaKyD8/lraez2xw==", + "license": "MIT", + "dependencies": { + "xml2js": "^0.4.4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/hammerjs": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", + "integrity": "sha512-tSQXBXS/MWQOn/RKckawJ61vvsDpCom87JgxiYdGwHdOa0ht0vzUWDlfioofFCRU0L+6NGDt6XzbgoJvZkMeRQ==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "license": "MIT", + "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/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/jquery": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", + "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==", + "license": "MIT" + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/leaflet": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz", + "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==", + "license": "BSD-2-Clause" + }, + "node_modules/leaflet-makimarkers": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leaflet-makimarkers/-/leaflet-makimarkers-3.1.0.tgz", + "integrity": "sha512-dsFFeG9xY1kj73UT+VwVoNLTWx97Shkr7/rK44C5pFCODVrMyVcBmtOe7pKpmyGDVmqvUyOrr134SMSaPeFaSQ==", + "license": "MIT", + "dependencies": { + "leaflet": ">=0.5.0" + } + }, + "node_modules/leaflet-rotatedmarker": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/leaflet-rotatedmarker/-/leaflet-rotatedmarker-0.2.0.tgz", + "integrity": "sha512-yc97gxLXwbZa+Gk9VCcqI0CkvIBC9oNTTjFsHqq4EQvANrvaboib4UdeQLyTnEqDpaXHCqzwwVIDHtvz2mUiDg==", + "license": "MIT" + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isdate": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isdate/-/lodash.isdate-4.0.1.tgz", + "integrity": "sha512-hg5B1GD+R9egsBgMwmAhk+V53Us03TVvXT4dnyKugEfsD4QKuG9Wlyvxq8OGy2nu7qVGsh4DRSnMk33hoWBq/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isobject": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz", + "integrity": "sha512-3/Qptq2vr7WeJbB4KHUSKlq8Pl7ASXi3UG6CMbBm8WRtXi8+GHm7mKaU3urfpSEzWe2wCIChs6/sdocUsTKJiA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.zip": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", + "integrity": "sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==", + "dev": true, + "license": "MIT" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nopt": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", + "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/objectorarray": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/objectorarray/-/objectorarray-1.0.5.tgz", + "integrity": "sha512-eJJDYkhJFFbBBAxeh8xW+weHlkI28n2ZdQV/J/DNfWfSKlGEf2xcfAbZTv3riEXHAhL9SVOTs2pRmXiSTf78xg==", + "dev": true, + "license": "ISC" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/page": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/page/-/page-1.11.6.tgz", + "integrity": "sha512-P6e2JfzkBrPeFCIPplLP7vDDiU84RUUZMrWdsH4ZBGJ8OosnwFkcUkBHp1DTIjuipLliw9yQn/ZJsXZvarsO+g==", + "license": "MIT", + "dependencies": { + "path-to-regexp": "~1.2.1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.2.1.tgz", + "integrity": "sha512-DBw9IhWfevR2zCVwEZURTuQNseCvu/Q9f5ZgqMCK0Rh61bDa4uyjPAOy9b55yKiPT59zZn+7uYKxmWwsguInwg==", + "license": "MIT", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/plist": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/properties-parser": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/properties-parser/-/properties-parser-0.6.0.tgz", + "integrity": "sha512-qvr2cSmoA0dln0MARAKwBzPkkXn7FqwX+RVVNpMdMJc7rt9mqO2cXwluxtux9fHrLhjnPFaQkS8BM0kFrTCnSw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.3.1" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "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==", + "license": "MIT" + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, + "license": "MIT", + "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.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/read-chunk": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-3.2.0.tgz", + "integrity": "sha512-CEjy9LCzhmD7nUpJ1oVOE6s/hBkejlcJEgLQHVnQznOSilOPb+kpKktlLfFDK3/WP43+F80xkUTM2VOkYoSYvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^4.0.1", + "with-open-file": "^0.1.6" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.1.4.tgz", + "integrity": "sha512-5f3k2PbGGp+YtKJjOItpg3P99IMD84E4HOvcfleTb5joCHNXYLsR9yWFPOYGgaeMPDubQILTCMdsFb2OMeOjtg==", + "license": "ISC" + }, + "node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "license": "MIT", + "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/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "license": "MIT", + "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/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true, + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tiny-binary-search": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-binary-search/-/tiny-binary-search-1.0.3.tgz", + "integrity": "sha512-STSHX/L5nI9WTLv6wrzJbAPbO7OIISX83KFBh2GVbX1Uz/vgZOU/ANn/8iV6t35yMTpoPzzO+3OQid3mifE0CA==", + "license": "Apache-2.0" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/with-open-file": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/with-open-file/-/with-open-file-0.1.7.tgz", + "integrity": "sha512-ecJS2/oHtESJ1t3ZfMI3B7KIDKyfN0O16miWxdn30zdh66Yd3LsRFebXZXq6GU4xfxLf6nVxp9kIqElb5fqczA==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-finally": "^1.0.0", + "p-try": "^2.1.0", + "pify": "^4.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xml2js/node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..67558ef --- /dev/null +++ b/package.json @@ -0,0 +1,83 @@ +{ + "name": "ru.fcpsr.trailtracker", + "displayName": "TrailTracker", + "version": "1.0.0", + "description": "A sample Apache Cordova application that responds to the deviceready event.", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [ + "ecosystem:cordova" + ], + "author": "Apache Cordova Team", + "license": "Apache-2.0", + "devDependencies": { + "cordova-android": "^13.0.0", + "cordova-background-geolocation-lt": "^4.16.5", + "cordova-browser": "^7.0.0", + "cordova-plugin-android-permissions": "^1.1.5", + "cordova-plugin-background-fetch": "~7.2.4", + "cordova-plugin-camera": "^7.0.0", + "cordova-plugin-contacts": "^3.0.1", + "cordova-plugin-device": "^2.1.0", + "cordova-plugin-file": "^8.0.1", + "cordova-plugin-file-transfer": "^2.0.0", + "cordova-plugin-geolocation": "^5.0.0", + "cordova-plugin-insomnia": "^4.3.0", + "cordova-plugin-media-capture": "^5.0.0", + "cordova-plugin-network-information": "^3.0.0", + "cordova-plugin-screen-orientation": "^3.0.4", + "cordova-plugin-splashscreen": "^6.0.1", + "cordova-sqlite-storage": "^6.1.0", + "cordova.plugins.diagnostic": "github:dpa99c/cordova-diagnostic-plugin", + "es6-promise-plugin": "^4.2.2" + }, + "cordova": { + "platforms": [ + "browser", + "android" + ], + "plugins": { + "cordova-plugin-geolocation": { + "GPS_REQUIRED": "true" + }, + "cordova-plugin-network-information": {}, + "cordova-plugin-camera": {}, + "cordova-plugin-media-capture": {}, + "cordova-plugin-contacts": {}, + "cordova-plugin-file": {}, + "cordova.plugins.diagnostic": { + "ANDROIDX_VERSION": "1.0.0", + "ANDROIDX_APPCOMPAT_VERSION": "1.3.1" + }, + "cordova-plugin-android-permissions": {}, + "cordova-plugin-device": {}, + "cordova-plugin-insomnia": {}, + "cordova-plugin-file-transfer": {}, + "cordova-plugin-splashscreen": {}, + "cordova-plugin-screen-orientation": {}, + "cordova-sqlite-storage": {}, + "cordova-background-geolocation-lt": { + "GOOGLE_API_VERSION": "20.+", + "HMS_LOCATION_VERSION": "6.9.0.300", + "OKHTTP_VERSION": "3.12.+", + "EVENTBUS_VERSION": "3.3.1" + } + } + }, + "dependencies": { + "axios": "^1.7.2", + "bootstrap": "^5.3.3", + "bootstrap-icons": "^1.11.3", + "esri-leaflet": "^3.0.12", + "file-saver": "^2.0.5", + "fs-extra": "^11.2.0", + "gpx-parse": "^0.10.4", + "hammerjs": "^2.0.8", + "jquery": "^3.7.1", + "leaflet-makimarkers": "^3.1.0", + "leaflet-rotatedmarker": "^0.2.0", + "page": "^1.11.6" + } +} \ No newline at end of file diff --git a/src/index.html b/src/index.html deleted file mode 100644 index fa7547e..0000000 --- a/src/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - Example HTML5 site final - - - - - - diff --git a/www/borders/налычево.gpx b/www/borders/налычево.gpx new file mode 100644 index 0000000..3bd0688 --- /dev/null +++ b/www/borders/налычево.gpx @@ -0,0 +1,12 @@ + +Filtered OSM data converted to GPX by overpass turboПриродный парк «Налычево»boundary=national_park +leisure=nature_reserve +name=Природный парк «Налычево» +name:de=Naturpark Nalytschewo +name:en=Nalychevo Nature Park +name:es=Parque Natural de Nalytchevo +name:fr=Parc naturel de Nalytchevo +name:nl=Natuurpark Nalytsjevo +name:ru=Природный парк «Налычево» +name:uk=Природний парк «Наличево» +type=multipolygon \ No newline at end of file diff --git a/www/css/fonts.css b/www/css/fonts.css new file mode 100644 index 0000000..945e128 --- /dev/null +++ b/www/css/fonts.css @@ -0,0 +1,405 @@ +@font-face { + font-family: 'Roboto'; + src: url('../fonts/Roboto-BlackItalic.eot'); + src: local('Roboto Black Italic'), local('Roboto-BlackItalic'), + url('../fonts/Roboto-BlackItalic.eot?#iefix') format('embedded-opentype'), + url('../fonts/Roboto-BlackItalic.woff2') format('woff2'), + url('../fonts/Roboto-BlackItalic.woff') format('woff'), + url('../fonts/Roboto-BlackItalic.ttf') format('truetype'); + font-weight: 900; + font-style: italic; +} + +@font-face { + font-family: 'Roboto'; + src: url('../fonts/Roboto-Bold.eot'); + src: local('Roboto Bold'), local('Roboto-Bold'), + url('../fonts/Roboto-Bold.eot?#iefix') format('embedded-opentype'), + url('../fonts/Roboto-Bold.woff2') format('woff2'), + url('../fonts/Roboto-Bold.woff') format('woff'), + url('../fonts/Roboto-Bold.ttf') format('truetype'); + font-weight: bold; + font-style: normal; +} + +@font-face { + font-family: 'Roboto'; + src: url('../fonts/Roboto-BoldItalic.eot'); + src: local('Roboto Bold Italic'), local('Roboto-BoldItalic'), + url('../fonts/Roboto-BoldItalic.eot?#iefix') format('embedded-opentype'), + url('../fonts/Roboto-BoldItalic.woff2') format('woff2'), + url('../fonts/Roboto-BoldItalic.woff') format('woff'), + url('../fonts/Roboto-BoldItalic.ttf') format('truetype'); + font-weight: bold; + font-style: italic; +} + +@font-face { + font-family: 'Roboto'; + src: url('../fonts/Roboto-LightItalic.eot'); + src: local('Roboto Light Italic'), local('Roboto-LightItalic'), + url('../fonts/Roboto-LightItalic.eot?#iefix') format('embedded-opentype'), + url('../fonts/Roboto-LightItalic.woff2') format('woff2'), + url('../fonts/Roboto-LightItalic.woff') format('woff'), + url('../fonts/Roboto-LightItalic.ttf') format('truetype'); + font-weight: 300; + font-style: italic; +} + +@font-face { + font-family: 'Roboto'; + src: url('../fonts/Roboto-Regular.eot'); + src: local('Roboto'), local('Roboto-Regular'), + url('../fonts/Roboto-Regular.eot?#iefix') format('embedded-opentype'), + url('../fonts/Roboto-Regular.woff2') format('woff2'), + url('../fonts/Roboto-Regular.woff') format('woff'), + url('../fonts/Roboto-Regular.ttf') format('truetype'); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Roboto'; + src: url('../fonts/Roboto-ThinItalic.eot'); + src: local('Roboto Thin Italic'), local('Roboto-ThinItalic'), + url('../fonts/Roboto-ThinItalic.eot?#iefix') format('embedded-opentype'), + url('../fonts/Roboto-ThinItalic.woff2') format('woff2'), + url('../fonts/Roboto-ThinItalic.woff') format('woff'), + url('../fonts/Roboto-ThinItalic.ttf') format('truetype'); + font-weight: 100; + font-style: italic; +} + +@font-face { + font-family: 'Roboto'; + src: url('../fonts/Roboto-Black.eot'); + src: local('Roboto Black'), local('Roboto-Black'), + url('../fonts/Roboto-Black.eot?#iefix') format('embedded-opentype'), + url('../fonts/Roboto-Black.woff2') format('woff2'), + url('../fonts/Roboto-Black.woff') format('woff'), + url('../fonts/Roboto-Black.ttf') format('truetype'); + font-weight: 900; + font-style: normal; +} + +@font-face { + font-family: 'Roboto'; + src: url('../fonts/Roboto-MediumItalic.eot'); + src: local('Roboto Medium Italic'), local('Roboto-MediumItalic'), + url('../fonts/Roboto-MediumItalic.eot?#iefix') format('embedded-opentype'), + url('../fonts/Roboto-MediumItalic.woff2') format('woff2'), + url('../fonts/Roboto-MediumItalic.woff') format('woff'), + url('../fonts/Roboto-MediumItalic.ttf') format('truetype'); + font-weight: 500; + font-style: italic; +} + +@font-face { + font-family: 'Roboto'; + src: url('../fonts/Roboto-Thin.eot'); + src: local('Roboto Thin'), local('Roboto-Thin'), + url('../fonts/Roboto-Thin.eot?#iefix') format('embedded-opentype'), + url('../fonts/Roboto-Thin.woff2') format('woff2'), + url('../fonts/Roboto-Thin.woff') format('woff'), + url('../fonts/Roboto-Thin.ttf') format('truetype'); + font-weight: 100; + font-style: normal; +} + +@font-face { + font-family: 'Roboto'; + src: url('../fonts/Roboto-Light.eot'); + src: local('Roboto Light'), local('Roboto-Light'), + url('../fonts/Roboto-Light.eot?#iefix') format('embedded-opentype'), + url('../fonts/Roboto-Light.woff2') format('woff2'), + url('../fonts/Roboto-Light.woff') format('woff'), + url('../fonts/Roboto-Light.ttf') format('truetype'); + font-weight: 300; + font-style: normal; +} + +@font-face { + font-family: 'Roboto'; + src: url('../fonts/Roboto-Italic.eot'); + src: local('Roboto Italic'), local('Roboto-Italic'), + url('../fonts/Roboto-Italic.eot?#iefix') format('embedded-opentype'), + url('../fonts/Roboto-Italic.woff2') format('woff2'), + url('../fonts/Roboto-Italic.woff') format('woff'), + url('../fonts/Roboto-Italic.ttf') format('truetype'); + font-weight: normal; + font-style: italic; +} + +@font-face { + font-family: 'Roboto'; + src: url('../fonts/Roboto-Medium.eot'); + src: local('Roboto Medium'), local('Roboto-Medium'), + url('../fonts/Roboto-Medium.eot?#iefix') format('embedded-opentype'), + url('../fonts/Roboto-Medium.woff2') format('woff2'), + url('../fonts/Roboto-Medium.woff') format('woff'), + url('../fonts/Roboto-Medium.ttf') format('truetype'); + font-weight: 500; + font-style: normal; +} + +@font-face { + font-family: 'Futura PT'; + src: url('../fonts/FuturaPT-Bold.eot'); + src: local('Futura PT Bold'), local('FuturaPT-Bold'), + url('../fonts/FuturaPT-Bold.eot?#iefix') format('embedded-opentype'), + url('../fonts/FuturaPT-Bold.woff2') format('woff2'), + url('../fonts/FuturaPT-Bold.woff') format('woff'), + url('../fonts/FuturaPT-Bold.ttf') format('truetype'); + font-weight: bold; + font-style: normal; +} + +@font-face { + font-family: "Futura PT"; + src: local("../fonts/Futura PT Heavy"), + local("FuturaPT-Heavy"), + url('../fonts/FuturaPT-Heavy.woff2') format("woff2"), + url('../fonts/FuturaPT-Heavy.woff') format("woff"); + font-weight: 900; + font-style: normal; +} + +@font-face { + font-family: 'Futura PT Demi'; + src: url('../fonts/FuturaPT-DemiObl.eot'); + src: local('Futura PT Demi Oblique'), local('FuturaPT-DemiObl'), + url('../fonts/FuturaPT-DemiObl.eot?#iefix') format('embedded-opentype'), + url('../fonts/FuturaPT-DemiObl.woff2') format('woff2'), + url('../fonts/FuturaPT-DemiObl.woff') format('woff'), + url('../fonts/FuturaPT-DemiObl.ttf') format('truetype'); + font-weight: 600; + font-style: italic; +} + +@font-face { + font-family: 'Futura PT Cond Extra'; + src: url('../fonts/FuturaPTCond-ExtraBoldObl.eot'); + src: local('Futura PT Cond Extra Bold Oblique'), local('FuturaPTCond-ExtraBoldObl'), + url('../fonts/FuturaPTCond-ExtraBoldObl.eot?#iefix') format('embedded-opentype'), + url('../fonts/FuturaPTCond-ExtraBoldObl.woff2') format('woff2'), + url('../fonts/FuturaPTCond-ExtraBoldObl.woff') format('woff'), + url('../fonts/FuturaPTCond-ExtraBoldObl.ttf') format('truetype'); + font-weight: 800; + font-style: italic; +} + +@font-face { + font-family: 'Futura PT Cond Book'; + src: url('../fonts/FuturaPTCond-Book.eot'); + src: local('Futura PT Cond Book'), local('FuturaPTCond-Book'), + url('../fonts/FuturaPTCond-Book.eot?#iefix') format('embedded-opentype'), + url('../fonts/FuturaPTCond-Book.woff2') format('woff2'), + url('../fonts/FuturaPTCond-Book.woff') format('woff'), + url('../fonts/FuturaPTCond-Book.ttf') format('truetype'); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Futura PT'; + src: url('../fonts/FuturaPT-LightObl.eot'); + src: local('Futura PT Light Oblique'), local('FuturaPT-LightObl'), + url('../fonts/FuturaPT-LightObl.eot?#iefix') format('embedded-opentype'), + url('../fonts/FuturaPT-LightObl.woff2') format('woff2'), + url('../fonts/FuturaPT-LightObl.woff') format('woff'), + url('../fonts/FuturaPT-LightObl.ttf') format('truetype'); + font-weight: 300; + font-style: italic; +} + +@font-face { + font-family: 'Futura PT Book'; + src: url('../fonts/FuturaPT-BookObl.eot'); + src: local('Futura PT Book Oblique'), local('FuturaPT-BookObl'), + url('../fonts/FuturaPT-BookObl.eot?#iefix') format('embedded-opentype'), + url('../fonts/FuturaPT-BookObl.woff2') format('woff2'), + url('../fonts/FuturaPT-BookObl.woff') format('woff'), + url('../fonts/FuturaPT-BookObl.ttf') format('truetype'); + font-weight: normal; + font-style: italic; +} + +@font-face { + font-family: 'Futura PT'; + src: url('../fonts/FuturaPT-HeavyObl.eot'); + src: local('Futura PT Heavy Oblique'), local('FuturaPT-HeavyObl'), + url('../fonts/FuturaPT-HeavyObl.eot?#iefix') format('embedded-opentype'), + url('../fonts/FuturaPT-HeavyObl.woff2') format('woff2'), + url('../fonts/FuturaPT-HeavyObl.woff') format('woff'), + url('../fonts/FuturaPT-HeavyObl.ttf') format('truetype'); + font-weight: 900; + font-style: italic; +} + +@font-face { + font-family: 'Futura PT Cond'; + src: url('../fonts/FuturaPTCond-BoldObl.eot'); + src: local('Futura PT Cond Bold Oblique'), local('FuturaPTCond-BoldObl'), + url('../fonts/FuturaPTCond-BoldObl.eot?#iefix') format('embedded-opentype'), + url('../fonts/FuturaPTCond-BoldObl.woff2') format('woff2'), + url('../fonts/FuturaPTCond-BoldObl.woff') format('woff'), + url('../fonts/FuturaPTCond-BoldObl.ttf') format('truetype'); + font-weight: bold; + font-style: italic; +} + +@font-face { + font-family: 'Futura PT Demi'; + src: url('../fonts/FuturaPT-Demi.eot'); + src: local('Futura PT Demi'), local('FuturaPT-Demi'), + url('../fonts/FuturaPT-Demi.eot?#iefix') format('embedded-opentype'), + url('../fonts/FuturaPT-Demi.woff2') format('woff2'), + url('../fonts/FuturaPT-Demi.woff') format('woff'), + url('../fonts/FuturaPT-Demi.ttf') format('truetype'); + font-weight: 600; + font-style: normal; +} + +@font-face { + font-family: 'Futura PT Cond Book'; + src: url('../fonts/FuturaPTCond-BookObl.eot'); + src: local('Futura PT Cond Book Oblique'), local('FuturaPTCond-BookObl'), + url('../fonts/FuturaPTCond-BookObl.eot?#iefix') format('embedded-opentype'), + url('../fonts/FuturaPTCond-BookObl.woff2') format('woff2'), + url('../fonts/FuturaPTCond-BookObl.woff') format('woff'), + url('../fonts/FuturaPTCond-BookObl.ttf') format('truetype'); + font-weight: normal; + font-style: italic; +} + +@font-face { + font-family: 'Futura PT Extra'; + src: url('../fonts/FuturaPT-ExtraBold.eot'); + src: local('Futura PT Extra Bold'), local('FuturaPT-ExtraBold'), + url('../fonts/FuturaPT-ExtraBold.eot?#iefix') format('embedded-opentype'), + url('../fonts/FuturaPT-ExtraBold.woff2') format('woff2'), + url('../fonts/FuturaPT-ExtraBold.woff') format('woff'), + url('../fonts/FuturaPT-ExtraBold.ttf') format('truetype'); + font-weight: 800; + font-style: normal; +} + +@font-face { + font-family: 'Futura PT Cond'; + src: url('../fonts/FuturaPTCond-Medium.eot'); + src: local('Futura PT Cond Medium'), local('FuturaPTCond-Medium'), + url('../fonts/FuturaPTCond-Medium.eot?#iefix') format('embedded-opentype'), + url('../fonts/FuturaPTCond-Medium.woff2') format('woff2'), + url('../fonts/FuturaPTCond-Medium.woff') format('woff'), + url('../fonts/FuturaPTCond-Medium.ttf') format('truetype'); + font-weight: 500; + font-style: normal; +} + +@font-face { + font-family: 'Futura PT'; + src: url('../fonts/FuturaPT-Medium.eot'); + src: local('Futura PT Medium'), local('FuturaPT-Medium'), + url('../fonts/FuturaPT-Medium.eot?#iefix') format('embedded-opentype'), + url('../fonts/FuturaPT-Medium.woff2') format('woff2'), + url('../fonts/FuturaPT-Medium.woff') format('woff'), + url('../fonts/FuturaPT-Medium.ttf') format('truetype'); + font-weight: 500; + font-style: normal; +} + +@font-face { + font-family: 'Futura PT Cond Extra'; + src: url('../fonts/FuturaPTCond-ExtraBold.eot'); + src: local('Futura PT Cond Extra Bold'), local('FuturaPTCond-ExtraBold'), + url('../fonts/FuturaPTCond-ExtraBold.eot?#iefix') format('embedded-opentype'), + url('../fonts/FuturaPTCond-ExtraBold.woff2') format('woff2'), + url('../fonts/FuturaPTCond-ExtraBold.woff') format('woff'), + url('../fonts/FuturaPTCond-ExtraBold.ttf') format('truetype'); + font-weight: 800; + font-style: normal; +} + +@font-face { + font-family: 'Futura PT'; + src: url('../fonts/FuturaPT-MediumObl.eot'); + src: local('Futura PT Medium Oblique'), local('FuturaPT-MediumObl'), + url('../fonts/FuturaPT-MediumObl.eot?#iefix') format('embedded-opentype'), + url('../fonts/FuturaPT-MediumObl.woff2') format('woff2'), + url('../fonts/FuturaPT-MediumObl.woff') format('woff'), + url('../fonts/FuturaPT-MediumObl.ttf') format('truetype'); + font-weight: 500; + font-style: italic; +} + +@font-face { + font-family: 'Futura PT Cond'; + src: url('../fonts/FuturaPTCond-Bold.eot'); + src: local('Futura PT Cond Bold'), local('FuturaPTCond-Bold'), + url('../fonts/FuturaPTCond-Bold.eot?#iefix') format('embedded-opentype'), + url('../fonts/FuturaPTCond-Bold.woff2') format('woff2'), + url('../fonts/FuturaPTCond-Bold.woff') format('woff'), + url('../fonts/FuturaPTCond-Bold.ttf') format('truetype'); + font-weight: bold; + font-style: normal; +} + +@font-face { + font-family: 'Futura PT'; + src: url('../fonts/FuturaPT-BoldObl.eot'); + src: local('Futura PT Bold Oblique'), local('FuturaPT-BoldObl'), + url('../fonts/FuturaPT-BoldObl.eot?#iefix') format('embedded-opentype'), + url('../fonts/FuturaPT-BoldObl.woff2') format('woff2'), + url('../fonts/FuturaPT-BoldObl.woff') format('woff'), + url('../fonts/FuturaPT-BoldObl.ttf') format('truetype'); + font-weight: bold; + font-style: italic; +} + +@font-face { + font-family: 'Futura PT Book'; + src: url('../fonts/FuturaPT-Book.eot'); + src: local('Futura PT Book'), local('FuturaPT-Book'), + url('../fonts/FuturaPT-Book.eot?#iefix') format('embedded-opentype'), + url('../fonts/FuturaPT-Book.woff2') format('woff2'), + url('../fonts/FuturaPT-Book.woff') format('woff'), + url('../fonts/FuturaPT-Book.ttf') format('truetype'); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Futura PT'; + src: url('../fonts/FuturaPT-Light.eot'); + src: local('Futura PT Light'), local('FuturaPT-Light'), + url('../fonts/FuturaPT-Light.eot?#iefix') format('embedded-opentype'), + url('../fonts/FuturaPT-Light.woff2') format('woff2'), + url('../fonts/FuturaPT-Light.woff') format('woff'), + url('../fonts/FuturaPT-Light.ttf') format('truetype'); + font-weight: 300; + font-style: normal; +} + +@font-face { + font-family: 'Futura PT Cond'; + src: url('../fonts/FuturaPTCond-MediumObl.eot'); + src: local('Futura PT Cond Medium Oblique'), local('FuturaPTCond-MediumObl'), + url('../fonts/FuturaPTCond-MediumObl.eot?#iefix') format('embedded-opentype'), + url('../fonts/FuturaPTCond-MediumObl.woff2') format('woff2'), + url('../fonts/FuturaPTCond-MediumObl.woff') format('woff'), + url('../fonts/FuturaPTCond-MediumObl.ttf') format('truetype'); + font-weight: 500; + font-style: italic; +} + +@font-face { + font-family: 'Futura PT Extra'; + src: url('../fonts/FuturaPT-ExtraBoldObl.eot'); + src: local('Futura PT Extra Bold Oblique'), local('FuturaPT-ExtraBoldObl'), + url('../fonts/FuturaPT-ExtraBoldObl.eot?#iefix') format('embedded-opentype'), + url('../fonts/FuturaPT-ExtraBoldObl.woff2') format('woff2'), + url('../fonts/FuturaPT-ExtraBoldObl.woff') format('woff'), + url('../fonts/FuturaPT-ExtraBoldObl.ttf') format('truetype'); + font-weight: 800; + font-style: italic; +} \ No newline at end of file diff --git a/www/css/iconfont.css b/www/css/iconfont.css new file mode 100644 index 0000000..27e6d2c --- /dev/null +++ b/www/css/iconfont.css @@ -0,0 +1,568 @@ + +@font-face { + font-family: "feather"; + src: url('../fonts/feather.eot?t=1525787366991'); /* IE9*/ + src: url('../fonts/feather.eot?t=1525787366991#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('../fonts/feather.woff?t=1525787366991') format('woff'), /* chrome, firefox */ + url('../fonts/feather.ttf?t=1525787366991') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ + url('../fonts/feather.svg?t=1525787366991#feather') format('svg'); /* iOS 4.1- */ +} + +.feather { + /* use !important to prevent issues with browser extensions that change fonts */ + font-family: 'feather' !important; + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-alert-octagon:before { content: "\e81b"; } + +.icon-alert-circle:before { content: "\e81c"; } + +.icon-activity:before { content: "\e81d"; } + +.icon-alert-triangle:before { content: "\e81e"; } + +.icon-align-center:before { content: "\e81f"; } + +.icon-airplay:before { content: "\e820"; } + +.icon-align-justify:before { content: "\e821"; } + +.icon-align-left:before { content: "\e822"; } + +.icon-align-right:before { content: "\e823"; } + +.icon-arrow-down-left:before { content: "\e824"; } + +.icon-arrow-down-right:before { content: "\e825"; } + +.icon-anchor:before { content: "\e826"; } + +.icon-aperture:before { content: "\e827"; } + +.icon-arrow-left:before { content: "\e828"; } + +.icon-arrow-right:before { content: "\e829"; } + +.icon-arrow-down:before { content: "\e82a"; } + +.icon-arrow-up-left:before { content: "\e82b"; } + +.icon-arrow-up-right:before { content: "\e82c"; } + +.icon-arrow-up:before { content: "\e82d"; } + +.icon-award:before { content: "\e82e"; } + +.icon-bar-chart:before { content: "\e82f"; } + +.icon-at-sign:before { content: "\e830"; } + +.icon-bar-chart-2:before { content: "\e831"; } + +.icon-battery-charging:before { content: "\e832"; } + +.icon-bell-off:before { content: "\e833"; } + +.icon-battery:before { content: "\e834"; } + +.icon-bluetooth:before { content: "\e835"; } + +.icon-bell:before { content: "\e836"; } + +.icon-book:before { content: "\e837"; } + +.icon-briefcase:before { content: "\e838"; } + +.icon-camera-off:before { content: "\e839"; } + +.icon-calendar:before { content: "\e83a"; } + +.icon-bookmark:before { content: "\e83b"; } + +.icon-box:before { content: "\e83c"; } + +.icon-camera:before { content: "\e83d"; } + +.icon-check-circle:before { content: "\e83e"; } + +.icon-check:before { content: "\e83f"; } + +.icon-check-square:before { content: "\e840"; } + +.icon-cast:before { content: "\e841"; } + +.icon-chevron-down:before { content: "\e842"; } + +.icon-chevron-left:before { content: "\e843"; } + +.icon-chevron-right:before { content: "\e844"; } + +.icon-chevron-up:before { content: "\e845"; } + +.icon-chevrons-down:before { content: "\e846"; } + +.icon-chevrons-right:before { content: "\e847"; } + +.icon-chevrons-up:before { content: "\e848"; } + +.icon-chevrons-left:before { content: "\e849"; } + +.icon-circle:before { content: "\e84a"; } + +.icon-clipboard:before { content: "\e84b"; } + +.icon-chrome:before { content: "\e84c"; } + +.icon-clock:before { content: "\e84d"; } + +.icon-cloud-lightning:before { content: "\e84e"; } + +.icon-cloud-drizzle:before { content: "\e84f"; } + +.icon-cloud-rain:before { content: "\e850"; } + +.icon-cloud-off:before { content: "\e851"; } + +.icon-codepen:before { content: "\e852"; } + +.icon-cloud-snow:before { content: "\e853"; } + +.icon-compass:before { content: "\e854"; } + +.icon-copy:before { content: "\e855"; } + +.icon-corner-down-right:before { content: "\e856"; } + +.icon-corner-down-left:before { content: "\e857"; } + +.icon-corner-left-down:before { content: "\e858"; } + +.icon-corner-left-up:before { content: "\e859"; } + +.icon-corner-up-left:before { content: "\e85a"; } + +.icon-corner-up-right:before { content: "\e85b"; } + +.icon-corner-right-down:before { content: "\e85c"; } + +.icon-corner-right-up:before { content: "\e85d"; } + +.icon-cpu:before { content: "\e85e"; } + +.icon-credit-card:before { content: "\e85f"; } + +.icon-crosshair:before { content: "\e860"; } + +.icon-disc:before { content: "\e861"; } + +.icon-delete:before { content: "\e862"; } + +.icon-download-cloud:before { content: "\e863"; } + +.icon-download:before { content: "\e864"; } + +.icon-droplet:before { content: "\e865"; } + +.icon-edit-2:before { content: "\e866"; } + +.icon-edit:before { content: "\e867"; } + +.icon-edit-1:before { content: "\e868"; } + +.icon-external-link:before { content: "\e869"; } + +.icon-eye:before { content: "\e86a"; } + +.icon-feather:before { content: "\e86b"; } + +.icon-facebook:before { content: "\e86c"; } + +.icon-file-minus:before { content: "\e86d"; } + +.icon-eye-off:before { content: "\e86e"; } + +.icon-fast-forward:before { content: "\e86f"; } + +.icon-file-text:before { content: "\e870"; } + +.icon-film:before { content: "\e871"; } + +.icon-file:before { content: "\e872"; } + +.icon-file-plus:before { content: "\e873"; } + +.icon-folder:before { content: "\e874"; } + +.icon-filter:before { content: "\e875"; } + +.icon-flag:before { content: "\e876"; } + +.icon-globe:before { content: "\e877"; } + +.icon-grid:before { content: "\e878"; } + +.icon-heart:before { content: "\e879"; } + +.icon-home:before { content: "\e87a"; } + +.icon-github:before { content: "\e87b"; } + +.icon-image:before { content: "\e87c"; } + +.icon-inbox:before { content: "\e87d"; } + +.icon-layers:before { content: "\e87e"; } + +.icon-info:before { content: "\e87f"; } + +.icon-instagram:before { content: "\e880"; } + +.icon-layout:before { content: "\e881"; } + +.icon-link-2:before { content: "\e882"; } + +.icon-life-buoy:before { content: "\e883"; } + +.icon-link:before { content: "\e884"; } + +.icon-log-in:before { content: "\e885"; } + +.icon-list:before { content: "\e886"; } + +.icon-lock:before { content: "\e887"; } + +.icon-log-out:before { content: "\e888"; } + +.icon-loader:before { content: "\e889"; } + +.icon-mail:before { content: "\e88a"; } + +.icon-maximize-2:before { content: "\e88b"; } + +.icon-map:before { content: "\e88c"; } + +.icon-map-pin:before { content: "\e88e"; } + +.icon-menu:before { content: "\e88f"; } + +.icon-message-circle:before { content: "\e890"; } + +.icon-message-square:before { content: "\e891"; } + +.icon-minimize-2:before { content: "\e892"; } + +.icon-mic-off:before { content: "\e893"; } + +.icon-minus-circle:before { content: "\e894"; } + +.icon-mic:before { content: "\e895"; } + +.icon-minus-square:before { content: "\e896"; } + +.icon-minus:before { content: "\e897"; } + +.icon-moon:before { content: "\e898"; } + +.icon-monitor:before { content: "\e899"; } + +.icon-more-vertical:before { content: "\e89a"; } + +.icon-more-horizontal:before { content: "\e89b"; } + +.icon-move:before { content: "\e89c"; } + +.icon-music:before { content: "\e89d"; } + +.icon-navigation-2:before { content: "\e89e"; } + +.icon-navigation:before { content: "\e89f"; } + +.icon-octagon:before { content: "\e8a0"; } + +.icon-package:before { content: "\e8a1"; } + +.icon-pause-circle:before { content: "\e8a2"; } + +.icon-pause:before { content: "\e8a3"; } + +.icon-percent:before { content: "\e8a4"; } + +.icon-phone-call:before { content: "\e8a5"; } + +.icon-phone-forwarded:before { content: "\e8a6"; } + +.icon-phone-missed:before { content: "\e8a7"; } + +.icon-phone-off:before { content: "\e8a8"; } + +.icon-phone-incoming:before { content: "\e8a9"; } + +.icon-phone:before { content: "\e8aa"; } + +.icon-phone-outgoing:before { content: "\e8ab"; } + +.icon-pie-chart:before { content: "\e8ac"; } + +.icon-play-circle:before { content: "\e8ad"; } + +.icon-play:before { content: "\e8ae"; } + +.icon-plus-square:before { content: "\e8af"; } + +.icon-plus-circle:before { content: "\e8b0"; } + +.icon-plus:before { content: "\e8b1"; } + +.icon-pocket:before { content: "\e8b2"; } + +.icon-printer:before { content: "\e8b3"; } + +.icon-power:before { content: "\e8b4"; } + +.icon-radio:before { content: "\e8b5"; } + +.icon-repeat:before { content: "\e8b6"; } + +.icon-refresh-ccw:before { content: "\e8b7"; } + +.icon-rewind:before { content: "\e8b8"; } + +.icon-rotate-ccw:before { content: "\e8b9"; } + +.icon-refresh-cw:before { content: "\e8ba"; } + +.icon-rotate-cw:before { content: "\e8bb"; } + +.icon-save:before { content: "\e8bc"; } + +.icon-search:before { content: "\e8bd"; } + +.icon-server:before { content: "\e8be"; } + +.icon-scissors:before { content: "\e8bf"; } + +.icon-share-2:before { content: "\e8c0"; } + +.icon-share:before { content: "\e8c1"; } + +.icon-shield:before { content: "\e8c2"; } + +.icon-settings:before { content: "\e8c3"; } + +.icon-skip-back:before { content: "\e8c4"; } + +.icon-shuffle:before { content: "\e8c5"; } + +.icon-sidebar:before { content: "\e8c6"; } + +.icon-skip-forward:before { content: "\e8c7"; } + +.icon-slack:before { content: "\e8c8"; } + +.icon-slash:before { content: "\e8c9"; } + +.icon-smartphone:before { content: "\e8ca"; } + +.icon-square:before { content: "\e8cb"; } + +.icon-speaker:before { content: "\e8cc"; } + +.icon-star:before { content: "\e8cd"; } + +.icon-stop-circle:before { content: "\e8ce"; } + +.icon-sun:before { content: "\e8cf"; } + +.icon-sunrise:before { content: "\e8d0"; } + +.icon-tablet:before { content: "\e8d1"; } + +.icon-tag:before { content: "\e8d2"; } + +.icon-sunset:before { content: "\e8d3"; } + +.icon-target:before { content: "\e8d4"; } + +.icon-thermometer:before { content: "\e8d5"; } + +.icon-thumbs-up:before { content: "\e8d6"; } + +.icon-thumbs-down:before { content: "\e8d7"; } + +.icon-toggle-left:before { content: "\e8d8"; } + +.icon-toggle-right:before { content: "\e8d9"; } + +.icon-trash-2:before { content: "\e8da"; } + +.icon-trash:before { content: "\e8db"; } + +.icon-trending-up:before { content: "\e8dc"; } + +.icon-trending-down:before { content: "\e8dd"; } + +.icon-triangle:before { content: "\e8de"; } + +.icon-type:before { content: "\e8df"; } + +.icon-twitter:before { content: "\e8e0"; } + +.icon-upload:before { content: "\e8e1"; } + +.icon-umbrella:before { content: "\e8e2"; } + +.icon-upload-cloud:before { content: "\e8e3"; } + +.icon-unlock:before { content: "\e8e4"; } + +.icon-user-check:before { content: "\e8e5"; } + +.icon-user-minus:before { content: "\e8e6"; } + +.icon-user-plus:before { content: "\e8e7"; } + +.icon-user-x:before { content: "\e8e8"; } + +.icon-user:before { content: "\e8e9"; } + +.icon-users:before { content: "\e8ea"; } + +.icon-video-off:before { content: "\e8eb"; } + +.icon-video:before { content: "\e8ec"; } + +.icon-voicemail:before { content: "\e8ed"; } + +.icon-volume-x:before { content: "\e8ee"; } + +.icon-volume-2:before { content: "\e8ef"; } + +.icon-volume-1:before { content: "\e8f0"; } + +.icon-volume:before { content: "\e8f1"; } + +.icon-watch:before { content: "\e8f2"; } + +.icon-wifi:before { content: "\e8f3"; } + +.icon-x-square:before { content: "\e8f4"; } + +.icon-wind:before { content: "\e8f5"; } + +.icon-x:before { content: "\e8f6"; } + +.icon-x-circle:before { content: "\e8f7"; } + +.icon-zap:before { content: "\e8f8"; } + +.icon-zoom-in:before { content: "\e8f9"; } + +.icon-zoom-out:before { content: "\e8fa"; } + +.icon-command:before { content: "\e8fb"; } + +.icon-cloud:before { content: "\e8fc"; } + +.icon-hash:before { content: "\e8fd"; } + +.icon-headphones:before { content: "\e8fe"; } + +.icon-underline:before { content: "\e8ff"; } + +.icon-italic:before { content: "\e900"; } + +.icon-bold:before { content: "\e901"; } + +.icon-crop:before { content: "\e902"; } + +.icon-help-circle:before { content: "\e903"; } + +.icon-paperclip:before { content: "\e904"; } + +.icon-shopping-cart:before { content: "\e905"; } + +.icon-tv:before { content: "\e906"; } + +.icon-wifi-off:before { content: "\e907"; } + +.icon-minimize:before { content: "\e88d"; } + +.icon-maximize:before { content: "\e908"; } + +.icon-gitlab:before { content: "\e909"; } + +.icon-sliders:before { content: "\e90a"; } + +.icon-star-on:before { content: "\e90b"; } + +.icon-heart-on:before { content: "\e90c"; } + +.icon-archive:before { content: "\e90d"; } + +.icon-arrow-down-circle:before { content: "\e90e"; } + +.icon-arrow-up-circle:before { content: "\e90f"; } + +.icon-arrow-left-circle:before { content: "\e910"; } + +.icon-arrow-right-circle:before { content: "\e911"; } + +.icon-bar-chart-line-:before { content: "\e912"; } + +.icon-bar-chart-line:before { content: "\e913"; } + +.icon-book-open:before { content: "\e914"; } + +.icon-code:before { content: "\e915"; } + +.icon-database:before { content: "\e916"; } + +.icon-dollar-sign:before { content: "\e917"; } + +.icon-folder-plus:before { content: "\e918"; } + +.icon-gift:before { content: "\e919"; } + +.icon-folder-minus:before { content: "\e91a"; } + +.icon-git-commit:before { content: "\e91b"; } + +.icon-git-branch:before { content: "\e91c"; } + +.icon-git-pull-request:before { content: "\e91d"; } + +.icon-git-merge:before { content: "\e91e"; } + +.icon-linkedin:before { content: "\e91f"; } + +.icon-hard-drive:before { content: "\e920"; } + +.icon-more-vertical-:before { content: "\e921"; } + +.icon-more-horizontal-:before { content: "\e922"; } + +.icon-rss:before { content: "\e923"; } + +.icon-send:before { content: "\e924"; } + +.icon-shield-off:before { content: "\e925"; } + +.icon-shopping-bag:before { content: "\e926"; } + +.icon-terminal:before { content: "\e927"; } + +.icon-truck:before { content: "\e928"; } + +.icon-zap-off:before { content: "\e929"; } + +.icon-youtube:before { content: "\e92a"; } \ No newline at end of file diff --git a/www/css/index.css b/www/css/index.css new file mode 100644 index 0000000..b15a49b --- /dev/null +++ b/www/css/index.css @@ -0,0 +1,133 @@ +@import url("../css/nobleui.css"); +@import url("../css/stile.css"); +@import url("../css/fonts.css"); +@import url("../css/iconfont.css"); + +body, html { + height: 100%; + margin: 0; + padding: 0; +} +.wrapper { + display: flex; + flex-direction: column; + min-height: 100%; +} +main { + flex: 1; + overflow-y: auto; +} +header, footer { + width: 100%; + flex-shrink: 0; +} + +.shadow-up { + box-shadow: 0 -.5rem 1rem rgba(0, 0, 0, .15); +} + +.scrollable-nav { + display: flex; + flex-wrap: nowrap; + overflow-x: auto; + overflow-y: hidden; + -webkit-overflow-scrolling: touch; + white-space: nowrap; +} + +.scrollable-nav::-webkit-scrollbar { + display: none; +} + +.scrollable-nav button { + flex-shrink: 0; +} + +.scrollable-nav div { + flex-shrink: 0; +} + +.card-fixed { + width: 250px; + height: 100px; +} + +.text-container { + max-width: 80%; + max-height: 80%; + overflow: hidden; +} + +.text-ellipsis { + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; + text-overflow: ellipsis; +} + +.rotating-icon { + transition: transform 0.1s linear; + transform-origin: center center; /* */ + width: 32px; /* */ + height: 32px; /* */ + display: flex; /* flex */ + align-items: center; + justify-content: center; +} +.rotating-icon img { + display: block; + width: 100%; /* */ + height: 100%; /* */ +} + +.hidden { + display: none; +} + +.expand { + transition: transform 0.5s, opacity 0.5s; + transform: scale(0); + opacity: 0; +} + +.expanded { + transform: scale(1); + opacity: 1; +} + +/* CSS for the modal */ +.modal { + display: none; + position: fixed; + z-index: 1; + left: 0; + top: 0; + width: 100%; + height: 100%; + overflow: auto; + background-color: rgb(0, 0, 0); + background-color: rgba(0, 0, 0, 0.4); +} + +.modal-content { + background-color: #fefefe; + margin: 15% auto; + padding: 20px; + border: 1px solid #888; + width: 80%; +} + +.close { + color: #aaa; + float: right; + font-size: 28px; + font-weight: bold; +} + +.close:hover, +.close:focus { + color: black; + text-decoration: none; + cursor: pointer; +} \ No newline at end of file diff --git a/www/css/nobleui.css b/www/css/nobleui.css new file mode 100644 index 0000000..e2c850b --- /dev/null +++ b/www/css/nobleui.css @@ -0,0 +1,25910 @@ +@charset "UTF-8"; +:root { + --bs-blue: #0d6efd; + --bs-indigo: #6610f2; + --bs-purple: #6f42c1; + --bs-pink: #d63384; + --bs-red: #dc3545; + --bs-orange: #fd7e14; + --bs-yellow: #ffc107; + --bs-green: #198754; + --bs-teal: #20c997; + --bs-cyan: #0dcaf0; + --bs-black: #000; + --bs-white: #fff; + --bs-gray: #7987a1; + --bs-gray-dark: #212a3a; + --bs-gray-100: #f8f9fa; + --bs-gray-200: #e9ecef; + --bs-gray-300: #dee2e6; + --bs-gray-400: #ced4da; + --bs-gray-500: #adb5bd; + --bs-gray-600: #7987a1; + --bs-gray-700: #495057; + --bs-gray-800: #212a3a; + --bs-gray-900: #060c17; + --bs-primary: #6571ff; + --bs-secondary: #7987a1; + --bs-success: #05a34a; + --bs-info: #66d1d1; + --bs-warning: #fbbc06; + --bs-danger: #f36; + --bs-light: #e9ecef; + --bs-dark: #060c17; + --bs-primary-rgb: 101, 113, 255; + --bs-secondary-rgb: 121, 135, 161; + --bs-success-rgb: 5, 163, 74; + --bs-info-rgb: 102, 209, 209; + --bs-warning-rgb: 251, 188, 6; + --bs-danger-rgb: 255, 51, 102; + --bs-light-rgb: 233, 236, 239; + --bs-dark-rgb: 6, 12, 23; + --bs-white-rgb: 255, 255, 255; + --bs-black-rgb: 0, 0, 0; + --bs-body-color-rgb: 0, 0, 0; + --bs-body-bg-rgb: 249, 250, 251; + --bs-font-sans-serif: "Roboto", Helvetica, sans-serif; + --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + --bs-gradient: linear-gradient(180deg, hsla(0, 0%, 100%, .15), hsla(0, 0%, 100%, 0)); + --bs-body-font-family: var(--bs-font-sans-serif); + --bs-body-font-size: 0.875rem; + --bs-body-font-weight: 400; + --bs-body-line-height: 1.5; + --bs-body-color: #000; + --bs-body-bg: #f9fafb; + --bs-border-width: 1px; + --bs-border-style: solid; + --bs-border-color: #e9ecef; + --bs-border-color-translucent: rgba(0, 0, 0, .175); + --bs-border-radius: 0.25rem; + --bs-border-radius-sm: 0.25rem; + --bs-border-radius-lg: 0.5rem; + --bs-border-radius-xl: 1rem; + --bs-border-radius-2xl: 2rem; + --bs-border-radius-pill: 50rem; + --bs-link-color: #6571ff; + --bs-link-hover-color: #515acc; + --bs-code-color: #d63384; + --bs-highlight-bg: #fff3cd +} + +*, :after, :before { + box-sizing: border-box +} + +@media (prefers-reduced-motion: no-preference) { + :root { + scroll-behavior: smooth + } +} + +body { + -webkit-text-size-adjust: 100%; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + background-color: var(--bs-body-bg); + color: var(--bs-body-color); + font-family: var(--bs-body-font-family); + font-size: var(--bs-body-font-size); + font-weight: var(--bs-body-font-weight); + line-height: var(--bs-body-line-height); + text-align: var(--bs-body-text-align) +} + +hr { + border: 0; + border-top: 1px solid; + color: inherit; + margin: 1rem 0; + opacity: .1 +} + +.h1, .h2, .h3, .h4, .h5, .h6, h1, h2, h3, h4, h5, h6 { + font-weight: 500; + line-height: 1.2; + margin-bottom: 0; + margin-top: 0 +} + +.h1, h1 { + font-size: calc(1.375rem + 1.5vw) +} + +@media (min-width: 1200px) { + .h1, h1 { + font-size: 2.5rem + } +} + +.h2, h2 { + font-size: calc(1.325rem + .9vw) +} + +@media (min-width: 1200px) { + .h2, h2 { + font-size: 2rem + } +} + +.h3, h3 { + font-size: calc(1.275rem + .3vw) +} + +@media (min-width: 1200px) { + .h3, h3 { + font-size: 1.5rem + } +} + +.h4, h4 { + font-size: 1.25rem +} + +.h5, h5 { + font-size: 1rem +} + +.h6, h6 { + font-size: .875rem +} + +p { + margin-bottom: 0; + margin-top: 0 +} + +abbr[title] { + cursor: help; + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; + -webkit-text-decoration-skip-ink: none; + text-decoration-skip-ink: none +} + +address { + font-style: normal; + line-height: inherit; + margin-bottom: 1rem +} + +ol, ul { + padding-left: 2rem +} + +dl, ol, ul { + margin-bottom: 1rem; + margin-top: 0 +} + +ol ol, ol ul, ul ol, ul ul { + margin-bottom: 0 +} + +dt { + font-weight: 500 +} + +dd { + margin-bottom: .5rem; + margin-left: 0 +} + +blockquote { + margin: 0 0 1rem +} + +b, strong { + font-weight: 700 +} + +.small, small { + font-size: .875em +} + +.mark, mark { + background-color: var(--bs-highlight-bg); + padding: .1875em +} + +sub, sup { + font-size: .75em; + line-height: 0; + position: relative; + vertical-align: baseline +} + +sub { + bottom: -.25em +} + +sup { + top: -.5em +} + +a { + color: var(--bs-link-color); + text-decoration: none +} + +a:hover { + color: var(--bs-link-hover-color) +} + +a:not([href]):not([class]), a:not([href]):not([class]):hover { + color: inherit; + text-decoration: none +} + +code, kbd, pre, samp { + font-family: var(--bs-font-monospace); + font-size: 1em +} + +pre { + display: block; + font-size: .875em; + margin-bottom: 1rem; + margin-top: 0; + overflow: auto +} + +pre code { + color: inherit; + font-size: inherit; + word-break: normal +} + +code { + word-wrap: break-word; + color: var(--bs-code-color); + font-size: .875em +} + +a > code { + color: inherit +} + +kbd { + background-color: var(--bs-body-color); + border-radius: .25rem; + color: var(--bs-body-bg); + font-size: .875em; + padding: .1875rem .375rem +} + +kbd kbd { + font-size: 1em; + padding: 0 +} + +figure { + margin: 0 0 1rem +} + +img, svg { + vertical-align: middle +} + +table { + border-collapse: collapse; + caption-side: bottom +} + +caption { + color: #7987a1; + padding-bottom: .85rem; + padding-top: .85rem; + text-align: left +} + +th { + text-align: inherit; + text-align: -webkit-match-parent +} + +tbody, td, tfoot, th, thead, tr { + border: 0 solid; + border-color: inherit +} + +label { + display: inline-block +} + +button { + border-radius: 0 +} + +button:focus:not(:focus-visible) { + outline: 0 +} + +button, input, optgroup, select, textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; + margin: 0 +} + +button, select { + text-transform: none +} + +[role=button] { + cursor: pointer +} + +select { + word-wrap: normal +} + +select:disabled { + opacity: 1 +} + +[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator { + display: none !important +} + +[type=button], [type=reset], [type=submit], button { + -webkit-appearance: button +} + +[type=button]:not(:disabled), [type=reset]:not(:disabled), [type=submit]:not(:disabled), button:not(:disabled) { + cursor: pointer +} + +::-moz-focus-inner { + border-style: none; + padding: 0 +} + +textarea { + resize: vertical +} + +fieldset { + border: 0; + margin: 0; + min-width: 0; + padding: 0 +} + +legend { + float: left; + font-size: calc(1.275rem + .3vw); + line-height: inherit; + margin-bottom: .5rem; + padding: 0; + width: 100% +} + +@media (min-width: 1200px) { + legend { + font-size: 1.5rem + } +} + +legend + * { + clear: left +} + +::-webkit-datetime-edit-day-field, ::-webkit-datetime-edit-fields-wrapper, ::-webkit-datetime-edit-hour-field, ::-webkit-datetime-edit-minute, ::-webkit-datetime-edit-month-field, ::-webkit-datetime-edit-text, ::-webkit-datetime-edit-year-field { + padding: 0 +} + +::-webkit-inner-spin-button { + height: auto +} + +[type=search] { + -webkit-appearance: textfield; + outline-offset: -2px +} + +::-webkit-search-decoration { + -webkit-appearance: none +} + +::-webkit-color-swatch-wrapper { + padding: 0 +} + +::file-selector-button { + -webkit-appearance: button; + font: inherit +} + +output { + display: inline-block +} + +iframe { + border: 0 +} + +summary { + cursor: pointer; + display: list-item +} + +progress { + vertical-align: baseline +} + +[hidden] { + display: none !important +} + +.lead { + font-size: 1.09375rem; + font-weight: 300 +} + +.display-1 { + font-size: calc(1.625rem + 4.5vw); + font-weight: 300; + line-height: 1.2 +} + +@media (min-width: 1200px) { + .display-1 { + font-size: 5rem + } +} + +.display-2 { + font-size: calc(1.575rem + 3.9vw); + font-weight: 300; + line-height: 1.2 +} + +@media (min-width: 1200px) { + .display-2 { + font-size: 4.5rem + } +} + +.display-3 { + font-size: calc(1.525rem + 3.3vw); + font-weight: 300; + line-height: 1.2 +} + +@media (min-width: 1200px) { + .display-3 { + font-size: 4rem + } +} + +.display-4 { + font-size: calc(1.475rem + 2.7vw); + font-weight: 300; + line-height: 1.2 +} + +@media (min-width: 1200px) { + .display-4 { + font-size: 3.5rem + } +} + +.display-5 { + font-size: calc(1.425rem + 2.1vw); + font-weight: 300; + line-height: 1.2 +} + +@media (min-width: 1200px) { + .display-5 { + font-size: 3rem + } +} + +.display-6 { + font-size: calc(1.375rem + 1.5vw); + font-weight: 300; + line-height: 1.2 +} + +@media (min-width: 1200px) { + .display-6 { + font-size: 2.5rem + } +} + +.list-inline, .list-unstyled { + list-style: none; + padding-left: 0 +} + +.list-inline-item { + display: inline-block +} + +.list-inline-item:not(:last-child) { + margin-right: .5rem +} + +.initialism { + font-size: .875em; + text-transform: uppercase +} + +.blockquote { + font-size: 1.09375rem; + margin-bottom: 1rem +} + +.blockquote > :last-child { + margin-bottom: 0 +} + +.blockquote-footer { + color: #7987a1; + font-size: .875em; + margin-bottom: 1rem; + margin-top: -1rem +} + +.blockquote-footer:before { + content: "— " +} + +.img-fluid, .img-thumbnail { + height: auto; + max-width: 100% +} + +.img-thumbnail { + background-color: #f9fafb; + border: 1px solid var(--bs-border-color); + border-radius: .25rem; + padding: .25rem +} + +.figure { + display: inline-block +} + +.figure-img { + line-height: 1; + margin-bottom: .5rem +} + +.figure-caption { + color: #7987a1; + font-size: .875em +} + +.container, .container-fluid, .container-lg, .container-md, .container-sm, .container-xl, .container-xxl, .page-wrapper .page-content { + --bs-gutter-x: 1.5rem; + --bs-gutter-y: 0; + margin-left: auto; + margin-right: auto; + padding-left: calc(var(--bs-gutter-x) * .5); + padding-right: calc(var(--bs-gutter-x) * .5); + width: 100% +} + +@media (min-width: 576px) { + .container, .container-sm, .page-wrapper .page-content { + max-width: 540px + } +} + +@media (min-width: 768px) { + .container, .container-md, .container-sm, .page-wrapper .page-content { + max-width: 720px + } +} + +@media (min-width: 992px) { + .container, .container-lg, .container-md, .container-sm, .page-wrapper .page-content { + max-width: 960px + } +} + +@media (min-width: 1200px) { + .container, .container-lg, .container-md, .container-sm, .container-xl, .page-wrapper .page-content { + max-width: 1140px + } +} + +@media (min-width: 1400px) { + .container, .container-lg, .container-md, .container-sm, .container-xl, .container-xxl, .page-wrapper .page-content { + max-width: 1320px + } +} + +.row { + --bs-gutter-x: 1.5rem; + --bs-gutter-y: 0; + display: flex; + flex-wrap: wrap; + margin-left: calc(var(--bs-gutter-x) * -.5); + margin-right: calc(var(--bs-gutter-x) * -.5); + margin-top: calc(var(--bs-gutter-y) * -1) +} + +.row > * { + flex-shrink: 0; + margin-top: var(--bs-gutter-y); + max-width: 100%; + padding-left: calc(var(--bs-gutter-x) * .5); + padding-right: calc(var(--bs-gutter-x) * .5); + width: 100% +} + +.col { + flex: 1 0 0% +} + +.row-cols-auto > * { + flex: 0 0 auto; + width: auto +} + +.row-cols-1 > * { + flex: 0 0 auto; + width: 100% +} + +.row-cols-2 > * { + flex: 0 0 auto; + width: 50% +} + +.row-cols-3 > * { + flex: 0 0 auto; + width: 33.3333333333% +} + +.row-cols-4 > * { + flex: 0 0 auto; + width: 25% +} + +.row-cols-5 > * { + flex: 0 0 auto; + width: 20% +} + +.row-cols-6 > * { + flex: 0 0 auto; + width: 16.6666666667% +} + +.col-auto { + flex: 0 0 auto; + width: auto +} + +.col-1 { + flex: 0 0 auto; + width: 8.33333333% +} + +.col-2 { + flex: 0 0 auto; + width: 16.66666667% +} + +.col-3 { + flex: 0 0 auto; + width: 25% +} + +.col-4 { + flex: 0 0 auto; + width: 33.33333333% +} + +.col-5 { + flex: 0 0 auto; + width: 41.66666667% +} + +.col-6 { + flex: 0 0 auto; + width: 50% +} + +.col-7 { + flex: 0 0 auto; + width: 58.33333333% +} + +.col-8 { + flex: 0 0 auto; + width: 66.66666667% +} + +.col-9 { + flex: 0 0 auto; + width: 75% +} + +.col-10 { + flex: 0 0 auto; + width: 83.33333333% +} + +.col-11 { + flex: 0 0 auto; + width: 91.66666667% +} + +.col-12 { + flex: 0 0 auto; + width: 100% +} + +.offset-1 { + margin-left: 8.33333333% +} + +.offset-2 { + margin-left: 16.66666667% +} + +.offset-3 { + margin-left: 25% +} + +.offset-4 { + margin-left: 33.33333333% +} + +.offset-5 { + margin-left: 41.66666667% +} + +.offset-6 { + margin-left: 50% +} + +.offset-7 { + margin-left: 58.33333333% +} + +.offset-8 { + margin-left: 66.66666667% +} + +.offset-9 { + margin-left: 75% +} + +.offset-10 { + margin-left: 83.33333333% +} + +.offset-11 { + margin-left: 91.66666667% +} + +.g-0, .gx-0 { + --bs-gutter-x: 0 +} + +.g-0, .gy-0 { + --bs-gutter-y: 0 +} + +.g-1, .gx-1 { + --bs-gutter-x: 0.25rem +} + +.g-1, .gy-1 { + --bs-gutter-y: 0.25rem +} + +.g-2, .gx-2 { + --bs-gutter-x: 0.5rem +} + +.g-2, .gy-2 { + --bs-gutter-y: 0.5rem +} + +.g-3, .gx-3 { + --bs-gutter-x: 1rem +} + +.g-3, .gy-3 { + --bs-gutter-y: 1rem +} + +.g-4, .gx-4 { + --bs-gutter-x: 1.5rem +} + +.g-4, .gy-4 { + --bs-gutter-y: 1.5rem +} + +.g-5, .gx-5 { + --bs-gutter-x: 3rem +} + +.g-5, .gy-5 { + --bs-gutter-y: 3rem +} + +.g-6, .gx-6 { + --bs-gutter-x: 4.5rem +} + +.g-6, .gy-6 { + --bs-gutter-y: 4.5rem +} + +.g-7, .gx-7 { + --bs-gutter-x: 6rem +} + +.g-7, .gy-7 { + --bs-gutter-y: 6rem +} + +@media (min-width: 576px) { + .col-sm { + flex: 1 0 0% + } + + .row-cols-sm-auto > * { + flex: 0 0 auto; + width: auto + } + + .row-cols-sm-1 > * { + flex: 0 0 auto; + width: 100% + } + + .row-cols-sm-2 > * { + flex: 0 0 auto; + width: 50% + } + + .row-cols-sm-3 > * { + flex: 0 0 auto; + width: 33.3333333333% + } + + .row-cols-sm-4 > * { + flex: 0 0 auto; + width: 25% + } + + .row-cols-sm-5 > * { + flex: 0 0 auto; + width: 20% + } + + .row-cols-sm-6 > * { + flex: 0 0 auto; + width: 16.6666666667% + } + + .col-sm-auto { + flex: 0 0 auto; + width: auto + } + + .col-sm-1 { + flex: 0 0 auto; + width: 8.33333333% + } + + .col-sm-2 { + flex: 0 0 auto; + width: 16.66666667% + } + + .col-sm-3 { + flex: 0 0 auto; + width: 25% + } + + .col-sm-4 { + flex: 0 0 auto; + width: 33.33333333% + } + + .col-sm-5 { + flex: 0 0 auto; + width: 41.66666667% + } + + .col-sm-6 { + flex: 0 0 auto; + width: 50% + } + + .col-sm-7 { + flex: 0 0 auto; + width: 58.33333333% + } + + .col-sm-8 { + flex: 0 0 auto; + width: 66.66666667% + } + + .col-sm-9 { + flex: 0 0 auto; + width: 75% + } + + .col-sm-10 { + flex: 0 0 auto; + width: 83.33333333% + } + + .col-sm-11 { + flex: 0 0 auto; + width: 91.66666667% + } + + .col-sm-12 { + flex: 0 0 auto; + width: 100% + } + + .offset-sm-0 { + margin-left: 0 + } + + .offset-sm-1 { + margin-left: 8.33333333% + } + + .offset-sm-2 { + margin-left: 16.66666667% + } + + .offset-sm-3 { + margin-left: 25% + } + + .offset-sm-4 { + margin-left: 33.33333333% + } + + .offset-sm-5 { + margin-left: 41.66666667% + } + + .offset-sm-6 { + margin-left: 50% + } + + .offset-sm-7 { + margin-left: 58.33333333% + } + + .offset-sm-8 { + margin-left: 66.66666667% + } + + .offset-sm-9 { + margin-left: 75% + } + + .offset-sm-10 { + margin-left: 83.33333333% + } + + .offset-sm-11 { + margin-left: 91.66666667% + } + + .g-sm-0, .gx-sm-0 { + --bs-gutter-x: 0 + } + + .g-sm-0, .gy-sm-0 { + --bs-gutter-y: 0 + } + + .g-sm-1, .gx-sm-1 { + --bs-gutter-x: 0.25rem + } + + .g-sm-1, .gy-sm-1 { + --bs-gutter-y: 0.25rem + } + + .g-sm-2, .gx-sm-2 { + --bs-gutter-x: 0.5rem + } + + .g-sm-2, .gy-sm-2 { + --bs-gutter-y: 0.5rem + } + + .g-sm-3, .gx-sm-3 { + --bs-gutter-x: 1rem + } + + .g-sm-3, .gy-sm-3 { + --bs-gutter-y: 1rem + } + + .g-sm-4, .gx-sm-4 { + --bs-gutter-x: 1.5rem + } + + .g-sm-4, .gy-sm-4 { + --bs-gutter-y: 1.5rem + } + + .g-sm-5, .gx-sm-5 { + --bs-gutter-x: 3rem + } + + .g-sm-5, .gy-sm-5 { + --bs-gutter-y: 3rem + } + + .g-sm-6, .gx-sm-6 { + --bs-gutter-x: 4.5rem + } + + .g-sm-6, .gy-sm-6 { + --bs-gutter-y: 4.5rem + } + + .g-sm-7, .gx-sm-7 { + --bs-gutter-x: 6rem + } + + .g-sm-7, .gy-sm-7 { + --bs-gutter-y: 6rem + } +} + +@media (min-width: 768px) { + .col-md { + flex: 1 0 0% + } + + .row-cols-md-auto > * { + flex: 0 0 auto; + width: auto + } + + .row-cols-md-1 > * { + flex: 0 0 auto; + width: 100% + } + + .row-cols-md-2 > * { + flex: 0 0 auto; + width: 50% + } + + .row-cols-md-3 > * { + flex: 0 0 auto; + width: 33.3333333333% + } + + .row-cols-md-4 > * { + flex: 0 0 auto; + width: 25% + } + + .row-cols-md-5 > * { + flex: 0 0 auto; + width: 20% + } + + .row-cols-md-6 > * { + flex: 0 0 auto; + width: 16.6666666667% + } + + .col-md-auto { + flex: 0 0 auto; + width: auto + } + + .col-md-1 { + flex: 0 0 auto; + width: 8.33333333% + } + + .col-md-2 { + flex: 0 0 auto; + width: 16.66666667% + } + + .col-md-3 { + flex: 0 0 auto; + width: 25% + } + + .col-md-4 { + flex: 0 0 auto; + width: 33.33333333% + } + + .col-md-5 { + flex: 0 0 auto; + width: 41.66666667% + } + + .col-md-6 { + flex: 0 0 auto; + width: 50% + } + + .col-md-7 { + flex: 0 0 auto; + width: 58.33333333% + } + + .col-md-8 { + flex: 0 0 auto; + width: 66.66666667% + } + + .col-md-9 { + flex: 0 0 auto; + width: 75% + } + + .col-md-10 { + flex: 0 0 auto; + width: 83.33333333% + } + + .col-md-11 { + flex: 0 0 auto; + width: 91.66666667% + } + + .col-md-12 { + flex: 0 0 auto; + width: 100% + } + + .offset-md-0 { + margin-left: 0 + } + + .offset-md-1 { + margin-left: 8.33333333% + } + + .offset-md-2 { + margin-left: 16.66666667% + } + + .offset-md-3 { + margin-left: 25% + } + + .offset-md-4 { + margin-left: 33.33333333% + } + + .offset-md-5 { + margin-left: 41.66666667% + } + + .offset-md-6 { + margin-left: 50% + } + + .offset-md-7 { + margin-left: 58.33333333% + } + + .offset-md-8 { + margin-left: 66.66666667% + } + + .offset-md-9 { + margin-left: 75% + } + + .offset-md-10 { + margin-left: 83.33333333% + } + + .offset-md-11 { + margin-left: 91.66666667% + } + + .g-md-0, .gx-md-0 { + --bs-gutter-x: 0 + } + + .g-md-0, .gy-md-0 { + --bs-gutter-y: 0 + } + + .g-md-1, .gx-md-1 { + --bs-gutter-x: 0.25rem + } + + .g-md-1, .gy-md-1 { + --bs-gutter-y: 0.25rem + } + + .g-md-2, .gx-md-2 { + --bs-gutter-x: 0.5rem + } + + .g-md-2, .gy-md-2 { + --bs-gutter-y: 0.5rem + } + + .g-md-3, .gx-md-3 { + --bs-gutter-x: 1rem + } + + .g-md-3, .gy-md-3 { + --bs-gutter-y: 1rem + } + + .g-md-4, .gx-md-4 { + --bs-gutter-x: 1.5rem + } + + .g-md-4, .gy-md-4 { + --bs-gutter-y: 1.5rem + } + + .g-md-5, .gx-md-5 { + --bs-gutter-x: 3rem + } + + .g-md-5, .gy-md-5 { + --bs-gutter-y: 3rem + } + + .g-md-6, .gx-md-6 { + --bs-gutter-x: 4.5rem + } + + .g-md-6, .gy-md-6 { + --bs-gutter-y: 4.5rem + } + + .g-md-7, .gx-md-7 { + --bs-gutter-x: 6rem + } + + .g-md-7, .gy-md-7 { + --bs-gutter-y: 6rem + } +} + +@media (min-width: 992px) { + .col-lg { + flex: 1 0 0% + } + + .row-cols-lg-auto > * { + flex: 0 0 auto; + width: auto + } + + .row-cols-lg-1 > * { + flex: 0 0 auto; + width: 100% + } + + .row-cols-lg-2 > * { + flex: 0 0 auto; + width: 50% + } + + .row-cols-lg-3 > * { + flex: 0 0 auto; + width: 33.3333333333% + } + + .row-cols-lg-4 > * { + flex: 0 0 auto; + width: 25% + } + + .row-cols-lg-5 > * { + flex: 0 0 auto; + width: 20% + } + + .row-cols-lg-6 > * { + flex: 0 0 auto; + width: 16.6666666667% + } + + .col-lg-auto { + flex: 0 0 auto; + width: auto + } + + .col-lg-1 { + flex: 0 0 auto; + width: 8.33333333% + } + + .col-lg-2 { + flex: 0 0 auto; + width: 16.66666667% + } + + .col-lg-3 { + flex: 0 0 auto; + width: 25% + } + + .col-lg-4 { + flex: 0 0 auto; + width: 33.33333333% + } + + .col-lg-5 { + flex: 0 0 auto; + width: 41.66666667% + } + + .col-lg-6 { + flex: 0 0 auto; + width: 50% + } + + .col-lg-7 { + flex: 0 0 auto; + width: 58.33333333% + } + + .col-lg-8 { + flex: 0 0 auto; + width: 66.66666667% + } + + .col-lg-9 { + flex: 0 0 auto; + width: 75% + } + + .col-lg-10 { + flex: 0 0 auto; + width: 83.33333333% + } + + .col-lg-11 { + flex: 0 0 auto; + width: 91.66666667% + } + + .col-lg-12 { + flex: 0 0 auto; + width: 100% + } + + .offset-lg-0 { + margin-left: 0 + } + + .offset-lg-1 { + margin-left: 8.33333333% + } + + .offset-lg-2 { + margin-left: 16.66666667% + } + + .offset-lg-3 { + margin-left: 25% + } + + .offset-lg-4 { + margin-left: 33.33333333% + } + + .offset-lg-5 { + margin-left: 41.66666667% + } + + .offset-lg-6 { + margin-left: 50% + } + + .offset-lg-7 { + margin-left: 58.33333333% + } + + .offset-lg-8 { + margin-left: 66.66666667% + } + + .offset-lg-9 { + margin-left: 75% + } + + .offset-lg-10 { + margin-left: 83.33333333% + } + + .offset-lg-11 { + margin-left: 91.66666667% + } + + .g-lg-0, .gx-lg-0 { + --bs-gutter-x: 0 + } + + .g-lg-0, .gy-lg-0 { + --bs-gutter-y: 0 + } + + .g-lg-1, .gx-lg-1 { + --bs-gutter-x: 0.25rem + } + + .g-lg-1, .gy-lg-1 { + --bs-gutter-y: 0.25rem + } + + .g-lg-2, .gx-lg-2 { + --bs-gutter-x: 0.5rem + } + + .g-lg-2, .gy-lg-2 { + --bs-gutter-y: 0.5rem + } + + .g-lg-3, .gx-lg-3 { + --bs-gutter-x: 1rem + } + + .g-lg-3, .gy-lg-3 { + --bs-gutter-y: 1rem + } + + .g-lg-4, .gx-lg-4 { + --bs-gutter-x: 1.5rem + } + + .g-lg-4, .gy-lg-4 { + --bs-gutter-y: 1.5rem + } + + .g-lg-5, .gx-lg-5 { + --bs-gutter-x: 3rem + } + + .g-lg-5, .gy-lg-5 { + --bs-gutter-y: 3rem + } + + .g-lg-6, .gx-lg-6 { + --bs-gutter-x: 4.5rem + } + + .g-lg-6, .gy-lg-6 { + --bs-gutter-y: 4.5rem + } + + .g-lg-7, .gx-lg-7 { + --bs-gutter-x: 6rem + } + + .g-lg-7, .gy-lg-7 { + --bs-gutter-y: 6rem + } +} + +@media (min-width: 1200px) { + .col-xl { + flex: 1 0 0% + } + + .row-cols-xl-auto > * { + flex: 0 0 auto; + width: auto + } + + .row-cols-xl-1 > * { + flex: 0 0 auto; + width: 100% + } + + .row-cols-xl-2 > * { + flex: 0 0 auto; + width: 50% + } + + .row-cols-xl-3 > * { + flex: 0 0 auto; + width: 33.3333333333% + } + + .row-cols-xl-4 > * { + flex: 0 0 auto; + width: 25% + } + + .row-cols-xl-5 > * { + flex: 0 0 auto; + width: 20% + } + + .row-cols-xl-6 > * { + flex: 0 0 auto; + width: 16.6666666667% + } + + .col-xl-auto { + flex: 0 0 auto; + width: auto + } + + .col-xl-1 { + flex: 0 0 auto; + width: 8.33333333% + } + + .col-xl-2 { + flex: 0 0 auto; + width: 16.66666667% + } + + .col-xl-3 { + flex: 0 0 auto; + width: 25% + } + + .col-xl-4 { + flex: 0 0 auto; + width: 33.33333333% + } + + .col-xl-5 { + flex: 0 0 auto; + width: 41.66666667% + } + + .col-xl-6 { + flex: 0 0 auto; + width: 50% + } + + .col-xl-7 { + flex: 0 0 auto; + width: 58.33333333% + } + + .col-xl-8 { + flex: 0 0 auto; + width: 66.66666667% + } + + .col-xl-9 { + flex: 0 0 auto; + width: 75% + } + + .col-xl-10 { + flex: 0 0 auto; + width: 83.33333333% + } + + .col-xl-11 { + flex: 0 0 auto; + width: 91.66666667% + } + + .col-xl-12 { + flex: 0 0 auto; + width: 100% + } + + .offset-xl-0 { + margin-left: 0 + } + + .offset-xl-1 { + margin-left: 8.33333333% + } + + .offset-xl-2 { + margin-left: 16.66666667% + } + + .offset-xl-3 { + margin-left: 25% + } + + .offset-xl-4 { + margin-left: 33.33333333% + } + + .offset-xl-5 { + margin-left: 41.66666667% + } + + .offset-xl-6 { + margin-left: 50% + } + + .offset-xl-7 { + margin-left: 58.33333333% + } + + .offset-xl-8 { + margin-left: 66.66666667% + } + + .offset-xl-9 { + margin-left: 75% + } + + .offset-xl-10 { + margin-left: 83.33333333% + } + + .offset-xl-11 { + margin-left: 91.66666667% + } + + .g-xl-0, .gx-xl-0 { + --bs-gutter-x: 0 + } + + .g-xl-0, .gy-xl-0 { + --bs-gutter-y: 0 + } + + .g-xl-1, .gx-xl-1 { + --bs-gutter-x: 0.25rem + } + + .g-xl-1, .gy-xl-1 { + --bs-gutter-y: 0.25rem + } + + .g-xl-2, .gx-xl-2 { + --bs-gutter-x: 0.5rem + } + + .g-xl-2, .gy-xl-2 { + --bs-gutter-y: 0.5rem + } + + .g-xl-3, .gx-xl-3 { + --bs-gutter-x: 1rem + } + + .g-xl-3, .gy-xl-3 { + --bs-gutter-y: 1rem + } + + .g-xl-4, .gx-xl-4 { + --bs-gutter-x: 1.5rem + } + + .g-xl-4, .gy-xl-4 { + --bs-gutter-y: 1.5rem + } + + .g-xl-5, .gx-xl-5 { + --bs-gutter-x: 3rem + } + + .g-xl-5, .gy-xl-5 { + --bs-gutter-y: 3rem + } + + .g-xl-6, .gx-xl-6 { + --bs-gutter-x: 4.5rem + } + + .g-xl-6, .gy-xl-6 { + --bs-gutter-y: 4.5rem + } + + .g-xl-7, .gx-xl-7 { + --bs-gutter-x: 6rem + } + + .g-xl-7, .gy-xl-7 { + --bs-gutter-y: 6rem + } +} + +@media (min-width: 1400px) { + .col-xxl { + flex: 1 0 0% + } + + .row-cols-xxl-auto > * { + flex: 0 0 auto; + width: auto + } + + .row-cols-xxl-1 > * { + flex: 0 0 auto; + width: 100% + } + + .row-cols-xxl-2 > * { + flex: 0 0 auto; + width: 50% + } + + .row-cols-xxl-3 > * { + flex: 0 0 auto; + width: 33.3333333333% + } + + .row-cols-xxl-4 > * { + flex: 0 0 auto; + width: 25% + } + + .row-cols-xxl-5 > * { + flex: 0 0 auto; + width: 20% + } + + .row-cols-xxl-6 > * { + flex: 0 0 auto; + width: 16.6666666667% + } + + .col-xxl-auto { + flex: 0 0 auto; + width: auto + } + + .col-xxl-1 { + flex: 0 0 auto; + width: 8.33333333% + } + + .col-xxl-2 { + flex: 0 0 auto; + width: 16.66666667% + } + + .col-xxl-3 { + flex: 0 0 auto; + width: 25% + } + + .col-xxl-4 { + flex: 0 0 auto; + width: 33.33333333% + } + + .col-xxl-5 { + flex: 0 0 auto; + width: 41.66666667% + } + + .col-xxl-6 { + flex: 0 0 auto; + width: 50% + } + + .col-xxl-7 { + flex: 0 0 auto; + width: 58.33333333% + } + + .col-xxl-8 { + flex: 0 0 auto; + width: 66.66666667% + } + + .col-xxl-9 { + flex: 0 0 auto; + width: 75% + } + + .col-xxl-10 { + flex: 0 0 auto; + width: 83.33333333% + } + + .col-xxl-11 { + flex: 0 0 auto; + width: 91.66666667% + } + + .col-xxl-12 { + flex: 0 0 auto; + width: 100% + } + + .offset-xxl-0 { + margin-left: 0 + } + + .offset-xxl-1 { + margin-left: 8.33333333% + } + + .offset-xxl-2 { + margin-left: 16.66666667% + } + + .offset-xxl-3 { + margin-left: 25% + } + + .offset-xxl-4 { + margin-left: 33.33333333% + } + + .offset-xxl-5 { + margin-left: 41.66666667% + } + + .offset-xxl-6 { + margin-left: 50% + } + + .offset-xxl-7 { + margin-left: 58.33333333% + } + + .offset-xxl-8 { + margin-left: 66.66666667% + } + + .offset-xxl-9 { + margin-left: 75% + } + + .offset-xxl-10 { + margin-left: 83.33333333% + } + + .offset-xxl-11 { + margin-left: 91.66666667% + } + + .g-xxl-0, .gx-xxl-0 { + --bs-gutter-x: 0 + } + + .g-xxl-0, .gy-xxl-0 { + --bs-gutter-y: 0 + } + + .g-xxl-1, .gx-xxl-1 { + --bs-gutter-x: 0.25rem + } + + .g-xxl-1, .gy-xxl-1 { + --bs-gutter-y: 0.25rem + } + + .g-xxl-2, .gx-xxl-2 { + --bs-gutter-x: 0.5rem + } + + .g-xxl-2, .gy-xxl-2 { + --bs-gutter-y: 0.5rem + } + + .g-xxl-3, .gx-xxl-3 { + --bs-gutter-x: 1rem + } + + .g-xxl-3, .gy-xxl-3 { + --bs-gutter-y: 1rem + } + + .g-xxl-4, .gx-xxl-4 { + --bs-gutter-x: 1.5rem + } + + .g-xxl-4, .gy-xxl-4 { + --bs-gutter-y: 1.5rem + } + + .g-xxl-5, .gx-xxl-5 { + --bs-gutter-x: 3rem + } + + .g-xxl-5, .gy-xxl-5 { + --bs-gutter-y: 3rem + } + + .g-xxl-6, .gx-xxl-6 { + --bs-gutter-x: 4.5rem + } + + .g-xxl-6, .gy-xxl-6 { + --bs-gutter-y: 4.5rem + } + + .g-xxl-7, .gx-xxl-7 { + --bs-gutter-x: 6rem + } + + .g-xxl-7, .gy-xxl-7 { + --bs-gutter-y: 6rem + } +} + +.table { + --bs-table-color: var(--bs-body-color); + --bs-table-bg: transparent; + --bs-table-border-color: var(--bs-border-color); + --bs-table-accent-bg: transparent; + --bs-table-striped-color: var(--bs-body-color); + --bs-table-striped-bg: #e9ecef; + --bs-table-active-color: var(--bs-body-color); + --bs-table-active-bg: #dee2e6; + --bs-table-hover-color: var(--bs-body-color); + --bs-table-hover-bg: #e9ecef; + border-color: var(--bs-table-border-color); + color: var(--bs-table-color); + margin-bottom: 1rem; + vertical-align: top; + width: 100% +} + +.table > :not(caption) > * > * { + background-color: var(--bs-table-bg); + border-bottom-width: 1px; + box-shadow: inset 0 0 0 9999px var(--bs-table-accent-bg); + padding: .85rem +} + +.table > tbody { + vertical-align: inherit +} + +.table > thead { + vertical-align: bottom +} + +.table-group-divider { + border-top: 2px solid #e9ecef +} + +.caption-top { + caption-side: top +} + +.table-sm > :not(caption) > * > * { + padding: .55rem +} + +.table-bordered > :not(caption) > * { + border-width: 1px 0 +} + +.table-bordered > :not(caption) > * > * { + border-width: 0 1px +} + +.table-borderless > :not(caption) > * > * { + border-bottom-width: 0 +} + +.table-borderless > :not(:first-child) { + border-top-width: 0 +} + +.table-striped-columns > :not(caption) > tr > :nth-child(2n), .table-striped > tbody > tr:nth-of-type(odd) > * { + --bs-table-accent-bg: var(--bs-table-striped-bg); + color: var(--bs-table-striped-color) +} + +.table-active { + --bs-table-accent-bg: var(--bs-table-active-bg); + color: var(--bs-table-active-color) +} + +.table-hover > tbody > tr:hover > * { + --bs-table-accent-bg: var(--bs-table-hover-bg); + color: var(--bs-table-hover-color) +} + +.table-primary { + --bs-table-color: #000; + --bs-table-bg: #e0e3ff; + --bs-table-border-color: #cacce6; + --bs-table-striped-bg: #d5d8f2; + --bs-table-striped-color: #000; + --bs-table-active-bg: #cacce6; + --bs-table-active-color: #000; + --bs-table-hover-bg: #cfd2ec; + --bs-table-hover-color: #000 +} + +.table-primary, .table-secondary { + border-color: var(--bs-table-border-color); + color: var(--bs-table-color) +} + +.table-secondary { + --bs-table-color: #000; + --bs-table-bg: #e4e7ec; + --bs-table-border-color: #cdd0d4; + --bs-table-striped-bg: #d9dbe0; + --bs-table-striped-color: #000; + --bs-table-active-bg: #cdd0d4; + --bs-table-active-color: #000; + --bs-table-hover-bg: #d3d6da; + --bs-table-hover-color: #000 +} + +.table-success { + --bs-table-color: #000; + --bs-table-bg: #cdeddb; + --bs-table-border-color: #b9d5c5; + --bs-table-striped-bg: #c3e1d0; + --bs-table-striped-color: #000; + --bs-table-active-bg: #b9d5c5; + --bs-table-active-color: #000; + --bs-table-hover-bg: #bedbcb; + --bs-table-hover-color: #000 +} + +.table-info, .table-success { + border-color: var(--bs-table-border-color); + color: var(--bs-table-color) +} + +.table-info { + --bs-table-color: #000; + --bs-table-bg: #e0f6f6; + --bs-table-border-color: #cadddd; + --bs-table-striped-bg: #d5eaea; + --bs-table-striped-color: #000; + --bs-table-active-bg: #cadddd; + --bs-table-active-color: #000; + --bs-table-hover-bg: #cfe4e4; + --bs-table-hover-color: #000 +} + +.table-warning { + --bs-table-color: #000; + --bs-table-bg: #fef2cd; + --bs-table-border-color: #e5dab9; + --bs-table-striped-bg: #f1e6c3; + --bs-table-striped-color: #000; + --bs-table-active-bg: #e5dab9; + --bs-table-active-color: #000; + --bs-table-hover-bg: #ebe0be; + --bs-table-hover-color: #000 +} + +.table-danger, .table-warning { + border-color: var(--bs-table-border-color); + color: var(--bs-table-color) +} + +.table-danger { + --bs-table-color: #000; + --bs-table-bg: #ffd6e0; + --bs-table-border-color: #e6c1ca; + --bs-table-striped-bg: #f2cbd5; + --bs-table-striped-color: #000; + --bs-table-active-bg: #e6c1ca; + --bs-table-active-color: #000; + --bs-table-hover-bg: #ecc6cf; + --bs-table-hover-color: #000 +} + +.table-light { + --bs-table-color: #000; + --bs-table-bg: #e9ecef; + --bs-table-border-color: #d2d4d7; + --bs-table-striped-bg: #dde0e3; + --bs-table-striped-color: #000; + --bs-table-active-bg: #d2d4d7; + --bs-table-active-color: #000; + --bs-table-hover-bg: #d8dadd; + --bs-table-hover-color: #000 +} + +.table-dark, .table-light { + border-color: var(--bs-table-border-color); + color: var(--bs-table-color) +} + +.table-dark { + --bs-table-color: #fff; + --bs-table-bg: #060c17; + --bs-table-border-color: #1f242e; + --bs-table-striped-bg: #121823; + --bs-table-striped-color: #fff; + --bs-table-active-bg: #1f242e; + --bs-table-active-color: #fff; + --bs-table-hover-bg: #191e28; + --bs-table-hover-color: #fff +} + +.table-responsive { + -webkit-overflow-scrolling: touch; + overflow-x: auto +} + +@media (max-width: 575.98px) { + .table-responsive-sm { + -webkit-overflow-scrolling: touch; + overflow-x: auto + } +} + +@media (max-width: 767.98px) { + .table-responsive-md { + -webkit-overflow-scrolling: touch; + overflow-x: auto + } +} + +@media (max-width: 991.98px) { + .table-responsive-lg { + -webkit-overflow-scrolling: touch; + overflow-x: auto + } +} + +@media (max-width: 1199.98px) { + .table-responsive-xl { + -webkit-overflow-scrolling: touch; + overflow-x: auto + } +} + +@media (max-width: 1399.98px) { + .table-responsive-xxl { + -webkit-overflow-scrolling: touch; + overflow-x: auto + } +} + +.form-label { + margin-bottom: .5rem +} + +.col-form-label { + font-size: inherit; + line-height: 1.5; + margin-bottom: 0; + padding-bottom: calc(.469rem + 1px); + padding-top: calc(.469rem + 1px) +} + +.col-form-label-lg { + font-size: 1rem; + padding-bottom: calc(.5rem + 1px); + padding-top: calc(.5rem + 1px) +} + +.col-form-label-sm { + font-size: .812rem; + padding-bottom: calc(.391rem + 1px); + padding-top: calc(.391rem + 1px) +} + +.form-text { + color: #7987a1; + font-size: .875em; + margin-top: .25rem +} + +.form-control, .select2-container--default .select2-search--dropdown .select2-search__field, .typeahead.tt-hint, .typeahead.tt-input { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-clip: padding-box; + background-color: #fff; + border: 1px solid #e9ecef; + border-radius: .25rem; + color: #000; + display: block; + font-size: .875rem; + font-weight: 400; + line-height: 1.5; + padding: .469rem .8rem; + transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out; + width: 100% +} + +@media (prefers-reduced-motion: reduce) { + .form-control, .select2-container--default .select2-search--dropdown .select2-search__field, .typeahead.tt-hint, .typeahead.tt-input { + transition: none + } +} + +.form-control[type=file], .select2-container--default .select2-search--dropdown [type=file].select2-search__field, [type=file].typeahead.tt-hint, [type=file].typeahead.tt-input { + overflow: hidden +} + +.form-control[type=file]:not(:disabled):not([readonly]), .select2-container--default .select2-search--dropdown [type=file].select2-search__field:not(:disabled):not([readonly]), [type=file].typeahead.tt-hint:not(:disabled):not([readonly]), [type=file].typeahead.tt-input:not(:disabled):not([readonly]) { + cursor: pointer +} + +.form-control:focus, .select2-container--default .select2-search--dropdown .select2-search__field:focus, .typeahead.tt-hint:focus, .typeahead.tt-input:focus { + background-color: #fff; + border-color: #ced4da; + box-shadow: none; + color: #000; + outline: 0 +} + +.form-control::-webkit-date-and-time-value, .select2-container--default .select2-search--dropdown .select2-search__field::-webkit-date-and-time-value, .typeahead.tt-hint::-webkit-date-and-time-value, .typeahead.tt-input::-webkit-date-and-time-value { + height: 1.5em +} + +.form-control::-moz-placeholder, .select2-container--default .select2-search--dropdown .select2-search__field::-moz-placeholder, .typeahead.tt-hint::-moz-placeholder, .typeahead.tt-input::-moz-placeholder { + color: #adb5bd; + opacity: 1 +} + +.form-control::placeholder, .select2-container--default .select2-search--dropdown .select2-search__field::placeholder, .typeahead.tt-hint::placeholder, .typeahead.tt-input::placeholder { + color: #adb5bd; + opacity: 1 +} + +.form-control:disabled, .select2-container--default .select2-search--dropdown .select2-search__field:disabled, .typeahead.tt-hint:disabled, .typeahead.tt-input:disabled { + background-color: #e9ecef; + opacity: 1 +} + +.form-control::file-selector-button, .select2-container--default .select2-search--dropdown .select2-search__field::file-selector-button, .typeahead.tt-hint::file-selector-button, .typeahead.tt-input::file-selector-button { + -webkit-margin-end: .8rem; + background-color: #f8f9fa; + border: 0 solid; + border-color: inherit; + border-inline-end-width: 1px; + border-radius: 0; + color: #000; + margin: -.469rem -.8rem; + margin-inline-end: .8rem; + padding: .469rem .8rem; + pointer-events: none; + transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out +} + +@media (prefers-reduced-motion: reduce) { + .form-control::file-selector-button, .select2-container--default .select2-search--dropdown .select2-search__field::file-selector-button, .typeahead.tt-hint::file-selector-button, .typeahead.tt-input::file-selector-button { + transition: none + } +} + +.form-control:hover:not(:disabled):not([readonly])::file-selector-button, .select2-container--default .select2-search--dropdown .select2-search__field:hover:not(:disabled):not([readonly])::file-selector-button, .typeahead.tt-hint:hover:not(:disabled):not([readonly])::file-selector-button, .typeahead.tt-input:hover:not(:disabled):not([readonly])::file-selector-button { + background-color: #ecedee +} + +.form-control-plaintext { + background-color: transparent; + border: solid transparent; + border-width: 1px 0; + color: #000; + display: block; + line-height: 1.5; + margin-bottom: 0; + padding: .469rem 0; + width: 100% +} + +.form-control-plaintext:focus { + outline: 0 +} + +.form-control-plaintext.form-control-lg, .form-control-plaintext.form-control-sm { + padding-left: 0; + padding-right: 0 +} + +.form-control-sm { + border-radius: .25rem; + font-size: .812rem; + min-height: calc(1.5em + .782rem + 2px); + padding: .391rem .8rem +} + +.form-control-sm::file-selector-button { + -webkit-margin-end: .8rem; + margin: -.391rem -.8rem; + margin-inline-end: .8rem; + padding: .391rem .8rem +} + +.form-control-lg { + border-radius: .25rem; + font-size: 1rem; + min-height: calc(1.5em + 1rem + 2px); + padding: .5rem .8rem +} + +.form-control-lg::file-selector-button { + -webkit-margin-end: .8rem; + margin: -.5rem -.8rem; + margin-inline-end: .8rem; + padding: .5rem .8rem +} + +.select2-container--default .select2-search--dropdown textarea.select2-search__field, textarea.form-control, textarea.typeahead.tt-hint, textarea.typeahead.tt-input { + min-height: calc(1.5em + .938rem + 2px) +} + +textarea.form-control-sm { + min-height: calc(1.5em + .782rem + 2px) +} + +textarea.form-control-lg { + min-height: calc(1.5em + 1rem + 2px) +} + +.form-control-color { + height: calc(1.5em + .938rem + 2px); + padding: .469rem; + width: 3rem +} + +.form-control-color:not(:disabled):not([readonly]) { + cursor: pointer +} + +.form-control-color::-moz-color-swatch { + border: 0 !important; + border-radius: .25rem +} + +.form-control-color::-webkit-color-swatch { + border-radius: .25rem +} + +.form-control-color.form-control-sm { + height: calc(1.5em + .782rem + 2px) +} + +.form-control-color.form-control-lg { + height: calc(1.5em + 1rem + 2px) +} + +.form-select { + -moz-padding-start: calc(.8rem - 3px); + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: #fff; + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='none' stroke='%23212a3a' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3E%3C/svg%3E"); + background-position: right .8rem center; + background-repeat: no-repeat; + background-size: 16px 12px; + border: 1px solid #e9ecef; + border-radius: .25rem; + color: #000; + display: block; + font-size: .875rem; + font-weight: 400; + line-height: 1.5; + padding: .469rem 2.4rem .469rem .8rem; + transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out; + width: 100% +} + +@media (prefers-reduced-motion: reduce) { + .form-select { + transition: none + } +} + +.form-select:focus { + border-color: #ced4da; + box-shadow: 0 0 0 0 rgba(101, 113, 255, .25); + outline: 0 +} + +.form-select[multiple], .form-select[size]:not([size="1"]) { + background-image: none; + padding-right: .8rem +} + +.form-select:disabled { + background-color: #e9ecef +} + +.form-select:-moz-focusring { + color: transparent; + text-shadow: 0 0 0 #000 +} + +.form-select-sm { + font-size: .812rem; + padding-bottom: .391rem; + padding-top: .391rem +} + +.form-select-lg, .form-select-sm { + border-radius: .25rem; + padding-left: .8rem +} + +.form-select-lg { + font-size: 1rem; + padding-bottom: .5rem; + padding-top: .5rem +} + +.form-check { + display: block; + margin-bottom: .125rem; + min-height: 1.3125rem; + padding-left: 1.8em +} + +.form-check .form-check-input { + float: left; + margin-left: -1.8em +} + +.form-check-reverse { + padding-left: 0; + padding-right: 1.8em; + text-align: right +} + +.form-check-reverse .form-check-input { + float: right; + margin-left: 0; + margin-right: -1.8em +} + +.form-check-input { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: #fff; + background-position: 50%; + background-repeat: no-repeat; + background-size: contain; + border: 1px solid rgba(0, 0, 0, .25); + height: 1.3em; + margin-top: .1em; + -webkit-print-color-adjust: exact; + print-color-adjust: exact; + vertical-align: top; + width: 1.3em +} + +.form-check-input[type=checkbox] { + border-radius: .15em +} + +.form-check-input[type=radio] { + border-radius: 50% +} + +.form-check-input:active { + filter: brightness(90%) +} + +.form-check-input:focus { + border-color: #ced4da; + box-shadow: none; + outline: 0 +} + +.form-check-input:checked { + background-color: #6571ff; + border-color: #6571ff +} + +.form-check-input:checked[type=checkbox] { + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3E%3C/svg%3E") +} + +.form-check-input:checked[type=radio] { + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='2' fill='%23fff'/%3E%3C/svg%3E") +} + +.form-check-input[type=checkbox]:indeterminate { + background-color: #6571ff; + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3E%3C/svg%3E"); + border-color: #6571ff +} + +.form-check-input:disabled { + filter: none; + opacity: .5; + pointer-events: none +} + +.form-check-input:disabled ~ .form-check-label, .form-check-input[disabled] ~ .form-check-label { + cursor: default; + opacity: .5 +} + +.form-switch { + padding-left: 2.5em +} + +.form-switch .form-check-input { + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='rgba(0, 0, 0, 0.25)'/%3E%3C/svg%3E"); + background-position: 0; + border-radius: 2em; + margin-left: -2.5em; + transition: background-position .15s ease-in-out; + width: 2em +} + +@media (prefers-reduced-motion: reduce) { + .form-switch .form-check-input { + transition: none + } +} + +.form-switch .form-check-input:focus { + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23ced4da'/%3E%3C/svg%3E") +} + +.form-switch .form-check-input:checked { + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E"); + background-position: 100% +} + +.form-switch.form-check-reverse { + padding-left: 0; + padding-right: 2.5em +} + +.form-switch.form-check-reverse .form-check-input { + margin-left: 0; + margin-right: -2.5em +} + +.form-check-inline { + display: inline-block; + margin-right: 1rem +} + +.btn-check { + clip: rect(0, 0, 0, 0); + pointer-events: none; + position: absolute +} + +.btn-check:disabled + .btn, .btn-check[disabled] + .btn, .swal2-popup .swal2-actions .btn-check:disabled + button, .swal2-popup .swal2-actions .btn-check[disabled] + button, .wizard > .actions .btn-check:disabled + a, .wizard > .actions .btn-check[disabled] + a, div.fc .btn-check:disabled + .fc-button-primary, div.fc .btn-check[disabled] + .fc-button-primary, div.tox .btn-check:disabled + .tox-button, div.tox .btn-check[disabled] + .tox-button { + filter: none; + opacity: .65; + pointer-events: none +} + +.form-range { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: transparent; + height: 1rem; + padding: 0; + width: 100% +} + +.form-range:focus { + outline: 0 +} + +.form-range:focus::-webkit-slider-thumb { + box-shadow: 0 0 0 1px #f9fafb, none +} + +.form-range:focus::-moz-range-thumb { + box-shadow: 0 0 0 1px #f9fafb, none +} + +.form-range::-moz-focus-outer { + border: 0 +} + +.form-range::-webkit-slider-thumb { + -webkit-appearance: none; + appearance: none; + background-color: #6571ff; + border: 0; + border-radius: 1rem; + height: 1rem; + margin-top: -.25rem; + -webkit-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; + transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; + width: 1rem +} + +@media (prefers-reduced-motion: reduce) { + .form-range::-webkit-slider-thumb { + -webkit-transition: none; + transition: none + } +} + +.form-range::-webkit-slider-thumb:active { + background-color: #d1d4ff +} + +.form-range::-webkit-slider-runnable-track { + background-color: #dee2e6; + border-color: transparent; + border-radius: 1rem; + color: transparent; + cursor: pointer; + height: .5rem; + width: 100% +} + +.form-range::-moz-range-thumb { + -moz-appearance: none; + appearance: none; + background-color: #6571ff; + border: 0; + border-radius: 1rem; + height: 1rem; + -moz-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; + transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; + width: 1rem +} + +@media (prefers-reduced-motion: reduce) { + .form-range::-moz-range-thumb { + -moz-transition: none; + transition: none + } +} + +.form-range::-moz-range-thumb:active { + background-color: #d1d4ff +} + +.form-range::-moz-range-track { + background-color: #dee2e6; + border-color: transparent; + border-radius: 1rem; + color: transparent; + cursor: pointer; + height: .5rem; + width: 100% +} + +.form-range:disabled { + pointer-events: none +} + +.form-range:disabled::-webkit-slider-thumb { + background-color: #adb5bd +} + +.form-range:disabled::-moz-range-thumb { + background-color: #adb5bd +} + +.form-floating { + position: relative +} + +.form-floating > .form-control, .form-floating > .form-control-plaintext, .form-floating > .form-select, .form-floating > .typeahead.tt-hint, .form-floating > .typeahead.tt-input, .select2-container--default .select2-search--dropdown .form-floating > .select2-search__field { + height: calc(3.5rem + 2px); + line-height: 1.25 +} + +.form-floating > label { + border: 1px solid transparent; + height: 100%; + left: 0; + overflow: hidden; + padding: 1rem .8rem; + pointer-events: none; + position: absolute; + text-align: start; + text-overflow: ellipsis; + top: 0; + transform-origin: 0 0; + transition: opacity .1s ease-in-out, transform .1s ease-in-out; + white-space: nowrap; + width: 100% +} + +@media (prefers-reduced-motion: reduce) { + .form-floating > label { + transition: none + } +} + +.form-floating > .form-control, .form-floating > .form-control-plaintext, .form-floating > .typeahead.tt-hint, .form-floating > .typeahead.tt-input, .select2-container--default .select2-search--dropdown .form-floating > .select2-search__field { + padding: 1rem .8rem +} + +.form-floating > .form-control-plaintext::-moz-placeholder, .form-floating > .form-control::-moz-placeholder, .form-floating > .typeahead.tt-hint::-moz-placeholder, .form-floating > .typeahead.tt-input::-moz-placeholder, .select2-container--default .select2-search--dropdown .form-floating > .select2-search__field::-moz-placeholder { + color: transparent +} + +.form-floating > .form-control-plaintext::placeholder, .form-floating > .form-control::placeholder, .form-floating > .typeahead.tt-hint::placeholder, .form-floating > .typeahead.tt-input::placeholder, .select2-container--default .select2-search--dropdown .form-floating > .select2-search__field::placeholder { + color: transparent +} + +.form-floating > .form-control-plaintext:not(:-moz-placeholder-shown), .form-floating > .form-control:not(:-moz-placeholder-shown), .form-floating > .typeahead.tt-hint:not(:-moz-placeholder-shown), .form-floating > .typeahead.tt-input:not(:-moz-placeholder-shown), .select2-container--default .select2-search--dropdown .form-floating > .select2-search__field:not(:-moz-placeholder-shown) { + padding-bottom: .625rem; + padding-top: 1.625rem +} + +.form-floating > .form-control-plaintext:focus, .form-floating > .form-control-plaintext:not(:placeholder-shown), .form-floating > .form-control:focus, .form-floating > .form-control:not(:placeholder-shown), .form-floating > .typeahead.tt-hint:focus, .form-floating > .typeahead.tt-hint:not(:placeholder-shown), .form-floating > .typeahead.tt-input:focus, .form-floating > .typeahead.tt-input:not(:placeholder-shown), .select2-container--default .select2-search--dropdown .form-floating > .select2-search__field:focus, .select2-container--default .select2-search--dropdown .form-floating > .select2-search__field:not(:placeholder-shown) { + padding-bottom: .625rem; + padding-top: 1.625rem +} + +.form-floating > .form-control-plaintext:-webkit-autofill, .form-floating > .form-control:-webkit-autofill, .form-floating > .typeahead.tt-hint:-webkit-autofill, .form-floating > .typeahead.tt-input:-webkit-autofill, .select2-container--default .select2-search--dropdown .form-floating > .select2-search__field:-webkit-autofill { + padding-bottom: .625rem; + padding-top: 1.625rem +} + +.form-floating > .form-select { + padding-bottom: .625rem; + padding-top: 1.625rem +} + +.form-floating > .form-control:not(:-moz-placeholder-shown) ~ label, .form-floating > .typeahead.tt-hint:not(:-moz-placeholder-shown) ~ label, .form-floating > .typeahead.tt-input:not(:-moz-placeholder-shown) ~ label, .select2-container--default .select2-search--dropdown .form-floating > .select2-search__field:not(:-moz-placeholder-shown) ~ label { + opacity: .65; + transform: scale(.85) translateY(-.5rem) translateX(.15rem) +} + +.form-floating > .form-control-plaintext ~ label, .form-floating > .form-control:focus ~ label, .form-floating > .form-control:not(:placeholder-shown) ~ label, .form-floating > .form-select ~ label, .form-floating > .typeahead.tt-hint:focus ~ label, .form-floating > .typeahead.tt-hint:not(:placeholder-shown) ~ label, .form-floating > .typeahead.tt-input:focus ~ label, .form-floating > .typeahead.tt-input:not(:placeholder-shown) ~ label, .select2-container--default .select2-search--dropdown .form-floating > .select2-search__field:focus ~ label, .select2-container--default .select2-search--dropdown .form-floating > .select2-search__field:not(:placeholder-shown) ~ label { + opacity: .65; + transform: scale(.85) translateY(-.5rem) translateX(.15rem) +} + +.form-floating > .form-control:-webkit-autofill ~ label, .form-floating > .typeahead.tt-hint:-webkit-autofill ~ label, .form-floating > .typeahead.tt-input:-webkit-autofill ~ label, .select2-container--default .select2-search--dropdown .form-floating > .select2-search__field:-webkit-autofill ~ label { + opacity: .65; + transform: scale(.85) translateY(-.5rem) translateX(.15rem) +} + +.form-floating > .form-control-plaintext ~ label { + border-width: 1px 0 +} + +.input-group { + align-items: stretch; + display: flex; + flex-wrap: wrap; + position: relative; + width: 100% +} + +.input-group > .form-control, .input-group > .form-floating, .input-group > .form-select, .input-group > .typeahead.tt-hint, .input-group > .typeahead.tt-input, .select2-container--default .select2-search--dropdown .input-group > .select2-search__field { + flex: 1 1 auto; + min-width: 0; + position: relative; + width: 1% +} + +.input-group > .form-control:focus, .input-group > .form-floating:focus-within, .input-group > .form-select:focus, .input-group > .typeahead.tt-hint:focus, .input-group > .typeahead.tt-input:focus, .select2-container--default .select2-search--dropdown .input-group > .select2-search__field:focus { + z-index: 5 +} + +.input-group .btn, .input-group .swal2-popup .swal2-actions button, .input-group .wizard > .actions a, .input-group div.fc .fc-button-primary, .input-group div.tox .tox-button, .swal2-popup .swal2-actions .input-group button, .wizard > .actions .input-group a, div.fc .input-group .fc-button-primary, div.tox .input-group .tox-button { + position: relative; + z-index: 2 +} + +.input-group .btn:focus, .input-group .swal2-popup .swal2-actions button:focus, .input-group .wizard > .actions a:focus, .input-group div.fc .fc-button-primary:focus, .input-group div.tox .tox-button:focus, .swal2-popup .swal2-actions .input-group button:focus, .wizard > .actions .input-group a:focus, div.fc .input-group .fc-button-primary:focus, div.tox .input-group .tox-button:focus { + z-index: 5 +} + +.input-group-text { + align-items: center; + background-color: #f8f9fa; + border: 1px solid #e9ecef; + border-radius: .25rem; + color: #000; + display: flex; + font-size: .875rem; + font-weight: 400; + line-height: 1.5; + padding: .469rem .563rem; + text-align: center; + white-space: nowrap +} + +.input-group-lg > .btn, .input-group-lg > .form-control, .input-group-lg > .form-select, .input-group-lg > .input-group-text, .input-group-lg > .typeahead.tt-hint, .input-group-lg > .typeahead.tt-input, .select2-container--default .select2-search--dropdown .input-group-lg > .select2-search__field, .swal2-popup .swal2-actions .input-group-lg > button, .wizard > .actions .input-group-lg > a, div.fc .input-group-lg > .fc-button-primary, div.tox .input-group-lg > .tox-button { + border-radius: .25rem; + font-size: 1rem; + padding: .5rem .8rem +} + +.input-group-sm > .btn, .input-group-sm > .form-control, .input-group-sm > .form-select, .input-group-sm > .input-group-text, .input-group-sm > .typeahead.tt-hint, .input-group-sm > .typeahead.tt-input, .select2-container--default .select2-search--dropdown .input-group-sm > .select2-search__field, .swal2-popup .swal2-actions .input-group-sm > button, .wizard > .actions .input-group-sm > a, div.fc .input-group-sm > .fc-button-primary, div.tox .input-group-sm > .tox-button { + border-radius: .25rem; + font-size: .812rem; + padding: .391rem .8rem +} + +.input-group-lg > .form-select, .input-group-sm > .form-select { + padding-right: 3.2rem +} + +.input-group.has-validation > .dropdown-toggle:nth-last-child(n+4), .input-group.has-validation > .form-floating:nth-last-child(n+3) > .form-control, .input-group.has-validation > .form-floating:nth-last-child(n+3) > .form-select, .input-group.has-validation > .form-floating:nth-last-child(n+3) > .typeahead.tt-hint, .input-group.has-validation > .form-floating:nth-last-child(n+3) > .typeahead.tt-input, .input-group.has-validation > :nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.tt-menu):not(.form-floating), .input-group:not(.has-validation) > .dropdown-toggle:nth-last-child(n+3), .input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-control, .input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-select, .input-group:not(.has-validation) > .form-floating:not(:last-child) > .typeahead.tt-hint, .input-group:not(.has-validation) > .form-floating:not(:last-child) > .typeahead.tt-input, .input-group:not(.has-validation) > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.tt-menu):not(.form-floating), .select2-container--default .select2-search--dropdown .input-group.has-validation > .form-floating:nth-last-child(n+3) > .select2-search__field, .select2-container--default .select2-search--dropdown .input-group:not(.has-validation) > .form-floating:not(:last-child) > .select2-search__field { + border-bottom-right-radius: 0; + border-top-right-radius: 0 +} + +.input-group > :not(:first-child):not(.dropdown-menu):not(.tt-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback) { + border-bottom-left-radius: 0; + border-top-left-radius: 0; + margin-left: -1px +} + +.input-group > .form-floating:not(:first-child) > .form-control, .input-group > .form-floating:not(:first-child) > .form-select, .input-group > .form-floating:not(:first-child) > .typeahead.tt-hint, .input-group > .form-floating:not(:first-child) > .typeahead.tt-input, .select2-container--default .select2-search--dropdown .input-group > .form-floating:not(:first-child) > .select2-search__field { + border-bottom-left-radius: 0; + border-top-left-radius: 0 +} + +.valid-feedback { + color: #05a34a; + display: none; + font-size: .875em; + margin-top: .25rem; + width: 100% +} + +.valid-tooltip { + background-color: rgba(5, 163, 74, .9); + border-radius: .25rem; + color: #fff; + display: none; + font-size: .812rem; + margin-top: .1rem; + max-width: 100%; + padding: .25rem .5rem; + position: absolute; + top: 100%; + z-index: 5 +} + +.is-valid ~ .valid-feedback, .is-valid ~ .valid-tooltip, .was-validated :valid ~ .valid-feedback, .was-validated :valid ~ .valid-tooltip { + display: block +} + +.form-control.is-valid, .is-valid.typeahead.tt-hint, .is-valid.typeahead.tt-input, .select2-container--default .select2-search--dropdown .is-valid.select2-search__field, .select2-container--default .select2-search--dropdown .was-validated .select2-search__field:valid, .was-validated .form-control:valid, .was-validated .select2-container--default .select2-search--dropdown .select2-search__field:valid, .was-validated .typeahead.tt-hint:valid, .was-validated .typeahead.tt-input:valid { + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%2305a34a' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E"); + background-position: right calc(.375em + .2345rem) center; + background-repeat: no-repeat; + background-size: calc(.75em + .469rem) calc(.75em + .469rem); + border-color: #05a34a; + padding-right: calc(1.5em + .938rem) +} + +.form-control.is-valid:focus, .is-valid.typeahead.tt-hint:focus, .is-valid.typeahead.tt-input:focus, .select2-container--default .select2-search--dropdown .is-valid.select2-search__field:focus, .select2-container--default .select2-search--dropdown .was-validated .select2-search__field:valid:focus, .was-validated .form-control:valid:focus, .was-validated .select2-container--default .select2-search--dropdown .select2-search__field:valid:focus, .was-validated .typeahead.tt-hint:valid:focus, .was-validated .typeahead.tt-input:valid:focus { + border-color: #05a34a; + box-shadow: 0 0 0 0 rgba(5, 163, 74, .25) +} + +.select2-container--default .select2-search--dropdown .was-validated textarea.select2-search__field:valid, .select2-container--default .select2-search--dropdown textarea.is-valid.select2-search__field, .was-validated .select2-container--default .select2-search--dropdown textarea.select2-search__field:valid, .was-validated textarea.form-control:valid, .was-validated textarea.typeahead.tt-hint:valid, .was-validated textarea.typeahead.tt-input:valid, textarea.form-control.is-valid, textarea.is-valid.typeahead.tt-hint, textarea.is-valid.typeahead.tt-input { + background-position: top calc(.375em + .2345rem) right calc(.375em + .2345rem); + padding-right: calc(1.5em + .938rem) +} + +.form-select.is-valid, .was-validated .form-select:valid { + border-color: #05a34a +} + +.form-select.is-valid:not([multiple]):not([size]), .form-select.is-valid:not([multiple])[size="1"], .was-validated .form-select:valid:not([multiple]):not([size]), .was-validated .form-select:valid:not([multiple])[size="1"] { + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='none' stroke='%23212a3a' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3E%3C/svg%3E"), url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%2305a34a' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E"); + background-position: right .8rem center, center right 2.4rem; + background-size: 16px 12px, calc(.75em + .469rem) calc(.75em + .469rem); + padding-right: 4.4rem +} + +.form-select.is-valid:focus, .was-validated .form-select:valid:focus { + border-color: #05a34a; + box-shadow: 0 0 0 0 rgba(5, 163, 74, .25) +} + +.form-control-color.is-valid, .was-validated .form-control-color:valid { + width: calc(3.938rem + 1.5em) +} + +.form-check-input.is-valid, .was-validated .form-check-input:valid { + border-color: #05a34a +} + +.form-check-input.is-valid:checked, .was-validated .form-check-input:valid:checked { + background-color: #05a34a +} + +.form-check-input.is-valid:focus, .was-validated .form-check-input:valid:focus { + box-shadow: 0 0 0 0 rgba(5, 163, 74, .25) +} + +.form-check-input.is-valid ~ .form-check-label, .was-validated .form-check-input:valid ~ .form-check-label { + color: #05a34a +} + +.form-check-inline .form-check-input ~ .valid-feedback { + margin-left: .5em +} + +.input-group > .form-control:not(:focus).is-valid, .input-group > .form-floating:not(:focus-within).is-valid, .input-group > .form-select:not(:focus).is-valid, .input-group > .typeahead.tt-hint:not(:focus).is-valid, .input-group > .typeahead.tt-input:not(:focus).is-valid, .select2-container--default .select2-search--dropdown .input-group > .select2-search__field:not(:focus).is-valid, .select2-container--default .select2-search--dropdown .was-validated .input-group > .select2-search__field:not(:focus):valid, .was-validated .input-group > .form-control:not(:focus):valid, .was-validated .input-group > .form-floating:not(:focus-within):valid, .was-validated .input-group > .form-select:not(:focus):valid, .was-validated .input-group > .typeahead.tt-hint:not(:focus):valid, .was-validated .input-group > .typeahead.tt-input:not(:focus):valid, .was-validated .select2-container--default .select2-search--dropdown .input-group > .select2-search__field:not(:focus):valid { + z-index: 3 +} + +.invalid-feedback { + color: #f36; + display: none; + font-size: .875em; + margin-top: .25rem; + width: 100% +} + +.invalid-tooltip { + background-color: rgba(255, 51, 102, .9); + border-radius: .25rem; + color: #fff; + display: none; + font-size: .812rem; + margin-top: .1rem; + max-width: 100%; + padding: .25rem .5rem; + position: absolute; + top: 100%; + z-index: 5 +} + +.is-invalid ~ .invalid-feedback, .is-invalid ~ .invalid-tooltip, .was-validated :invalid ~ .invalid-feedback, .was-validated :invalid ~ .invalid-tooltip { + display: block +} + +.form-control.is-invalid, .is-invalid.typeahead.tt-hint, .is-invalid.typeahead.tt-input, .select2-container--default .select2-search--dropdown .is-invalid.select2-search__field, .select2-container--default .select2-search--dropdown .was-validated .select2-search__field:invalid, .was-validated .form-control:invalid, .was-validated .select2-container--default .select2-search--dropdown .select2-search__field:invalid, .was-validated .typeahead.tt-hint:invalid, .was-validated .typeahead.tt-input:invalid { + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23f36'%3E%3Ccircle cx='6' cy='6' r='4.5'/%3E%3Cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3E%3Ccircle cx='6' cy='8.2' r='.6' fill='%23f36' stroke='none'/%3E%3C/svg%3E"); + background-position: right calc(.375em + .2345rem) center; + background-repeat: no-repeat; + background-size: calc(.75em + .469rem) calc(.75em + .469rem); + border-color: #f36; + padding-right: calc(1.5em + .938rem) +} + +.form-control.is-invalid:focus, .is-invalid.typeahead.tt-hint:focus, .is-invalid.typeahead.tt-input:focus, .select2-container--default .select2-search--dropdown .is-invalid.select2-search__field:focus, .select2-container--default .select2-search--dropdown .was-validated .select2-search__field:invalid:focus, .was-validated .form-control:invalid:focus, .was-validated .select2-container--default .select2-search--dropdown .select2-search__field:invalid:focus, .was-validated .typeahead.tt-hint:invalid:focus, .was-validated .typeahead.tt-input:invalid:focus { + border-color: #f36; + box-shadow: 0 0 0 0 rgba(255, 51, 102, .25) +} + +.select2-container--default .select2-search--dropdown .was-validated textarea.select2-search__field:invalid, .select2-container--default .select2-search--dropdown textarea.is-invalid.select2-search__field, .was-validated .select2-container--default .select2-search--dropdown textarea.select2-search__field:invalid, .was-validated textarea.form-control:invalid, .was-validated textarea.typeahead.tt-hint:invalid, .was-validated textarea.typeahead.tt-input:invalid, textarea.form-control.is-invalid, textarea.is-invalid.typeahead.tt-hint, textarea.is-invalid.typeahead.tt-input { + background-position: top calc(.375em + .2345rem) right calc(.375em + .2345rem); + padding-right: calc(1.5em + .938rem) +} + +.form-select.is-invalid, .was-validated .form-select:invalid { + border-color: #f36 +} + +.form-select.is-invalid:not([multiple]):not([size]), .form-select.is-invalid:not([multiple])[size="1"], .was-validated .form-select:invalid:not([multiple]):not([size]), .was-validated .form-select:invalid:not([multiple])[size="1"] { + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='none' stroke='%23212a3a' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3E%3C/svg%3E"), url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23f36'%3E%3Ccircle cx='6' cy='6' r='4.5'/%3E%3Cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3E%3Ccircle cx='6' cy='8.2' r='.6' fill='%23f36' stroke='none'/%3E%3C/svg%3E"); + background-position: right .8rem center, center right 2.4rem; + background-size: 16px 12px, calc(.75em + .469rem) calc(.75em + .469rem); + padding-right: 4.4rem +} + +.form-select.is-invalid:focus, .was-validated .form-select:invalid:focus { + border-color: #f36; + box-shadow: 0 0 0 0 rgba(255, 51, 102, .25) +} + +.form-control-color.is-invalid, .was-validated .form-control-color:invalid { + width: calc(3.938rem + 1.5em) +} + +.form-check-input.is-invalid, .was-validated .form-check-input:invalid { + border-color: #f36 +} + +.form-check-input.is-invalid:checked, .was-validated .form-check-input:invalid:checked { + background-color: #f36 +} + +.form-check-input.is-invalid:focus, .was-validated .form-check-input:invalid:focus { + box-shadow: 0 0 0 0 rgba(255, 51, 102, .25) +} + +.form-check-input.is-invalid ~ .form-check-label, .was-validated .form-check-input:invalid ~ .form-check-label { + color: #f36 +} + +.form-check-inline .form-check-input ~ .invalid-feedback { + margin-left: .5em +} + +.input-group > .form-control:not(:focus).is-invalid, .input-group > .form-floating:not(:focus-within).is-invalid, .input-group > .form-select:not(:focus).is-invalid, .input-group > .typeahead.tt-hint:not(:focus).is-invalid, .input-group > .typeahead.tt-input:not(:focus).is-invalid, .select2-container--default .select2-search--dropdown .input-group > .select2-search__field:not(:focus).is-invalid, .select2-container--default .select2-search--dropdown .was-validated .input-group > .select2-search__field:not(:focus):invalid, .was-validated .input-group > .form-control:not(:focus):invalid, .was-validated .input-group > .form-floating:not(:focus-within):invalid, .was-validated .input-group > .form-select:not(:focus):invalid, .was-validated .input-group > .typeahead.tt-hint:not(:focus):invalid, .was-validated .input-group > .typeahead.tt-input:not(:focus):invalid, .was-validated .select2-container--default .select2-search--dropdown .input-group > .select2-search__field:not(:focus):invalid { + z-index: 4 +} + +.btn, .swal2-popup .swal2-actions button, .wizard > .actions a, .wizard > .actions a:active, .wizard > .actions a:hover, div.fc .fc-button-primary, div.tox .tox-button { + --bs-btn-padding-x: 0.8rem; + --bs-btn-padding-y: 0.469rem; + --bs-btn-font-family: ; + --bs-btn-font-size: 0.875rem; + --bs-btn-font-weight: 400; + --bs-btn-line-height: 1.5; + --bs-btn-color: #000; + --bs-btn-bg: transparent; + --bs-btn-border-width: 1px; + --bs-btn-border-color: transparent; + --bs-btn-border-radius: 0.25rem; + --bs-btn-hover-border-color: transparent; + --bs-btn-box-shadow: inset 0 1px 0 hsla(0, 0%, 100%, .15), 0 1px 1px rgba(0, 0, 0, .075); + --bs-btn-disabled-opacity: 0.65; + --bs-btn-focus-box-shadow: 0 0 0 0 rgba(var(--bs-btn-focus-shadow-rgb), .5); + background-color: var(--bs-btn-bg); + border: var(--bs-btn-border-width) solid var(--bs-btn-border-color); + border-radius: var(--bs-btn-border-radius); + color: var(--bs-btn-color); + cursor: pointer; + display: inline-block; + font-family: var(--bs-btn-font-family); + font-size: var(--bs-btn-font-size); + font-weight: var(--bs-btn-font-weight); + line-height: var(--bs-btn-line-height); + padding: var(--bs-btn-padding-y) var(--bs-btn-padding-x); + text-align: center; + transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + vertical-align: middle +} + +@media (prefers-reduced-motion: reduce) { + .btn, .swal2-popup .swal2-actions button, .wizard > .actions a, .wizard > .actions a:active, .wizard > .actions a:hover, div.fc .fc-button-primary, div.tox .tox-button { + transition: none + } +} + +.btn:hover, .swal2-popup .swal2-actions button:hover, .wizard > .actions a:hover, div.fc .fc-button-primary:hover, div.tox .tox-button:hover { + background-color: var(--bs-btn-hover-bg); + border-color: var(--bs-btn-hover-border-color); + color: var(--bs-btn-hover-color) +} + +.btn-check + .btn:hover, .swal2-popup .swal2-actions .btn-check + button:hover, .wizard > .actions .btn-check + a:hover, div.fc .btn-check + .fc-button-primary:hover, div.tox .btn-check + .tox-button:hover { + background-color: var(--bs-btn-bg); + border-color: var(--bs-btn-border-color); + color: var(--bs-btn-color) +} + +.btn:focus-visible, .swal2-popup .swal2-actions button:focus-visible, .wizard > .actions a:focus-visible, div.fc .fc-button-primary:focus-visible, div.tox .tox-button:focus-visible { + background-color: var(--bs-btn-hover-bg); + border-color: var(--bs-btn-hover-border-color); + box-shadow: var(--bs-btn-focus-box-shadow); + color: var(--bs-btn-hover-color); + outline: 0 +} + +.btn-check:focus-visible + .btn, .swal2-popup .swal2-actions .btn-check:focus-visible + button, .wizard > .actions .btn-check:focus-visible + a, div.fc .btn-check:focus-visible + .fc-button-primary, div.tox .btn-check:focus-visible + .tox-button { + border-color: var(--bs-btn-hover-border-color); + box-shadow: var(--bs-btn-focus-box-shadow); + outline: 0 +} + +.btn-check:checked + .btn, .btn.active, .btn.show, .btn:first-child:active, .swal2-popup .swal2-actions .btn-check:checked + button, .swal2-popup .swal2-actions :not(.btn-check) + button:active, .swal2-popup .swal2-actions button.active, .swal2-popup .swal2-actions button.show, .swal2-popup .swal2-actions button:first-child:active, .wizard > .actions .btn-check:checked + a, .wizard > .actions :not(.btn-check) + a:active, .wizard > .actions a.active, .wizard > .actions a.show, .wizard > .actions a:first-child:active, :not(.btn-check) + .btn:active, div.fc .active.fc-button-primary, div.fc .btn-check:checked + .fc-button-primary, div.fc .fc-button-primary:first-child:active, div.fc .show.fc-button-primary, div.fc :not(.btn-check) + .fc-button-primary:active, div.tox .active.tox-button, div.tox .btn-check:checked + .tox-button, div.tox .show.tox-button, div.tox .tox-button:first-child:active, div.tox :not(.btn-check) + .tox-button:active { + background-color: var(--bs-btn-active-bg); + border-color: var(--bs-btn-active-border-color); + color: var(--bs-btn-active-color) +} + +.btn-check:checked + .btn:focus-visible, .btn.active:focus-visible, .btn.show:focus-visible, .btn:first-child:active:focus-visible, .swal2-popup .swal2-actions .btn-check:checked + button:focus-visible, .swal2-popup .swal2-actions :not(.btn-check) + button:active:focus-visible, .swal2-popup .swal2-actions button.active:focus-visible, .swal2-popup .swal2-actions button.show:focus-visible, .swal2-popup .swal2-actions button:first-child:active:focus-visible, .wizard > .actions .btn-check:checked + a:focus-visible, .wizard > .actions :not(.btn-check) + a:active:focus-visible, .wizard > .actions a.active:focus-visible, .wizard > .actions a.show:focus-visible, .wizard > .actions a:first-child:active:focus-visible, :not(.btn-check) + .btn:active:focus-visible, div.fc .active.fc-button-primary:focus-visible, div.fc .btn-check:checked + .fc-button-primary:focus-visible, div.fc .fc-button-primary:first-child:active:focus-visible, div.fc .show.fc-button-primary:focus-visible, div.fc :not(.btn-check) + .fc-button-primary:active:focus-visible, div.tox .active.tox-button:focus-visible, div.tox .btn-check:checked + .tox-button:focus-visible, div.tox .show.tox-button:focus-visible, div.tox .tox-button:first-child:active:focus-visible, div.tox :not(.btn-check) + .tox-button:active:focus-visible { + box-shadow: var(--bs-btn-focus-box-shadow) +} + +.btn.disabled, .btn:disabled, .swal2-popup .swal2-actions button.disabled, .swal2-popup .swal2-actions button:disabled, .swal2-popup .swal2-actions fieldset:disabled button, .wizard > .actions a.disabled, .wizard > .actions a:disabled, .wizard > .actions fieldset:disabled a, div.fc .disabled.fc-button-primary, div.fc .fc-button-primary:disabled, div.fc fieldset:disabled .fc-button-primary, div.tox .disabled.tox-button, div.tox .tox-button:disabled, div.tox fieldset:disabled .tox-button, fieldset:disabled .btn, fieldset:disabled .swal2-popup .swal2-actions button, fieldset:disabled .wizard > .actions a, fieldset:disabled div.fc .fc-button-primary, fieldset:disabled div.tox .tox-button { + background-color: var(--bs-btn-disabled-bg); + border-color: var(--bs-btn-disabled-border-color); + color: var(--bs-btn-disabled-color); + opacity: var(--bs-btn-disabled-opacity); + pointer-events: none +} + +.btn-primary, .swal2-popup .swal2-actions button.swal2-confirm, .wizard > .actions a, .wizard > .actions a:active, .wizard > .actions a:hover, div.tox .tox-button:not(.tox-button--naked):not(.tox-button--secondary) { + --bs-btn-color: #fff; + --bs-btn-bg: #6571ff; + --bs-btn-border-color: #6571ff; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #5660d9; + --bs-btn-hover-border-color: #515acc; + --bs-btn-focus-shadow-rgb: 124, 134, 255; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #515acc; + --bs-btn-active-border-color: #4c55bf; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #6571ff; + --bs-btn-disabled-border-color: #6571ff +} + +.btn-secondary, div.tox .tox-button--secondary { + --bs-btn-color: #fff; + --bs-btn-bg: #7987a1; + --bs-btn-border-color: #7987a1; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #677389; + --bs-btn-hover-border-color: #616c81; + --bs-btn-focus-shadow-rgb: 141, 153, 175; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #616c81; + --bs-btn-active-border-color: #5b6579; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #7987a1; + --bs-btn-disabled-border-color: #7987a1 +} + +.btn-success { + --bs-btn-color: #fff; + --bs-btn-bg: #05a34a; + --bs-btn-border-color: #05a34a; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #048b3f; + --bs-btn-hover-border-color: #04823b; + --bs-btn-focus-shadow-rgb: 43, 177, 101; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #04823b; + --bs-btn-active-border-color: #047a38; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #05a34a; + --bs-btn-disabled-border-color: #05a34a +} + +.btn-info { + --bs-btn-color: #000; + --bs-btn-bg: #66d1d1; + --bs-btn-border-color: #66d1d1; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #7dd8d8; + --bs-btn-hover-border-color: #75d6d6; + --bs-btn-focus-shadow-rgb: 87, 178, 178; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #85dada; + --bs-btn-active-border-color: #75d6d6; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + --bs-btn-disabled-color: #000; + --bs-btn-disabled-bg: #66d1d1; + --bs-btn-disabled-border-color: #66d1d1 +} + +.btn-warning { + --bs-btn-color: #000; + --bs-btn-bg: #fbbc06; + --bs-btn-border-color: #fbbc06; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #fcc62b; + --bs-btn-hover-border-color: #fbc31f; + --bs-btn-focus-shadow-rgb: 213, 160, 5; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #fcc938; + --bs-btn-active-border-color: #fbc31f; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + --bs-btn-disabled-color: #000; + --bs-btn-disabled-bg: #fbbc06; + --bs-btn-disabled-border-color: #fbbc06 +} + +.btn-danger, .swal2-popup .swal2-actions button.swal2-cancel { + --bs-btn-color: #fff; + --bs-btn-bg: #f36; + --bs-btn-border-color: #f36; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #d92b57; + --bs-btn-hover-border-color: #cc2952; + --bs-btn-focus-shadow-rgb: 255, 82, 125; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #cc2952; + --bs-btn-active-border-color: #bf264d; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #f36; + --bs-btn-disabled-border-color: #f36 +} + +.btn-light { + --bs-btn-color: #000; + --bs-btn-bg: #e9ecef; + --bs-btn-border-color: #e9ecef; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #c6c9cb; + --bs-btn-hover-border-color: #babdbf; + --bs-btn-focus-shadow-rgb: 198, 201, 203; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #babdbf; + --bs-btn-active-border-color: #afb1b3; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + --bs-btn-disabled-color: #000; + --bs-btn-disabled-bg: #e9ecef; + --bs-btn-disabled-border-color: #e9ecef +} + +.btn-dark { + --bs-btn-color: #fff; + --bs-btn-bg: #060c17; + --bs-btn-border-color: #060c17; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #2b303a; + --bs-btn-hover-border-color: #1f242e; + --bs-btn-focus-shadow-rgb: 43, 48, 58; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #383d45; + --bs-btn-active-border-color: #1f242e; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #060c17; + --bs-btn-disabled-border-color: #060c17 +} + +.btn-outline-primary, div.fc .fc-button-primary { + --bs-btn-color: #6571ff; + --bs-btn-border-color: #6571ff; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #6571ff; + --bs-btn-hover-border-color: #6571ff; + --bs-btn-focus-shadow-rgb: 101, 113, 255; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #6571ff; + --bs-btn-active-border-color: #6571ff; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + --bs-btn-disabled-color: #6571ff; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #6571ff; + --bs-gradient: none +} + +.btn-outline-secondary { + --bs-btn-color: #7987a1; + --bs-btn-border-color: #7987a1; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #7987a1; + --bs-btn-hover-border-color: #7987a1; + --bs-btn-focus-shadow-rgb: 121, 135, 161; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #7987a1; + --bs-btn-active-border-color: #7987a1; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + --bs-btn-disabled-color: #7987a1; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #7987a1; + --bs-gradient: none +} + +.btn-outline-success { + --bs-btn-color: #05a34a; + --bs-btn-border-color: #05a34a; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #05a34a; + --bs-btn-hover-border-color: #05a34a; + --bs-btn-focus-shadow-rgb: 5, 163, 74; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #05a34a; + --bs-btn-active-border-color: #05a34a; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + --bs-btn-disabled-color: #05a34a; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #05a34a; + --bs-gradient: none +} + +.btn-outline-info { + --bs-btn-color: #66d1d1; + --bs-btn-border-color: #66d1d1; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #66d1d1; + --bs-btn-hover-border-color: #66d1d1; + --bs-btn-focus-shadow-rgb: 102, 209, 209; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #66d1d1; + --bs-btn-active-border-color: #66d1d1; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + --bs-btn-disabled-color: #66d1d1; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #66d1d1; + --bs-gradient: none +} + +.btn-outline-warning { + --bs-btn-color: #fbbc06; + --bs-btn-border-color: #fbbc06; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #fbbc06; + --bs-btn-hover-border-color: #fbbc06; + --bs-btn-focus-shadow-rgb: 251, 188, 6; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #fbbc06; + --bs-btn-active-border-color: #fbbc06; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + --bs-btn-disabled-color: #fbbc06; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #fbbc06; + --bs-gradient: none +} + +.btn-outline-danger { + --bs-btn-color: #f36; + --bs-btn-border-color: #f36; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #f36; + --bs-btn-hover-border-color: #f36; + --bs-btn-focus-shadow-rgb: 255, 51, 102; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #f36; + --bs-btn-active-border-color: #f36; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + --bs-btn-disabled-color: #f36; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #f36; + --bs-gradient: none +} + +.btn-outline-light { + --bs-btn-color: #e9ecef; + --bs-btn-border-color: #e9ecef; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #e9ecef; + --bs-btn-hover-border-color: #e9ecef; + --bs-btn-focus-shadow-rgb: 233, 236, 239; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #e9ecef; + --bs-btn-active-border-color: #e9ecef; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + --bs-btn-disabled-color: #e9ecef; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #e9ecef; + --bs-gradient: none +} + +.btn-outline-dark { + --bs-btn-color: #060c17; + --bs-btn-border-color: #060c17; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #060c17; + --bs-btn-hover-border-color: #060c17; + --bs-btn-focus-shadow-rgb: 6, 12, 23; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #060c17; + --bs-btn-active-border-color: #060c17; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + --bs-btn-disabled-color: #060c17; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #060c17; + --bs-gradient: none +} + +.btn-link { + --bs-btn-font-weight: 400; + --bs-btn-color: var(--bs-link-color); + --bs-btn-bg: transparent; + --bs-btn-border-color: transparent; + --bs-btn-hover-color: var(--bs-link-hover-color); + --bs-btn-hover-border-color: transparent; + --bs-btn-active-color: var(--bs-link-hover-color); + --bs-btn-active-border-color: transparent; + --bs-btn-disabled-color: #7987a1; + --bs-btn-disabled-border-color: transparent; + --bs-btn-box-shadow: none; + --bs-btn-focus-shadow-rgb: 124, 134, 255; + text-decoration: none +} + +.btn-link:focus-visible { + color: var(--bs-btn-color) +} + +.btn-link:hover { + color: var(--bs-btn-hover-color) +} + +.btn-group-lg > .btn, .btn-lg, .swal2-popup .swal2-actions .btn-group-lg > button, .wizard > .actions .btn-group-lg > a, div.fc .btn-group-lg > .fc-button-primary, div.tox .btn-group-lg > .tox-button { + --bs-btn-padding-y: 0.5rem; + --bs-btn-padding-x: 0.8rem; + --bs-btn-font-size: 1rem; + --bs-btn-border-radius: 0.25rem +} + +.btn-group-sm > .btn, .btn-sm, .swal2-popup .swal2-actions .btn-group-sm > button, .wizard > .actions .btn-group-sm > a, div.fc .fc-button-primary, div.tox .btn-group-sm > .tox-button { + --bs-btn-padding-y: 0.391rem; + --bs-btn-padding-x: 0.8rem; + --bs-btn-font-size: 0.812rem; + --bs-btn-border-radius: 0.25rem +} + +.fade { + transition: opacity .15s linear +} + +@media (prefers-reduced-motion: reduce) { + .fade { + transition: none + } +} + +.fade:not(.show) { + opacity: 0 +} + +.collapse:not(.show) { + display: none +} + +.collapsing { + height: 0; + overflow: hidden; + transition: height .35s ease +} + +@media (prefers-reduced-motion: reduce) { + .collapsing { + transition: none + } +} + +.collapsing.collapse-horizontal { + height: auto; + transition: width .35s ease; + width: 0 +} + +@media (prefers-reduced-motion: reduce) { + .collapsing.collapse-horizontal { + transition: none + } +} + +.dropdown, .dropdown-center, .dropend, .dropstart, .dropup, .dropup-center { + position: relative +} + +.dropdown-toggle { + white-space: nowrap +} + +.dropdown-toggle:after { + border-bottom: 0; + border-left: .3em solid transparent; + border-right: .3em solid transparent; + border-top: .3em solid; + content: ""; + display: inline-block; + margin-left: .255em; + vertical-align: .255em +} + +.dropdown-toggle:empty:after { + margin-left: 0 +} + +.dropdown-menu, .tt-menu { + --bs-dropdown-zindex: 1000; + --bs-dropdown-min-width: 10rem; + --bs-dropdown-padding-x: 0; + --bs-dropdown-padding-y: 0.5rem; + --bs-dropdown-spacer: 0.125rem; + --bs-dropdown-font-size: 0.875rem; + --bs-dropdown-color: #000; + --bs-dropdown-bg: #fff; + --bs-dropdown-border-color: #f2f4f9; + --bs-dropdown-border-radius: 0.25rem; + --bs-dropdown-border-width: 1px; + --bs-dropdown-inner-border-radius: calc(0.25rem - 1px); + --bs-dropdown-divider-bg: #f2f4f9; + --bs-dropdown-divider-margin-y: 0.5rem; + --bs-dropdown-box-shadow: 0 5px 10px 0 rgba(183, 192, 206, .2); + --bs-dropdown-link-color: #060c17; + --bs-dropdown-link-hover-color: #050b15; + --bs-dropdown-link-hover-bg: #e9ecef; + --bs-dropdown-link-active-color: #fff; + --bs-dropdown-link-active-bg: #6571ff; + --bs-dropdown-link-disabled-color: #adb5bd; + --bs-dropdown-item-padding-x: 1rem; + --bs-dropdown-item-padding-y: 0.25rem; + --bs-dropdown-header-color: #7987a1; + --bs-dropdown-header-padding-x: 1rem; + --bs-dropdown-header-padding-y: 0.5rem; + background-clip: padding-box; + background-color: var(--bs-dropdown-bg); + border: var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color); + border-radius: var(--bs-dropdown-border-radius); + color: var(--bs-dropdown-color); + display: none; + font-size: var(--bs-dropdown-font-size); + list-style: none; + margin: 0; + min-width: var(--bs-dropdown-min-width); + padding: var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x); + position: absolute; + text-align: left; + z-index: var(--bs-dropdown-zindex) +} + +.dropdown-menu[data-bs-popper], [data-bs-popper].tt-menu { + left: 0; + margin-top: var(--bs-dropdown-spacer); + top: 100% +} + +.dropdown-menu-start { + --bs-position: start +} + +.dropdown-menu-start[data-bs-popper] { + left: 0; + right: auto +} + +.dropdown-menu-end { + --bs-position: end +} + +.dropdown-menu-end[data-bs-popper] { + left: auto; + right: 0 +} + +@media (min-width: 576px) { + .dropdown-menu-sm-start { + --bs-position: start + } + + .dropdown-menu-sm-start[data-bs-popper] { + left: 0; + right: auto + } + + .dropdown-menu-sm-end { + --bs-position: end + } + + .dropdown-menu-sm-end[data-bs-popper] { + left: auto; + right: 0 + } +} + +@media (min-width: 768px) { + .dropdown-menu-md-start { + --bs-position: start + } + + .dropdown-menu-md-start[data-bs-popper] { + left: 0; + right: auto + } + + .dropdown-menu-md-end { + --bs-position: end + } + + .dropdown-menu-md-end[data-bs-popper] { + left: auto; + right: 0 + } +} + +@media (min-width: 992px) { + .dropdown-menu-lg-start { + --bs-position: start + } + + .dropdown-menu-lg-start[data-bs-popper] { + left: 0; + right: auto + } + + .dropdown-menu-lg-end { + --bs-position: end + } + + .dropdown-menu-lg-end[data-bs-popper] { + left: auto; + right: 0 + } +} + +@media (min-width: 1200px) { + .dropdown-menu-xl-start { + --bs-position: start + } + + .dropdown-menu-xl-start[data-bs-popper] { + left: 0; + right: auto + } + + .dropdown-menu-xl-end { + --bs-position: end + } + + .dropdown-menu-xl-end[data-bs-popper] { + left: auto; + right: 0 + } +} + +@media (min-width: 1400px) { + .dropdown-menu-xxl-start { + --bs-position: start + } + + .dropdown-menu-xxl-start[data-bs-popper] { + left: 0; + right: auto + } + + .dropdown-menu-xxl-end { + --bs-position: end + } + + .dropdown-menu-xxl-end[data-bs-popper] { + left: auto; + right: 0 + } +} + +.dropup .dropdown-menu[data-bs-popper], .dropup [data-bs-popper].tt-menu { + bottom: 100%; + margin-bottom: var(--bs-dropdown-spacer); + margin-top: 0; + top: auto +} + +.dropup .dropdown-toggle:after { + border-bottom: .3em solid; + border-left: .3em solid transparent; + border-right: .3em solid transparent; + border-top: 0; + content: ""; + display: inline-block; + margin-left: .255em; + vertical-align: .255em +} + +.dropup .dropdown-toggle:empty:after { + margin-left: 0 +} + +.dropend .dropdown-menu[data-bs-popper], .dropend [data-bs-popper].tt-menu { + left: 100%; + margin-left: var(--bs-dropdown-spacer); + margin-top: 0; + right: auto; + top: 0 +} + +.dropend .dropdown-toggle:after { + border-bottom: .3em solid transparent; + border-left: .3em solid; + border-right: 0; + border-top: .3em solid transparent; + content: ""; + display: inline-block; + margin-left: .255em; + vertical-align: .255em +} + +.dropend .dropdown-toggle:empty:after { + margin-left: 0 +} + +.dropend .dropdown-toggle:after { + vertical-align: 0 +} + +.dropstart .dropdown-menu[data-bs-popper], .dropstart [data-bs-popper].tt-menu { + left: auto; + margin-right: var(--bs-dropdown-spacer); + margin-top: 0; + right: 100%; + top: 0 +} + +.dropstart .dropdown-toggle:after { + content: ""; + display: inline-block; + display: none; + margin-left: .255em; + vertical-align: .255em +} + +.dropstart .dropdown-toggle:before { + border-bottom: .3em solid transparent; + border-right: .3em solid; + border-top: .3em solid transparent; + content: ""; + display: inline-block; + margin-right: .255em; + vertical-align: .255em +} + +.dropstart .dropdown-toggle:empty:after { + margin-left: 0 +} + +.dropstart .dropdown-toggle:before { + vertical-align: 0 +} + +.dropdown-divider { + border-top: 1px solid var(--bs-dropdown-divider-bg); + height: 0; + margin: var(--bs-dropdown-divider-margin-y) 0; + opacity: 1; + overflow: hidden +} + +.dropdown-item, .tt-menu .tt-suggestion { + background-color: transparent; + border: 0; + clear: both; + color: var(--bs-dropdown-link-color); + display: block; + font-weight: 400; + padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x); + text-align: inherit; + white-space: nowrap; + width: 100% +} + +.dropdown-item:focus, .dropdown-item:hover, .tt-menu .tt-suggestion:focus, .tt-menu .tt-suggestion:hover { + background-color: var(--bs-dropdown-link-hover-bg); + color: var(--bs-dropdown-link-hover-color) +} + +.dropdown-item.active, .dropdown-item:active, .tt-menu .active.tt-suggestion, .tt-menu .tt-suggestion:active { + background-color: var(--bs-dropdown-link-active-bg); + color: var(--bs-dropdown-link-active-color); + text-decoration: none +} + +.dropdown-item.disabled, .dropdown-item:disabled, .tt-menu .disabled.tt-suggestion, .tt-menu .tt-suggestion:disabled { + background-color: transparent; + color: var(--bs-dropdown-link-disabled-color); + pointer-events: none +} + +.dropdown-menu.show, .show.tt-menu { + display: block +} + +.dropdown-header { + color: var(--bs-dropdown-header-color); + display: block; + font-size: .812rem; + margin-bottom: 0; + padding: var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x); + white-space: nowrap +} + +.dropdown-item-text { + color: var(--bs-dropdown-link-color); + display: block; + padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x) +} + +.dropdown-menu-dark { + --bs-dropdown-color: #dee2e6; + --bs-dropdown-bg: #212a3a; + --bs-dropdown-border-color: #f2f4f9; + --bs-dropdown-box-shadow: ; + --bs-dropdown-link-color: #dee2e6; + --bs-dropdown-link-hover-color: #fff; + --bs-dropdown-divider-bg: #f2f4f9; + --bs-dropdown-link-hover-bg: hsla(0, 0%, 100%, .15); + --bs-dropdown-link-active-color: #fff; + --bs-dropdown-link-active-bg: #6571ff; + --bs-dropdown-link-disabled-color: #adb5bd; + --bs-dropdown-header-color: #adb5bd +} + +.btn-group, .btn-group-vertical { + display: inline-flex; + position: relative; + vertical-align: middle +} + +.btn-group-vertical > .btn, .btn-group > .btn, .swal2-popup .swal2-actions .btn-group-vertical > button, .swal2-popup .swal2-actions .btn-group > button, .wizard > .actions .btn-group-vertical > a, .wizard > .actions .btn-group > a, div.fc .btn-group-vertical > .fc-button-primary, div.fc .btn-group > .fc-button-primary, div.tox .btn-group-vertical > .tox-button, div.tox .btn-group > .tox-button { + flex: 1 1 auto; + position: relative +} + +.btn-group-vertical > .btn-check:checked + .btn, .btn-group-vertical > .btn-check:focus + .btn, .btn-group-vertical > .btn.active, .btn-group-vertical > .btn:active, .btn-group-vertical > .btn:focus, .btn-group-vertical > .btn:hover, .btn-group > .btn-check:checked + .btn, .btn-group > .btn-check:focus + .btn, .btn-group > .btn.active, .btn-group > .btn:active, .btn-group > .btn:focus, .btn-group > .btn:hover, .swal2-popup .swal2-actions .btn-group-vertical > .btn-check:checked + button, .swal2-popup .swal2-actions .btn-group-vertical > .btn-check:focus + button, .swal2-popup .swal2-actions .btn-group-vertical > button.active, .swal2-popup .swal2-actions .btn-group-vertical > button:active, .swal2-popup .swal2-actions .btn-group-vertical > button:focus, .swal2-popup .swal2-actions .btn-group-vertical > button:hover, .swal2-popup .swal2-actions .btn-group > .btn-check:checked + button, .swal2-popup .swal2-actions .btn-group > .btn-check:focus + button, .swal2-popup .swal2-actions .btn-group > button.active, .swal2-popup .swal2-actions .btn-group > button:active, .swal2-popup .swal2-actions .btn-group > button:focus, .swal2-popup .swal2-actions .btn-group > button:hover, .wizard > .actions .btn-group-vertical > .btn-check:checked + a, .wizard > .actions .btn-group-vertical > .btn-check:focus + a, .wizard > .actions .btn-group-vertical > a.active, .wizard > .actions .btn-group-vertical > a:active, .wizard > .actions .btn-group-vertical > a:focus, .wizard > .actions .btn-group-vertical > a:hover, .wizard > .actions .btn-group > .btn-check:checked + a, .wizard > .actions .btn-group > .btn-check:focus + a, .wizard > .actions .btn-group > a.active, .wizard > .actions .btn-group > a:active, .wizard > .actions .btn-group > a:focus, .wizard > .actions .btn-group > a:hover, div.fc .btn-group-vertical > .active.fc-button-primary, div.fc .btn-group-vertical > .btn-check:checked + .fc-button-primary, div.fc .btn-group-vertical > .btn-check:focus + .fc-button-primary, div.fc .btn-group-vertical > .fc-button-primary:active, div.fc .btn-group-vertical > .fc-button-primary:focus, div.fc .btn-group-vertical > .fc-button-primary:hover, div.fc .btn-group > .active.fc-button-primary, div.fc .btn-group > .btn-check:checked + .fc-button-primary, div.fc .btn-group > .btn-check:focus + .fc-button-primary, div.fc .btn-group > .fc-button-primary:active, div.fc .btn-group > .fc-button-primary:focus, div.fc .btn-group > .fc-button-primary:hover, div.tox .btn-group-vertical > .active.tox-button, div.tox .btn-group-vertical > .btn-check:checked + .tox-button, div.tox .btn-group-vertical > .btn-check:focus + .tox-button, div.tox .btn-group-vertical > .tox-button:active, div.tox .btn-group-vertical > .tox-button:focus, div.tox .btn-group-vertical > .tox-button:hover, div.tox .btn-group > .active.tox-button, div.tox .btn-group > .btn-check:checked + .tox-button, div.tox .btn-group > .btn-check:focus + .tox-button, div.tox .btn-group > .tox-button:active, div.tox .btn-group > .tox-button:focus, div.tox .btn-group > .tox-button:hover { + z-index: 1 +} + +.btn-toolbar { + display: flex; + flex-wrap: wrap; + justify-content: flex-start +} + +.btn-toolbar .input-group { + width: auto +} + +.btn-group { + border-radius: .25rem +} + +.btn-group > .btn-group:not(:first-child), .btn-group > :not(.btn-check:first-child) + .btn, .swal2-popup .swal2-actions .btn-group > :not(.btn-check:first-child) + button, .wizard > .actions .btn-group > :not(.btn-check:first-child) + a, div.fc .btn-group > :not(.btn-check:first-child) + .fc-button-primary, div.tox .btn-group > :not(.btn-check:first-child) + .tox-button { + margin-left: -1px +} + +.btn-group > .btn-group:not(:last-child) > .btn, .btn-group > .btn.dropdown-toggle-split:first-child, .btn-group > .btn:not(:last-child):not(.dropdown-toggle), .swal2-popup .swal2-actions .btn-group > .btn-group:not(:last-child) > button, .swal2-popup .swal2-actions .btn-group > button.dropdown-toggle-split:first-child, .swal2-popup .swal2-actions .btn-group > button:not(:last-child):not(.dropdown-toggle), .wizard > .actions .btn-group > .btn-group:not(:last-child) > a, .wizard > .actions .btn-group > a.dropdown-toggle-split:first-child, .wizard > .actions .btn-group > a:not(:last-child):not(.dropdown-toggle), div.fc .btn-group > .btn-group:not(:last-child) > .fc-button-primary, div.fc .btn-group > .dropdown-toggle-split.fc-button-primary:first-child, div.fc .btn-group > .fc-button-primary:not(:last-child):not(.dropdown-toggle), div.tox .btn-group > .btn-group:not(:last-child) > .tox-button, div.tox .btn-group > .dropdown-toggle-split.tox-button:first-child, div.tox .btn-group > .tox-button:not(:last-child):not(.dropdown-toggle) { + border-bottom-right-radius: 0; + border-top-right-radius: 0 +} + +.btn-group > .btn-group:not(:first-child) > .btn, .btn-group > .btn:nth-child(n+3), .btn-group > :not(.btn-check) + .btn, .swal2-popup .swal2-actions .btn-group > .btn-group:not(:first-child) > button, .swal2-popup .swal2-actions .btn-group > :not(.btn-check) + button, .swal2-popup .swal2-actions .btn-group > button:nth-child(n+3), .wizard > .actions .btn-group > .btn-group:not(:first-child) > a, .wizard > .actions .btn-group > :not(.btn-check) + a, .wizard > .actions .btn-group > a:nth-child(n+3), div.fc .btn-group > .btn-group:not(:first-child) > .fc-button-primary, div.fc .btn-group > .fc-button-primary:nth-child(n+3), div.fc .btn-group > :not(.btn-check) + .fc-button-primary, div.tox .btn-group > .btn-group:not(:first-child) > .tox-button, div.tox .btn-group > .tox-button:nth-child(n+3), div.tox .btn-group > :not(.btn-check) + .tox-button { + border-bottom-left-radius: 0; + border-top-left-radius: 0 +} + +.dropdown-toggle-split { + padding-left: .6rem; + padding-right: .6rem +} + +.dropdown-toggle-split:after, .dropend .dropdown-toggle-split:after, .dropup .dropdown-toggle-split:after { + margin-left: 0 +} + +.dropstart .dropdown-toggle-split:before { + margin-right: 0 +} + +.btn-group-lg > .btn + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split, .btn-lg + .dropdown-toggle-split, .btn-sm + .dropdown-toggle-split, .swal2-popup .swal2-actions .btn-group-lg > button + .dropdown-toggle-split, .swal2-popup .swal2-actions .btn-group-sm > button + .dropdown-toggle-split, .wizard > .actions .btn-group-lg > a + .dropdown-toggle-split, .wizard > .actions .btn-group-sm > a + .dropdown-toggle-split, div.fc .btn-group-lg > .fc-button-primary + .dropdown-toggle-split, div.fc .fc-button-primary + .dropdown-toggle-split, div.tox .btn-group-lg > .tox-button + .dropdown-toggle-split, div.tox .btn-group-sm > .tox-button + .dropdown-toggle-split { + padding-left: .6rem; + padding-right: .6rem +} + +.btn-group-vertical { + align-items: flex-start; + flex-direction: column; + justify-content: center +} + +.btn-group-vertical > .btn, .btn-group-vertical > .btn-group, .swal2-popup .swal2-actions .btn-group-vertical > button, .wizard > .actions .btn-group-vertical > a, div.fc .btn-group-vertical > .fc-button-primary, div.tox .btn-group-vertical > .tox-button { + width: 100% +} + +.btn-group-vertical > .btn-group:not(:first-child), .btn-group-vertical > .btn:not(:first-child), .swal2-popup .swal2-actions .btn-group-vertical > button:not(:first-child), .wizard > .actions .btn-group-vertical > a:not(:first-child), div.fc .btn-group-vertical > .fc-button-primary:not(:first-child), div.tox .btn-group-vertical > .tox-button:not(:first-child) { + margin-top: -1px +} + +.btn-group-vertical > .btn-group:not(:last-child) > .btn, .btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle), .swal2-popup .swal2-actions .btn-group-vertical > .btn-group:not(:last-child) > button, .swal2-popup .swal2-actions .btn-group-vertical > button:not(:last-child):not(.dropdown-toggle), .wizard > .actions .btn-group-vertical > .btn-group:not(:last-child) > a, .wizard > .actions .btn-group-vertical > a:not(:last-child):not(.dropdown-toggle), div.fc .btn-group-vertical > .btn-group:not(:last-child) > .fc-button-primary, div.fc .btn-group-vertical > .fc-button-primary:not(:last-child):not(.dropdown-toggle), div.tox .btn-group-vertical > .btn-group:not(:last-child) > .tox-button, div.tox .btn-group-vertical > .tox-button:not(:last-child):not(.dropdown-toggle) { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0 +} + +.btn-group-vertical > .btn-group:not(:first-child) > .btn, .btn-group-vertical > .btn ~ .btn, .swal2-popup .swal2-actions .btn-group-vertical > .btn-group:not(:first-child) > button, .swal2-popup .swal2-actions .btn-group-vertical > .btn ~ button, .swal2-popup .swal2-actions .btn-group-vertical > button ~ .btn, .swal2-popup .swal2-actions .btn-group-vertical > button ~ button, .swal2-popup .swal2-actions .wizard > .actions .btn-group-vertical > a ~ button, .swal2-popup .swal2-actions .wizard > .actions .btn-group-vertical > button ~ a, .swal2-popup .swal2-actions div.fc .btn-group-vertical > .fc-button-primary ~ button, .swal2-popup .swal2-actions div.fc .btn-group-vertical > button ~ .fc-button-primary, .swal2-popup .swal2-actions div.tox .btn-group-vertical > .tox-button ~ button, .swal2-popup .swal2-actions div.tox .btn-group-vertical > button ~ .tox-button, .wizard > .actions .btn-group-vertical > .btn-group:not(:first-child) > a, .wizard > .actions .btn-group-vertical > .btn ~ a, .wizard > .actions .btn-group-vertical > a ~ .btn, .wizard > .actions .btn-group-vertical > a ~ a, .wizard > .actions .swal2-popup .swal2-actions .btn-group-vertical > a ~ button, .wizard > .actions .swal2-popup .swal2-actions .btn-group-vertical > button ~ a, .wizard > .actions div.fc .btn-group-vertical > .fc-button-primary ~ a, .wizard > .actions div.fc .btn-group-vertical > a ~ .fc-button-primary, .wizard > .actions div.tox .btn-group-vertical > .tox-button ~ a, .wizard > .actions div.tox .btn-group-vertical > a ~ .tox-button, div.fc .btn-group-vertical > .btn-group:not(:first-child) > .fc-button-primary, div.fc .btn-group-vertical > .btn ~ .fc-button-primary, div.fc .btn-group-vertical > .fc-button-primary ~ .btn, div.fc .btn-group-vertical > .fc-button-primary ~ .fc-button-primary, div.fc .swal2-popup .swal2-actions .btn-group-vertical > .fc-button-primary ~ button, div.fc .swal2-popup .swal2-actions .btn-group-vertical > button ~ .fc-button-primary, div.fc .wizard > .actions .btn-group-vertical > .fc-button-primary ~ a, div.fc .wizard > .actions .btn-group-vertical > a ~ .fc-button-primary, div.fc div.tox .btn-group-vertical > .fc-button-primary ~ .tox-button, div.fc div.tox .btn-group-vertical > .tox-button ~ .fc-button-primary, div.tox .btn-group-vertical > .btn-group:not(:first-child) > .tox-button, div.tox .btn-group-vertical > .btn ~ .tox-button, div.tox .btn-group-vertical > .tox-button ~ .btn, div.tox .btn-group-vertical > .tox-button ~ .tox-button, div.tox .swal2-popup .swal2-actions .btn-group-vertical > .tox-button ~ button, div.tox .swal2-popup .swal2-actions .btn-group-vertical > button ~ .tox-button, div.tox .wizard > .actions .btn-group-vertical > .tox-button ~ a, div.tox .wizard > .actions .btn-group-vertical > a ~ .tox-button, div.tox div.fc .btn-group-vertical > .fc-button-primary ~ .tox-button, div.tox div.fc .btn-group-vertical > .tox-button ~ .fc-button-primary { + border-top-left-radius: 0; + border-top-right-radius: 0 +} + +.nav { + --bs-nav-link-padding-x: 1rem; + --bs-nav-link-padding-y: 0.5rem; + --bs-nav-link-font-weight: ; + --bs-nav-link-color: var(--bs-link-color); + --bs-nav-link-hover-color: var(--bs-link-hover-color); + --bs-nav-link-disabled-color: #7987a1; + display: flex; + flex-wrap: wrap; + list-style: none; + margin-bottom: 0; + padding-left: 0 +} + +.nav-link { + color: var(--bs-nav-link-color); + display: block; + font-size: var(--bs-nav-link-font-size); + font-weight: var(--bs-nav-link-font-weight); + padding: var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x); + transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out +} + +@media (prefers-reduced-motion: reduce) { + .nav-link { + transition: none + } +} + +.nav-link:focus, .nav-link:hover { + color: var(--bs-nav-link-hover-color) +} + +.nav-link.disabled { + color: var(--bs-nav-link-disabled-color); + cursor: default; + pointer-events: none +} + +.nav-tabs { + --bs-nav-tabs-border-width: 1px; + --bs-nav-tabs-border-color: #dee2e6; + --bs-nav-tabs-border-radius: 0.25rem; + --bs-nav-tabs-link-hover-border-color: #e9ecef #e9ecef #dee2e6; + --bs-nav-tabs-link-active-color: #495057; + --bs-nav-tabs-link-active-bg: #fff; + --bs-nav-tabs-link-active-border-color: #dee2e6 #dee2e6 #fff; + border-bottom: var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color) +} + +.nav-tabs .nav-link { + background: none; + border: var(--bs-nav-tabs-border-width) solid transparent; + border-top-left-radius: var(--bs-nav-tabs-border-radius); + border-top-right-radius: var(--bs-nav-tabs-border-radius); + margin-bottom: calc(var(--bs-nav-tabs-border-width) * -1) +} + +.nav-tabs .nav-link:focus, .nav-tabs .nav-link:hover { + border-color: var(--bs-nav-tabs-link-hover-border-color); + isolation: isolate +} + +.nav-tabs .nav-link.disabled, .nav-tabs .nav-link:disabled { + background-color: transparent; + border-color: transparent; + color: var(--bs-nav-link-disabled-color) +} + +.nav-tabs .nav-item.show .nav-link, .nav-tabs .nav-link.active { + background-color: var(--bs-nav-tabs-link-active-bg); + border-color: var(--bs-nav-tabs-link-active-border-color); + color: var(--bs-nav-tabs-link-active-color) +} + +.nav-tabs .dropdown-menu, .nav-tabs .tt-menu { + border-top-left-radius: 0; + border-top-right-radius: 0; + margin-top: calc(var(--bs-nav-tabs-border-width) * -1) +} + +.nav-pills { + --bs-nav-pills-border-radius: 0.25rem; + --bs-nav-pills-link-active-color: #fff; + --bs-nav-pills-link-active-bg: #6571ff +} + +.nav-pills .nav-link { + background: none; + border: 0; + border-radius: var(--bs-nav-pills-border-radius) +} + +.nav-pills .nav-link:disabled { + background-color: transparent; + border-color: transparent; + color: var(--bs-nav-link-disabled-color) +} + +.nav-pills .nav-link.active, .nav-pills .show > .nav-link { + background-color: var(--bs-nav-pills-link-active-bg); + color: var(--bs-nav-pills-link-active-color) +} + +.nav-fill .nav-item, .nav-fill > .nav-link { + flex: 1 1 auto; + text-align: center +} + +.nav-justified .nav-item, .nav-justified > .nav-link { + flex-basis: 0; + flex-grow: 1; + text-align: center +} + +.nav-fill .nav-item .nav-link, .nav-justified .nav-item .nav-link { + width: 100% +} + +.tab-content > .tab-pane { + display: none +} + +.tab-content > .active { + display: block +} + +.navbar { + --bs-navbar-padding-x: 0; + --bs-navbar-padding-y: 0.5rem; + --bs-navbar-color: rgba(0, 0, 0, .55); + --bs-navbar-hover-color: rgba(0, 0, 0, .7); + --bs-navbar-disabled-color: rgba(0, 0, 0, .3); + --bs-navbar-active-color: rgba(0, 0, 0, .9); + --bs-navbar-brand-padding-y: 0.40625rem; + --bs-navbar-brand-margin-end: 1rem; + --bs-navbar-brand-font-size: 1rem; + --bs-navbar-brand-color: rgba(0, 0, 0, .9); + --bs-navbar-brand-hover-color: rgba(0, 0, 0, .9); + --bs-navbar-nav-link-padding-x: 0.5rem; + --bs-navbar-toggler-padding-y: 0.25rem; + --bs-navbar-toggler-padding-x: 0.75rem; + --bs-navbar-toggler-font-size: 1rem; + --bs-navbar-toggler-icon-bg: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3E%3Cpath stroke='rgba(0, 0, 0, 0.55)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E"); + --bs-navbar-toggler-border-color: rgba(0, 0, 0, .1); + --bs-navbar-toggler-border-radius: 0.25rem; + --bs-navbar-toggler-focus-width: 0; + --bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out; + align-items: center; + display: flex; + flex-wrap: wrap; + justify-content: space-between; + padding: var(--bs-navbar-padding-y) var(--bs-navbar-padding-x); + position: relative +} + +.navbar > .container, .navbar > .container-fluid, .navbar > .container-lg, .navbar > .container-md, .navbar > .container-sm, .navbar > .container-xl, .navbar > .container-xxl, .page-wrapper .navbar > .page-content { + align-items: center; + display: flex; + flex-wrap: inherit; + justify-content: space-between +} + +.navbar-brand { + color: var(--bs-navbar-brand-color); + font-size: var(--bs-navbar-brand-font-size); + margin-right: var(--bs-navbar-brand-margin-end); + padding-bottom: var(--bs-navbar-brand-padding-y); + padding-top: var(--bs-navbar-brand-padding-y); + white-space: nowrap +} + +.navbar-brand:focus, .navbar-brand:hover { + color: var(--bs-navbar-brand-hover-color) +} + +.navbar-nav { + --bs-nav-link-padding-x: 0; + --bs-nav-link-padding-y: 0.5rem; + --bs-nav-link-font-weight: ; + --bs-nav-link-color: var(--bs-navbar-color); + --bs-nav-link-hover-color: var(--bs-navbar-hover-color); + --bs-nav-link-disabled-color: var(--bs-navbar-disabled-color); + display: flex; + flex-direction: column; + list-style: none; + margin-bottom: 0; + padding-left: 0 +} + +.navbar-nav .nav-link.active, .navbar-nav .show > .nav-link { + color: var(--bs-navbar-active-color) +} + +.navbar-nav .dropdown-menu, .navbar-nav .tt-menu { + position: static +} + +.navbar-text { + color: var(--bs-navbar-color); + padding-bottom: .5rem; + padding-top: .5rem +} + +.navbar-text a, .navbar-text a:focus, .navbar-text a:hover { + color: var(--bs-navbar-active-color) +} + +.navbar-collapse { + align-items: center; + flex-basis: 100%; + flex-grow: 1 +} + +.navbar-toggler { + background-color: transparent; + border: var(--bs-border-width) solid var(--bs-navbar-toggler-border-color); + border-radius: var(--bs-navbar-toggler-border-radius); + color: var(--bs-navbar-color); + font-size: var(--bs-navbar-toggler-font-size); + line-height: 1; + padding: var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x); + transition: var(--bs-navbar-toggler-transition) +} + +@media (prefers-reduced-motion: reduce) { + .navbar-toggler { + transition: none + } +} + +.navbar-toggler:hover { + text-decoration: none +} + +.navbar-toggler:focus { + box-shadow: 0 0 0 var(--bs-navbar-toggler-focus-width); + outline: 0; + text-decoration: none +} + +.navbar-toggler-icon { + background-image: var(--bs-navbar-toggler-icon-bg); + background-position: 50%; + background-repeat: no-repeat; + background-size: 100%; + display: inline-block; + height: 1.5em; + vertical-align: middle; + width: 1.5em +} + +.navbar-nav-scroll { + max-height: var(--bs-scroll-height, 75vh); + overflow-y: auto +} + +@media (min-width: 576px) { + .navbar-expand-sm { + flex-wrap: nowrap; + justify-content: flex-start + } + + .navbar-expand-sm .navbar-nav { + flex-direction: row + } + + .navbar-expand-sm .navbar-nav .dropdown-menu, .navbar-expand-sm .navbar-nav .tt-menu { + position: absolute + } + + .navbar-expand-sm .navbar-nav .nav-link { + padding-left: var(--bs-navbar-nav-link-padding-x); + padding-right: var(--bs-navbar-nav-link-padding-x) + } + + .navbar-expand-sm .navbar-nav-scroll { + overflow: visible + } + + .navbar-expand-sm .navbar-collapse { + display: flex !important; + flex-basis: auto + } + + .navbar-expand-sm .navbar-toggler { + display: none + } + + .navbar-expand-sm .offcanvas { + background-color: transparent !important; + border: 0 !important; + flex-grow: 1; + height: auto !important; + position: static; + transform: none !important; + transition: none; + visibility: visible !important; + width: auto !important; + z-index: auto + } + + .navbar-expand-sm .offcanvas .offcanvas-header { + display: none + } + + .navbar-expand-sm .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + overflow-y: visible; + padding: 0 + } +} + +@media (min-width: 768px) { + .navbar-expand-md { + flex-wrap: nowrap; + justify-content: flex-start + } + + .navbar-expand-md .navbar-nav { + flex-direction: row + } + + .navbar-expand-md .navbar-nav .dropdown-menu, .navbar-expand-md .navbar-nav .tt-menu { + position: absolute + } + + .navbar-expand-md .navbar-nav .nav-link { + padding-left: var(--bs-navbar-nav-link-padding-x); + padding-right: var(--bs-navbar-nav-link-padding-x) + } + + .navbar-expand-md .navbar-nav-scroll { + overflow: visible + } + + .navbar-expand-md .navbar-collapse { + display: flex !important; + flex-basis: auto + } + + .navbar-expand-md .navbar-toggler { + display: none + } + + .navbar-expand-md .offcanvas { + background-color: transparent !important; + border: 0 !important; + flex-grow: 1; + height: auto !important; + position: static; + transform: none !important; + transition: none; + visibility: visible !important; + width: auto !important; + z-index: auto + } + + .navbar-expand-md .offcanvas .offcanvas-header { + display: none + } + + .navbar-expand-md .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + overflow-y: visible; + padding: 0 + } +} + +@media (min-width: 992px) { + .navbar-expand-lg { + flex-wrap: nowrap; + justify-content: flex-start + } + + .navbar-expand-lg .navbar-nav { + flex-direction: row + } + + .navbar-expand-lg .navbar-nav .dropdown-menu, .navbar-expand-lg .navbar-nav .tt-menu { + position: absolute + } + + .navbar-expand-lg .navbar-nav .nav-link { + padding-left: var(--bs-navbar-nav-link-padding-x); + padding-right: var(--bs-navbar-nav-link-padding-x) + } + + .navbar-expand-lg .navbar-nav-scroll { + overflow: visible + } + + .navbar-expand-lg .navbar-collapse { + display: flex !important; + flex-basis: auto + } + + .navbar-expand-lg .navbar-toggler { + display: none + } + + .navbar-expand-lg .offcanvas { + background-color: transparent !important; + border: 0 !important; + flex-grow: 1; + height: auto !important; + position: static; + transform: none !important; + transition: none; + visibility: visible !important; + width: auto !important; + z-index: auto + } + + .navbar-expand-lg .offcanvas .offcanvas-header { + display: none + } + + .navbar-expand-lg .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + overflow-y: visible; + padding: 0 + } +} + +@media (min-width: 1200px) { + .navbar-expand-xl { + flex-wrap: nowrap; + justify-content: flex-start + } + + .navbar-expand-xl .navbar-nav { + flex-direction: row + } + + .navbar-expand-xl .navbar-nav .dropdown-menu, .navbar-expand-xl .navbar-nav .tt-menu { + position: absolute + } + + .navbar-expand-xl .navbar-nav .nav-link { + padding-left: var(--bs-navbar-nav-link-padding-x); + padding-right: var(--bs-navbar-nav-link-padding-x) + } + + .navbar-expand-xl .navbar-nav-scroll { + overflow: visible + } + + .navbar-expand-xl .navbar-collapse { + display: flex !important; + flex-basis: auto + } + + .navbar-expand-xl .navbar-toggler { + display: none + } + + .navbar-expand-xl .offcanvas { + background-color: transparent !important; + border: 0 !important; + flex-grow: 1; + height: auto !important; + position: static; + transform: none !important; + transition: none; + visibility: visible !important; + width: auto !important; + z-index: auto + } + + .navbar-expand-xl .offcanvas .offcanvas-header { + display: none + } + + .navbar-expand-xl .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + overflow-y: visible; + padding: 0 + } +} + +@media (min-width: 1400px) { + .navbar-expand-xxl { + flex-wrap: nowrap; + justify-content: flex-start + } + + .navbar-expand-xxl .navbar-nav { + flex-direction: row + } + + .navbar-expand-xxl .navbar-nav .dropdown-menu, .navbar-expand-xxl .navbar-nav .tt-menu { + position: absolute + } + + .navbar-expand-xxl .navbar-nav .nav-link { + padding-left: var(--bs-navbar-nav-link-padding-x); + padding-right: var(--bs-navbar-nav-link-padding-x) + } + + .navbar-expand-xxl .navbar-nav-scroll { + overflow: visible + } + + .navbar-expand-xxl .navbar-collapse { + display: flex !important; + flex-basis: auto + } + + .navbar-expand-xxl .navbar-toggler { + display: none + } + + .navbar-expand-xxl .offcanvas { + background-color: transparent !important; + border: 0 !important; + flex-grow: 1; + height: auto !important; + position: static; + transform: none !important; + transition: none; + visibility: visible !important; + width: auto !important; + z-index: auto + } + + .navbar-expand-xxl .offcanvas .offcanvas-header { + display: none + } + + .navbar-expand-xxl .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + overflow-y: visible; + padding: 0 + } +} + +.navbar-expand { + flex-wrap: nowrap; + justify-content: flex-start +} + +.navbar-expand .navbar-nav { + flex-direction: row +} + +.navbar-expand .navbar-nav .dropdown-menu, .navbar-expand .navbar-nav .tt-menu { + position: absolute +} + +.navbar-expand .navbar-nav .nav-link { + padding-left: var(--bs-navbar-nav-link-padding-x); + padding-right: var(--bs-navbar-nav-link-padding-x) +} + +.navbar-expand .navbar-nav-scroll { + overflow: visible +} + +.navbar-expand .navbar-collapse { + display: flex !important; + flex-basis: auto +} + +.navbar-expand .navbar-toggler { + display: none +} + +.navbar-expand .offcanvas { + background-color: transparent !important; + border: 0 !important; + flex-grow: 1; + height: auto !important; + position: static; + transform: none !important; + transition: none; + visibility: visible !important; + width: auto !important; + z-index: auto +} + +.navbar-expand .offcanvas .offcanvas-header { + display: none +} + +.navbar-expand .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + overflow-y: visible; + padding: 0 +} + +.navbar-dark { + --bs-navbar-color: hsla(0, 0%, 100%, .55); + --bs-navbar-hover-color: hsla(0, 0%, 100%, .75); + --bs-navbar-disabled-color: hsla(0, 0%, 100%, .25); + --bs-navbar-active-color: #fff; + --bs-navbar-brand-color: #fff; + --bs-navbar-brand-hover-color: #fff; + --bs-navbar-toggler-border-color: hsla(0, 0%, 100%, .1); + --bs-navbar-toggler-icon-bg: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3E%3Cpath stroke='rgba(255, 255, 255, 0.55)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E") +} + +.card { + --bs-card-spacer-y: 1.5rem; + --bs-card-spacer-x: 1.5rem; + --bs-card-title-spacer-y: 0.875rem; + --bs-card-border-width: 1px; + --bs-card-border-color: #f2f4f9; + --bs-card-border-radius: 0.25rem; + --bs-card-box-shadow: 0 0 10px 0 rgba(183, 192, 206, .2); + --bs-card-inner-border-radius: calc(0.25rem - 1px); + --bs-card-cap-padding-y: 0.875rem; + --bs-card-cap-padding-x: 1.5rem; + --bs-card-cap-bg: rgba(0, 0, 0, .01); + --bs-card-cap-color: ; + --bs-card-height: ; + --bs-card-color: ; + --bs-card-bg: #fff; + --bs-card-img-overlay-padding: 1rem; + --bs-card-group-margin: 0.75rem; + word-wrap: break-word; + background-clip: border-box; + background-color: var(--bs-card-bg); + border: var(--bs-card-border-width) solid var(--bs-card-border-color); + border-radius: var(--bs-card-border-radius); + display: flex; + flex-direction: column; + height: var(--bs-card-height); + min-width: 0; + position: relative +} + +.card > hr { + margin-left: 0; + margin-right: 0 +} + +.card > .list-group { + border-bottom: inherit; + border-top: inherit +} + +.card > .list-group:first-child { + border-top-left-radius: var(--bs-card-inner-border-radius); + border-top-right-radius: var(--bs-card-inner-border-radius); + border-top-width: 0 +} + +.card > .list-group:last-child { + border-bottom-left-radius: var(--bs-card-inner-border-radius); + border-bottom-right-radius: var(--bs-card-inner-border-radius); + border-bottom-width: 0 +} + +.card > .card-header + .list-group, .card > .list-group + .card-footer { + border-top: 0 +} + +.card-body { + color: var(--bs-card-color); + flex: 1 1 auto; + padding: var(--bs-card-spacer-y) var(--bs-card-spacer-x) +} + +.card-title { + margin-bottom: var(--bs-card-title-spacer-y) +} + +.card-subtitle { + margin-top: calc(var(--bs-card-title-spacer-y) * -.5) +} + +.card-subtitle, .card-text:last-child { + margin-bottom: 0 +} + +.card-link + .card-link { + margin-left: var(--bs-card-spacer-x) +} + +.card-header { + background-color: var(--bs-card-cap-bg); + border-bottom: var(--bs-card-border-width) solid var(--bs-card-border-color); + color: var(--bs-card-cap-color); + margin-bottom: 0; + padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x) +} + +.card-header:first-child { + border-radius: var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0 +} + +.card-footer { + background-color: var(--bs-card-cap-bg); + border-top: var(--bs-card-border-width) solid var(--bs-card-border-color); + color: var(--bs-card-cap-color); + padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x) +} + +.card-footer:last-child { + border-radius: 0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) +} + +.card-header-tabs { + border-bottom: 0; + margin-bottom: calc(var(--bs-card-cap-padding-y) * -1); + margin-left: calc(var(--bs-card-cap-padding-x) * -.5); + margin-right: calc(var(--bs-card-cap-padding-x) * -.5) +} + +.card-header-tabs .nav-link.active { + background-color: var(--bs-card-bg); + border-bottom-color: var(--bs-card-bg) +} + +.card-header-pills { + margin-left: calc(var(--bs-card-cap-padding-x) * -.5); + margin-right: calc(var(--bs-card-cap-padding-x) * -.5) +} + +.card-img-overlay { + border-radius: var(--bs-card-inner-border-radius); + bottom: 0; + left: 0; + padding: var(--bs-card-img-overlay-padding); + position: absolute; + right: 0; + top: 0 +} + +.card-img, .card-img-bottom, .card-img-top { + width: 100% +} + +.card-img, .card-img-top { + border-top-left-radius: var(--bs-card-inner-border-radius); + border-top-right-radius: var(--bs-card-inner-border-radius) +} + +.card-img, .card-img-bottom { + border-bottom-left-radius: var(--bs-card-inner-border-radius); + border-bottom-right-radius: var(--bs-card-inner-border-radius) +} + +.card-group > .card { + margin-bottom: var(--bs-card-group-margin) +} + +@media (min-width: 576px) { + .card-group { + display: flex; + flex-flow: row wrap + } + + .card-group > .card { + flex: 1 0 0%; + margin-bottom: 0 + } + + .card-group > .card + .card { + border-left: 0; + margin-left: 0 + } + + .card-group > .card:not(:last-child) { + border-bottom-right-radius: 0; + border-top-right-radius: 0 + } + + .card-group > .card:not(:last-child) .card-header, .card-group > .card:not(:last-child) .card-img-top { + border-top-right-radius: 0 + } + + .card-group > .card:not(:last-child) .card-footer, .card-group > .card:not(:last-child) .card-img-bottom { + border-bottom-right-radius: 0 + } + + .card-group > .card:not(:first-child) { + border-bottom-left-radius: 0; + border-top-left-radius: 0 + } + + .card-group > .card:not(:first-child) .card-header, .card-group > .card:not(:first-child) .card-img-top { + border-top-left-radius: 0 + } + + .card-group > .card:not(:first-child) .card-footer, .card-group > .card:not(:first-child) .card-img-bottom { + border-bottom-left-radius: 0 + } +} + +.accordion { + --bs-accordion-color: #000; + --bs-accordion-bg: #fff; + --bs-accordion-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease; + --bs-accordion-border-color: #e9ecef; + --bs-accordion-border-width: 1px; + --bs-accordion-border-radius: 0.25rem; + --bs-accordion-inner-border-radius: calc(0.25rem - 1px); + --bs-accordion-btn-padding-x: 1.25rem; + --bs-accordion-btn-padding-y: 1rem; + --bs-accordion-btn-color: #000; + --bs-accordion-btn-bg: var(--bs-accordion-bg); + --bs-accordion-btn-icon: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3E%3C/svg%3E"); + --bs-accordion-btn-icon-width: 0.875rem; + --bs-accordion-btn-icon-transform: rotate(-180deg); + --bs-accordion-btn-icon-transition: transform 0.2s ease-in-out; + --bs-accordion-btn-active-icon: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%235b66e6'%3E%3Cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3E%3C/svg%3E"); + --bs-accordion-btn-focus-border-color: #ced4da; + --bs-accordion-btn-focus-box-shadow: none; + --bs-accordion-body-padding-x: 1.25rem; + --bs-accordion-body-padding-y: 1rem; + --bs-accordion-active-color: #5b66e6; + --bs-accordion-active-bg: #f0f1ff +} + +.accordion-button { + align-items: center; + background-color: var(--bs-accordion-btn-bg); + border: 0; + border-radius: 0; + color: var(--bs-accordion-btn-color); + display: flex; + font-size: .875rem; + overflow-anchor: none; + padding: var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x); + position: relative; + text-align: left; + transition: var(--bs-accordion-transition); + width: 100% +} + +@media (prefers-reduced-motion: reduce) { + .accordion-button { + transition: none + } +} + +.accordion-button:not(.collapsed) { + background-color: var(--bs-accordion-active-bg); + box-shadow: inset 0 calc(var(--bs-accordion-border-width) * -1) 0 var(--bs-accordion-border-color); + color: var(--bs-accordion-active-color) +} + +.accordion-button:not(.collapsed):after { + background-image: var(--bs-accordion-btn-active-icon); + transform: var(--bs-accordion-btn-icon-transform) +} + +.accordion-button:after { + background-image: var(--bs-accordion-btn-icon); + background-repeat: no-repeat; + background-size: var(--bs-accordion-btn-icon-width); + content: ""; + flex-shrink: 0; + height: var(--bs-accordion-btn-icon-width); + margin-left: auto; + transition: var(--bs-accordion-btn-icon-transition); + width: var(--bs-accordion-btn-icon-width) +} + +@media (prefers-reduced-motion: reduce) { + .accordion-button:after { + transition: none + } +} + +.accordion-button:hover { + z-index: 2 +} + +.accordion-button:focus { + border-color: var(--bs-accordion-btn-focus-border-color); + box-shadow: var(--bs-accordion-btn-focus-box-shadow); + outline: 0; + z-index: 3 +} + +.accordion-header { + margin-bottom: 0 +} + +.accordion-item { + background-color: var(--bs-accordion-bg); + border: var(--bs-accordion-border-width) solid var(--bs-accordion-border-color); + color: var(--bs-accordion-color) +} + +.accordion-item:first-of-type { + border-top-left-radius: var(--bs-accordion-border-radius); + border-top-right-radius: var(--bs-accordion-border-radius) +} + +.accordion-item:first-of-type .accordion-button { + border-top-left-radius: var(--bs-accordion-inner-border-radius); + border-top-right-radius: var(--bs-accordion-inner-border-radius) +} + +.accordion-item:not(:first-of-type) { + border-top: 0 +} + +.accordion-item:last-of-type { + border-bottom-left-radius: var(--bs-accordion-border-radius); + border-bottom-right-radius: var(--bs-accordion-border-radius) +} + +.accordion-item:last-of-type .accordion-button.collapsed { + border-bottom-left-radius: var(--bs-accordion-inner-border-radius); + border-bottom-right-radius: var(--bs-accordion-inner-border-radius) +} + +.accordion-item:last-of-type .accordion-collapse { + border-bottom-left-radius: var(--bs-accordion-border-radius); + border-bottom-right-radius: var(--bs-accordion-border-radius) +} + +.accordion-body { + padding: var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x) +} + +.accordion-flush .accordion-collapse { + border-width: 0 +} + +.accordion-flush .accordion-item { + border-left: 0; + border-radius: 0; + border-right: 0 +} + +.accordion-flush .accordion-item:first-child { + border-top: 0 +} + +.accordion-flush .accordion-item:last-child { + border-bottom: 0 +} + +.accordion-flush .accordion-item .accordion-button, .accordion-flush .accordion-item .accordion-button.collapsed { + border-radius: 0 +} + +.breadcrumb { + --bs-breadcrumb-padding-x: 0; + --bs-breadcrumb-padding-y: 0; + --bs-breadcrumb-margin-bottom: 1rem; + --bs-breadcrumb-bg: ; + --bs-breadcrumb-border-radius: ; + --bs-breadcrumb-divider-color: #7987a1; + --bs-breadcrumb-item-padding-x: 0.5rem; + --bs-breadcrumb-item-active-color: #7987a1; + background-color: var(--bs-breadcrumb-bg); + border-radius: var(--bs-breadcrumb-border-radius); + display: flex; + flex-wrap: wrap; + font-size: var(--bs-breadcrumb-font-size); + list-style: none; + margin-bottom: var(--bs-breadcrumb-margin-bottom); + padding: var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x) +} + +.breadcrumb-item + .breadcrumb-item { + padding-left: var(--bs-breadcrumb-item-padding-x) +} + +.breadcrumb-item + .breadcrumb-item:before { + color: var(--bs-breadcrumb-divider-color); + content: var(--bs-breadcrumb-divider, "/"); + float: left; + padding-right: var(--bs-breadcrumb-item-padding-x) +} + +.breadcrumb-item.active { + color: var(--bs-breadcrumb-item-active-color) +} + +.pagination { + --bs-pagination-padding-x: 1rem; + --bs-pagination-padding-y: 0.469rem; + --bs-pagination-font-size: 0.875rem; + --bs-pagination-color: #6571ff; + --bs-pagination-bg: #fff; + --bs-pagination-border-width: 1px; + --bs-pagination-border-color: #dee2e6; + --bs-pagination-border-radius: 0.25rem; + --bs-pagination-hover-color: var(--bs-link-hover-color); + --bs-pagination-hover-bg: #e9ecef; + --bs-pagination-hover-border-color: #dee2e6; + --bs-pagination-focus-color: var(--bs-link-hover-color); + --bs-pagination-focus-bg: #e9ecef; + --bs-pagination-focus-box-shadow: none; + --bs-pagination-active-color: #fff; + --bs-pagination-active-bg: #6571ff; + --bs-pagination-active-border-color: #6571ff; + --bs-pagination-disabled-color: #7987a1; + --bs-pagination-disabled-bg: #fff; + --bs-pagination-disabled-border-color: #dee2e6; + display: flex; + list-style: none; + padding-left: 0 +} + +.page-link { + background-color: var(--bs-pagination-bg); + border: var(--bs-pagination-border-width) solid var(--bs-pagination-border-color); + color: var(--bs-pagination-color); + display: block; + font-size: var(--bs-pagination-font-size); + padding: var(--bs-pagination-padding-y) var(--bs-pagination-padding-x); + position: relative; + transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out +} + +@media (prefers-reduced-motion: reduce) { + .page-link { + transition: none + } +} + +.page-link:hover { + background-color: var(--bs-pagination-hover-bg); + border-color: var(--bs-pagination-hover-border-color); + color: var(--bs-pagination-hover-color); + z-index: 2 +} + +.page-link:focus { + background-color: var(--bs-pagination-focus-bg); + box-shadow: var(--bs-pagination-focus-box-shadow); + color: var(--bs-pagination-focus-color); + outline: 0; + z-index: 3 +} + +.active > .page-link, .page-link.active { + background-color: var(--bs-pagination-active-bg); + border-color: var(--bs-pagination-active-border-color); + color: var(--bs-pagination-active-color); + z-index: 3 +} + +.disabled > .page-link, .page-link.disabled { + background-color: var(--bs-pagination-disabled-bg); + border-color: var(--bs-pagination-disabled-border-color); + color: var(--bs-pagination-disabled-color); + pointer-events: none +} + +.page-item:not(:first-child) .page-link { + margin-left: -1px +} + +.page-item:first-child .page-link { + border-bottom-left-radius: var(--bs-pagination-border-radius); + border-top-left-radius: var(--bs-pagination-border-radius) +} + +.page-item:last-child .page-link { + border-bottom-right-radius: var(--bs-pagination-border-radius); + border-top-right-radius: var(--bs-pagination-border-radius) +} + +.pagination-lg { + --bs-pagination-padding-x: 1.1rem; + --bs-pagination-padding-y: 0.5rem; + --bs-pagination-font-size: 1rem; + --bs-pagination-border-radius: 0.5rem +} + +.pagination-sm { + --bs-pagination-padding-x: 0.75rem; + --bs-pagination-padding-y: 0.391rem; + --bs-pagination-font-size: 0.812rem; + --bs-pagination-border-radius: 0.25rem +} + +.badge { + --bs-badge-padding-x: 0.65em; + --bs-badge-padding-y: 0.35em; + --bs-badge-font-size: 0.8em; + --bs-badge-font-weight: 500; + --bs-badge-color: #fff; + --bs-badge-border-radius: 0.25rem; + border-radius: var(--bs-badge-border-radius); + color: var(--bs-badge-color); + display: inline-block; + font-size: var(--bs-badge-font-size); + font-weight: var(--bs-badge-font-weight); + line-height: 1; + padding: var(--bs-badge-padding-y) var(--bs-badge-padding-x); + text-align: center; + vertical-align: baseline; + white-space: nowrap +} + +.badge:empty { + display: none +} + +.btn .badge, .swal2-popup .swal2-actions button .badge, .wizard > .actions a .badge, div.fc .fc-button-primary .badge, div.tox .tox-button .badge { + position: relative; + top: -1px +} + +.alert { + --bs-alert-bg: transparent; + --bs-alert-padding-x: 1rem; + --bs-alert-padding-y: 1rem; + --bs-alert-margin-bottom: 1rem; + --bs-alert-color: inherit; + --bs-alert-border-color: transparent; + --bs-alert-border: 1px solid var(--bs-alert-border-color); + --bs-alert-border-radius: 0.25rem; + background-color: var(--bs-alert-bg); + border: var(--bs-alert-border); + border-radius: var(--bs-alert-border-radius); + color: var(--bs-alert-color); + margin-bottom: var(--bs-alert-margin-bottom); + padding: var(--bs-alert-padding-y) var(--bs-alert-padding-x); + position: relative +} + +.alert-heading { + color: inherit +} + +.alert-link { + font-weight: 500 +} + +.alert-dismissible { + padding-right: 3rem +} + +.alert-dismissible .btn-close { + padding: 1.25rem 1rem; + position: absolute; + right: 0; + top: 0; + z-index: 2 +} + +.alert-primary { + --bs-alert-color: #3d4499; + --bs-alert-bg: #e0e3ff; + --bs-alert-border-color: #d1d4ff +} + +.alert-primary .alert-link { + color: #31367a +} + +.alert-secondary { + --bs-alert-color: #495161; + --bs-alert-bg: #e4e7ec; + --bs-alert-border-color: #d7dbe3 +} + +.alert-secondary .alert-link { + color: #3a414e +} + +.alert-success { + --bs-alert-color: #03622c; + --bs-alert-bg: #cdeddb; + --bs-alert-border-color: #b4e3c9 +} + +.alert-success .alert-link { + color: #024e23 +} + +.alert-info { + --bs-alert-color: #3d7d7d; + --bs-alert-bg: #e0f6f6; + --bs-alert-border-color: #d1f1f1 +} + +.alert-info .alert-link { + color: #316464 +} + +.alert-warning { + --bs-alert-color: #977104; + --bs-alert-bg: #fef2cd; + --bs-alert-border-color: #feebb4 +} + +.alert-warning .alert-link { + color: #795a03 +} + +.alert-danger { + --bs-alert-color: #991f3d; + --bs-alert-bg: #ffd6e0; + --bs-alert-border-color: #ffc2d1 +} + +.alert-danger .alert-link { + color: #7a1931 +} + +.alert-light { + --bs-alert-color: #8c8e8f; + --bs-alert-bg: #fbfbfc; + --bs-alert-border-color: #f8f9fa +} + +.alert-light .alert-link { + color: #707272 +} + +.alert-dark { + --bs-alert-color: #04070e; + --bs-alert-bg: #cdced1; + --bs-alert-border-color: #b4b6b9 +} + +.alert-dark .alert-link { + color: #03060b +} + +@keyframes progress-bar-stripes { + 0% { + background-position-x: 1rem + } +} + +.progress { + --bs-progress-height: 1rem; + --bs-progress-font-size: 0.65625rem; + --bs-progress-bg: #e9ecef; + --bs-progress-border-radius: 0.25rem; + --bs-progress-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .075); + --bs-progress-bar-color: #fff; + --bs-progress-bar-bg: #6571ff; + --bs-progress-bar-transition: width 0.6s ease; + background-color: var(--bs-progress-bg); + border-radius: var(--bs-progress-border-radius); + font-size: var(--bs-progress-font-size); + height: var(--bs-progress-height) +} + +.progress, .progress-bar { + display: flex; + overflow: hidden +} + +.progress-bar { + background-color: var(--bs-progress-bar-bg); + color: var(--bs-progress-bar-color); + flex-direction: column; + justify-content: center; + text-align: center; + transition: var(--bs-progress-bar-transition); + white-space: nowrap +} + +@media (prefers-reduced-motion: reduce) { + .progress-bar { + transition: none + } +} + +.progress-bar-striped { + background-image: linear-gradient(45deg, hsla(0, 0%, 100%, .15) 25%, transparent 0, transparent 50%, hsla(0, 0%, 100%, .15) 0, hsla(0, 0%, 100%, .15) 75%, transparent 0, transparent); + background-size: var(--bs-progress-height) var(--bs-progress-height) +} + +.progress-bar-animated { + animation: progress-bar-stripes 1s linear infinite +} + +@media (prefers-reduced-motion: reduce) { + .progress-bar-animated { + animation: none + } +} + +.list-group { + --bs-list-group-color: #060c17; + --bs-list-group-bg: #fff; + --bs-list-group-border-color: rgba(0, 0, 0, .125); + --bs-list-group-border-width: 1px; + --bs-list-group-border-radius: 0.25rem; + --bs-list-group-item-padding-x: 1.25rem; + --bs-list-group-item-padding-y: 0.75rem; + --bs-list-group-action-color: #495057; + --bs-list-group-action-hover-color: #495057; + --bs-list-group-action-hover-bg: #f8f9fa; + --bs-list-group-action-active-color: #000; + --bs-list-group-action-active-bg: #e9ecef; + --bs-list-group-disabled-color: #7987a1; + --bs-list-group-disabled-bg: #fff; + --bs-list-group-active-color: #fff; + --bs-list-group-active-bg: #6571ff; + --bs-list-group-active-border-color: #6571ff; + border-radius: var(--bs-list-group-border-radius); + display: flex; + flex-direction: column; + margin-bottom: 0; + padding-left: 0 +} + +.list-group-numbered { + counter-reset: section; + list-style-type: none +} + +.list-group-numbered > .list-group-item:before { + content: counters(section, ".") ". "; + counter-increment: section +} + +.list-group-item-action { + color: var(--bs-list-group-action-color); + text-align: inherit; + width: 100% +} + +.list-group-item-action:focus, .list-group-item-action:hover { + background-color: var(--bs-list-group-action-hover-bg); + color: var(--bs-list-group-action-hover-color); + text-decoration: none; + z-index: 1 +} + +.list-group-item-action:active { + background-color: var(--bs-list-group-action-active-bg); + color: var(--bs-list-group-action-active-color) +} + +.list-group-item { + background-color: var(--bs-list-group-bg); + border: var(--bs-list-group-border-width) solid var(--bs-list-group-border-color); + color: var(--bs-list-group-color); + display: block; + padding: var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x); + position: relative +} + +.list-group-item:first-child { + border-top-left-radius: inherit; + border-top-right-radius: inherit +} + +.list-group-item:last-child { + border-bottom-left-radius: inherit; + border-bottom-right-radius: inherit +} + +.list-group-item.disabled, .list-group-item:disabled { + background-color: var(--bs-list-group-disabled-bg); + color: var(--bs-list-group-disabled-color); + pointer-events: none +} + +.list-group-item.active { + background-color: var(--bs-list-group-active-bg); + border-color: var(--bs-list-group-active-border-color); + color: var(--bs-list-group-active-color); + z-index: 2 +} + +.list-group-item + .list-group-item { + border-top-width: 0 +} + +.list-group-item + .list-group-item.active { + border-top-width: var(--bs-list-group-border-width); + margin-top: calc(var(--bs-list-group-border-width) * -1) +} + +.list-group-horizontal { + flex-direction: row +} + +.list-group-horizontal > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0 +} + +.list-group-horizontal > .list-group-item:last-child:not(:first-child) { + border-bottom-left-radius: 0; + border-top-right-radius: var(--bs-list-group-border-radius) +} + +.list-group-horizontal > .list-group-item.active { + margin-top: 0 +} + +.list-group-horizontal > .list-group-item + .list-group-item { + border-left-width: 0; + border-top-width: var(--bs-list-group-border-width) +} + +.list-group-horizontal > .list-group-item + .list-group-item.active { + border-left-width: var(--bs-list-group-border-width); + margin-left: calc(var(--bs-list-group-border-width) * -1) +} + +@media (min-width: 576px) { + .list-group-horizontal-sm { + flex-direction: row + } + + .list-group-horizontal-sm > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0 + } + + .list-group-horizontal-sm > .list-group-item:last-child:not(:first-child) { + border-bottom-left-radius: 0; + border-top-right-radius: var(--bs-list-group-border-radius) + } + + .list-group-horizontal-sm > .list-group-item.active { + margin-top: 0 + } + + .list-group-horizontal-sm > .list-group-item + .list-group-item { + border-left-width: 0; + border-top-width: var(--bs-list-group-border-width) + } + + .list-group-horizontal-sm > .list-group-item + .list-group-item.active { + border-left-width: var(--bs-list-group-border-width); + margin-left: calc(var(--bs-list-group-border-width) * -1) + } +} + +@media (min-width: 768px) { + .list-group-horizontal-md { + flex-direction: row + } + + .list-group-horizontal-md > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0 + } + + .list-group-horizontal-md > .list-group-item:last-child:not(:first-child) { + border-bottom-left-radius: 0; + border-top-right-radius: var(--bs-list-group-border-radius) + } + + .list-group-horizontal-md > .list-group-item.active { + margin-top: 0 + } + + .list-group-horizontal-md > .list-group-item + .list-group-item { + border-left-width: 0; + border-top-width: var(--bs-list-group-border-width) + } + + .list-group-horizontal-md > .list-group-item + .list-group-item.active { + border-left-width: var(--bs-list-group-border-width); + margin-left: calc(var(--bs-list-group-border-width) * -1) + } +} + +@media (min-width: 992px) { + .list-group-horizontal-lg { + flex-direction: row + } + + .list-group-horizontal-lg > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0 + } + + .list-group-horizontal-lg > .list-group-item:last-child:not(:first-child) { + border-bottom-left-radius: 0; + border-top-right-radius: var(--bs-list-group-border-radius) + } + + .list-group-horizontal-lg > .list-group-item.active { + margin-top: 0 + } + + .list-group-horizontal-lg > .list-group-item + .list-group-item { + border-left-width: 0; + border-top-width: var(--bs-list-group-border-width) + } + + .list-group-horizontal-lg > .list-group-item + .list-group-item.active { + border-left-width: var(--bs-list-group-border-width); + margin-left: calc(var(--bs-list-group-border-width) * -1) + } +} + +@media (min-width: 1200px) { + .list-group-horizontal-xl { + flex-direction: row + } + + .list-group-horizontal-xl > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0 + } + + .list-group-horizontal-xl > .list-group-item:last-child:not(:first-child) { + border-bottom-left-radius: 0; + border-top-right-radius: var(--bs-list-group-border-radius) + } + + .list-group-horizontal-xl > .list-group-item.active { + margin-top: 0 + } + + .list-group-horizontal-xl > .list-group-item + .list-group-item { + border-left-width: 0; + border-top-width: var(--bs-list-group-border-width) + } + + .list-group-horizontal-xl > .list-group-item + .list-group-item.active { + border-left-width: var(--bs-list-group-border-width); + margin-left: calc(var(--bs-list-group-border-width) * -1) + } +} + +@media (min-width: 1400px) { + .list-group-horizontal-xxl { + flex-direction: row + } + + .list-group-horizontal-xxl > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0 + } + + .list-group-horizontal-xxl > .list-group-item:last-child:not(:first-child) { + border-bottom-left-radius: 0; + border-top-right-radius: var(--bs-list-group-border-radius) + } + + .list-group-horizontal-xxl > .list-group-item.active { + margin-top: 0 + } + + .list-group-horizontal-xxl > .list-group-item + .list-group-item { + border-left-width: 0; + border-top-width: var(--bs-list-group-border-width) + } + + .list-group-horizontal-xxl > .list-group-item + .list-group-item.active { + border-left-width: var(--bs-list-group-border-width); + margin-left: calc(var(--bs-list-group-border-width) * -1) + } +} + +.list-group-flush { + border-radius: 0 +} + +.list-group-flush > .list-group-item { + border-width: 0 0 var(--bs-list-group-border-width) +} + +.list-group-flush > .list-group-item:last-child { + border-bottom-width: 0 +} + +.list-group-item-primary { + background-color: #e0e3ff; + color: #3d4499 +} + +.list-group-item-primary.list-group-item-action:focus, .list-group-item-primary.list-group-item-action:hover { + background-color: #cacce6; + color: #3d4499 +} + +.list-group-item-primary.list-group-item-action.active { + background-color: #3d4499; + border-color: #3d4499; + color: #fff +} + +.list-group-item-secondary { + background-color: #e4e7ec; + color: #495161 +} + +.list-group-item-secondary.list-group-item-action:focus, .list-group-item-secondary.list-group-item-action:hover { + background-color: #cdd0d4; + color: #495161 +} + +.list-group-item-secondary.list-group-item-action.active { + background-color: #495161; + border-color: #495161; + color: #fff +} + +.list-group-item-success { + background-color: #cdeddb; + color: #03622c +} + +.list-group-item-success.list-group-item-action:focus, .list-group-item-success.list-group-item-action:hover { + background-color: #b9d5c5; + color: #03622c +} + +.list-group-item-success.list-group-item-action.active { + background-color: #03622c; + border-color: #03622c; + color: #fff +} + +.list-group-item-info { + background-color: #e0f6f6; + color: #3d7d7d +} + +.list-group-item-info.list-group-item-action:focus, .list-group-item-info.list-group-item-action:hover { + background-color: #cadddd; + color: #3d7d7d +} + +.list-group-item-info.list-group-item-action.active { + background-color: #3d7d7d; + border-color: #3d7d7d; + color: #fff +} + +.list-group-item-warning { + background-color: #fef2cd; + color: #977104 +} + +.list-group-item-warning.list-group-item-action:focus, .list-group-item-warning.list-group-item-action:hover { + background-color: #e5dab9; + color: #977104 +} + +.list-group-item-warning.list-group-item-action.active { + background-color: #977104; + border-color: #977104; + color: #fff +} + +.list-group-item-danger { + background-color: #ffd6e0; + color: #991f3d +} + +.list-group-item-danger.list-group-item-action:focus, .list-group-item-danger.list-group-item-action:hover { + background-color: #e6c1ca; + color: #991f3d +} + +.list-group-item-danger.list-group-item-action.active { + background-color: #991f3d; + border-color: #991f3d; + color: #fff +} + +.list-group-item-light { + background-color: #fbfbfc; + color: #8c8e8f +} + +.list-group-item-light.list-group-item-action:focus, .list-group-item-light.list-group-item-action:hover { + background-color: #e2e2e3; + color: #8c8e8f +} + +.list-group-item-light.list-group-item-action.active { + background-color: #8c8e8f; + border-color: #8c8e8f; + color: #fff +} + +.list-group-item-dark { + background-color: #cdced1; + color: #04070e +} + +.list-group-item-dark.list-group-item-action:focus, .list-group-item-dark.list-group-item-action:hover { + background-color: #b9b9bc; + color: #04070e +} + +.list-group-item-dark.list-group-item-action.active { + background-color: #04070e; + border-color: #04070e; + color: #fff +} + +.btn-close { + background: transparent url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3E%3C/svg%3E") 50%/.8em auto no-repeat; + border: 0; + border-radius: .25rem; + box-sizing: content-box; + color: #000; + height: .8em; + opacity: .5; + padding: .25em; + width: .8em +} + +.btn-close:hover { + color: #000; + opacity: .75; + text-decoration: none +} + +.btn-close:focus { + box-shadow: none; + opacity: 1; + outline: 0 +} + +.btn-close.disabled, .btn-close:disabled { + opacity: .25; + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none +} + +.btn-close-white { + filter: invert(1) grayscale(100%) brightness(200%) +} + +.toast { + --bs-toast-zindex: 1090; + --bs-toast-padding-x: 0.75rem; + --bs-toast-padding-y: 0.5rem; + --bs-toast-spacing: 1.5rem; + --bs-toast-max-width: 350px; + --bs-toast-font-size: 0.875rem; + --bs-toast-color: ; + --bs-toast-bg: hsla(0, 0%, 100%, .85); + --bs-toast-border-width: 1px; + --bs-toast-border-color: var(--bs-border-color-translucent); + --bs-toast-border-radius: 0.25rem; + --bs-toast-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, .15); + --bs-toast-header-color: #7987a1; + --bs-toast-header-bg: hsla(0, 0%, 100%, .85); + --bs-toast-header-border-color: rgba(0, 0, 0, .05); + background-clip: padding-box; + background-color: var(--bs-toast-bg); + border: var(--bs-toast-border-width) solid var(--bs-toast-border-color); + border-radius: var(--bs-toast-border-radius); + box-shadow: var(--bs-toast-box-shadow); + color: var(--bs-toast-color); + font-size: var(--bs-toast-font-size); + max-width: 100%; + pointer-events: auto; + width: var(--bs-toast-max-width) +} + +.toast.showing { + opacity: 0 +} + +.toast:not(.show) { + display: none +} + +.toast-container { + --bs-toast-zindex: 1090; + max-width: 100%; + pointer-events: none; + position: absolute; + width: -moz-max-content; + width: max-content; + z-index: var(--bs-toast-zindex) +} + +.toast-container > :not(:last-child) { + margin-bottom: var(--bs-toast-spacing) +} + +.toast-header { + align-items: center; + background-clip: padding-box; + background-color: var(--bs-toast-header-bg); + border-bottom: var(--bs-toast-border-width) solid var(--bs-toast-header-border-color); + border-top-left-radius: calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width)); + border-top-right-radius: calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width)); + color: var(--bs-toast-header-color); + display: flex; + padding: var(--bs-toast-padding-y) var(--bs-toast-padding-x) +} + +.toast-header .btn-close { + margin-left: var(--bs-toast-padding-x); + margin-right: calc(var(--bs-toast-padding-x) * -.5) +} + +.toast-body { + word-wrap: break-word; + padding: var(--bs-toast-padding-x) +} + +.modal { + --bs-modal-zindex: 1055; + --bs-modal-width: 500px; + --bs-modal-padding: 1rem; + --bs-modal-margin: 0.5rem; + --bs-modal-color: ; + --bs-modal-bg: #fff; + --bs-modal-border-color: #e9ecef; + --bs-modal-border-width: 1px; + --bs-modal-border-radius: 0.5rem; + --bs-modal-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, .075); + --bs-modal-inner-border-radius: calc(0.5rem - 1px); + --bs-modal-header-padding-x: 1rem; + --bs-modal-header-padding-y: 1rem; + --bs-modal-header-padding: 1rem 1rem; + --bs-modal-header-border-color: var(--bs-border-color); + --bs-modal-header-border-width: 1px; + --bs-modal-title-line-height: 1.5; + --bs-modal-footer-gap: 0.5rem; + --bs-modal-footer-bg: ; + --bs-modal-footer-border-color: var(--bs-border-color); + --bs-modal-footer-border-width: 1px; + display: none; + height: 100%; + left: 0; + outline: 0; + overflow-x: hidden; + overflow-y: auto; + position: fixed; + top: 0; + width: 100%; + z-index: var(--bs-modal-zindex) +} + +.modal-dialog { + margin: var(--bs-modal-margin); + pointer-events: none; + position: relative; + width: auto +} + +.modal.fade .modal-dialog { + transform: scale(.8); + transition: transform .4s ease +} + +@media (prefers-reduced-motion: reduce) { + .modal.fade .modal-dialog { + transition: none + } +} + +.modal.show .modal-dialog { + transform: none +} + +.modal.modal-static .modal-dialog { + transform: scale(1.02) +} + +.modal-dialog-scrollable { + height: calc(100% - var(--bs-modal-margin) * 2) +} + +.modal-dialog-scrollable .modal-content { + max-height: 100%; + overflow: hidden +} + +.modal-dialog-scrollable .modal-body { + overflow-y: auto +} + +.modal-dialog-centered { + align-items: center; + display: flex; + min-height: calc(100% - var(--bs-modal-margin) * 2) +} + +.modal-content { + background-clip: padding-box; + background-color: var(--bs-modal-bg); + border: var(--bs-modal-border-width) solid var(--bs-modal-border-color); + border-radius: var(--bs-modal-border-radius); + color: var(--bs-modal-color); + display: flex; + flex-direction: column; + outline: 0; + pointer-events: auto; + position: relative; + width: 100% +} + +.modal-backdrop { + --bs-backdrop-zindex: 1050; + --bs-backdrop-bg: #000; + --bs-backdrop-opacity: 0.5; + background-color: var(--bs-backdrop-bg); + height: 100vh; + left: 0; + position: fixed; + top: 0; + width: 100vw; + z-index: var(--bs-backdrop-zindex) +} + +.modal-backdrop.fade { + opacity: 0 +} + +.modal-backdrop.show { + opacity: var(--bs-backdrop-opacity) +} + +.modal-header { + align-items: center; + border-bottom: var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color); + border-top-left-radius: var(--bs-modal-inner-border-radius); + border-top-right-radius: var(--bs-modal-inner-border-radius); + display: flex; + flex-shrink: 0; + justify-content: space-between; + padding: var(--bs-modal-header-padding) +} + +.modal-header .btn-close { + margin: calc(var(--bs-modal-header-padding-y) * -.5) calc(var(--bs-modal-header-padding-x) * -.5) calc(var(--bs-modal-header-padding-y) * -.5) auto; + padding: calc(var(--bs-modal-header-padding-y) * .5) calc(var(--bs-modal-header-padding-x) * .5) +} + +.modal-title { + line-height: var(--bs-modal-title-line-height); + margin-bottom: 0 +} + +.modal-body { + flex: 1 1 auto; + padding: var(--bs-modal-padding); + position: relative +} + +.modal-footer { + align-items: center; + background-color: var(--bs-modal-footer-bg); + border-bottom-left-radius: var(--bs-modal-inner-border-radius); + border-bottom-right-radius: var(--bs-modal-inner-border-radius); + border-top: var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color); + display: flex; + flex-shrink: 0; + flex-wrap: wrap; + justify-content: flex-end; + padding: calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * .5) +} + +.modal-footer > * { + margin: calc(var(--bs-modal-footer-gap) * .5) +} + +@media (min-width: 576px) { + .modal { + --bs-modal-margin: 1.75rem; + --bs-modal-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, .15) + } + + .modal-dialog { + margin-left: auto; + margin-right: auto; + max-width: var(--bs-modal-width) + } + + .modal-sm { + --bs-modal-width: 300px + } +} + +@media (min-width: 992px) { + .modal-lg, .modal-xl { + --bs-modal-width: 800px + } +} + +@media (min-width: 1200px) { + .modal-xl { + --bs-modal-width: 1140px + } +} + +.modal-fullscreen { + height: 100%; + margin: 0; + max-width: none; + width: 100vw +} + +.modal-fullscreen .modal-content { + border: 0; + border-radius: 0; + height: 100% +} + +.modal-fullscreen .modal-footer, .modal-fullscreen .modal-header { + border-radius: 0 +} + +.modal-fullscreen .modal-body { + overflow-y: auto +} + +@media (max-width: 575.98px) { + .modal-fullscreen-sm-down { + height: 100%; + margin: 0; + max-width: none; + width: 100vw + } + + .modal-fullscreen-sm-down .modal-content { + border: 0; + border-radius: 0; + height: 100% + } + + .modal-fullscreen-sm-down .modal-footer, .modal-fullscreen-sm-down .modal-header { + border-radius: 0 + } + + .modal-fullscreen-sm-down .modal-body { + overflow-y: auto + } +} + +@media (max-width: 767.98px) { + .modal-fullscreen-md-down { + height: 100%; + margin: 0; + max-width: none; + width: 100vw + } + + .modal-fullscreen-md-down .modal-content { + border: 0; + border-radius: 0; + height: 100% + } + + .modal-fullscreen-md-down .modal-footer, .modal-fullscreen-md-down .modal-header { + border-radius: 0 + } + + .modal-fullscreen-md-down .modal-body { + overflow-y: auto + } +} + +@media (max-width: 991.98px) { + .modal-fullscreen-lg-down { + height: 100%; + margin: 0; + max-width: none; + width: 100vw + } + + .modal-fullscreen-lg-down .modal-content { + border: 0; + border-radius: 0; + height: 100% + } + + .modal-fullscreen-lg-down .modal-footer, .modal-fullscreen-lg-down .modal-header { + border-radius: 0 + } + + .modal-fullscreen-lg-down .modal-body { + overflow-y: auto + } +} + +@media (max-width: 1199.98px) { + .modal-fullscreen-xl-down { + height: 100%; + margin: 0; + max-width: none; + width: 100vw + } + + .modal-fullscreen-xl-down .modal-content { + border: 0; + border-radius: 0; + height: 100% + } + + .modal-fullscreen-xl-down .modal-footer, .modal-fullscreen-xl-down .modal-header { + border-radius: 0 + } + + .modal-fullscreen-xl-down .modal-body { + overflow-y: auto + } +} + +@media (max-width: 1399.98px) { + .modal-fullscreen-xxl-down { + height: 100%; + margin: 0; + max-width: none; + width: 100vw + } + + .modal-fullscreen-xxl-down .modal-content { + border: 0; + border-radius: 0; + height: 100% + } + + .modal-fullscreen-xxl-down .modal-footer, .modal-fullscreen-xxl-down .modal-header { + border-radius: 0 + } + + .modal-fullscreen-xxl-down .modal-body { + overflow-y: auto + } +} + +.tooltip { + --bs-tooltip-zindex: 1080; + --bs-tooltip-max-width: 200px; + --bs-tooltip-padding-x: 0.5rem; + --bs-tooltip-padding-y: 0.25rem; + --bs-tooltip-margin: ; + --bs-tooltip-font-size: 0.812rem; + --bs-tooltip-color: #fff; + --bs-tooltip-bg: #000; + --bs-tooltip-border-radius: 0.25rem; + --bs-tooltip-opacity: 0.9; + --bs-tooltip-arrow-width: 0.8rem; + --bs-tooltip-arrow-height: 0.4rem; + word-wrap: break-word; + display: block; + font-family: var(--bs-font-sans-serif); + font-size: var(--bs-tooltip-font-size); + font-style: normal; + font-weight: 400; + letter-spacing: normal; + line-break: auto; + line-height: 1.5; + margin: var(--bs-tooltip-margin); + opacity: 0; + padding: var(--bs-tooltip-arrow-height); + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + white-space: normal; + word-break: normal; + word-spacing: normal; + z-index: var(--bs-tooltip-zindex) +} + +.tooltip.show { + opacity: var(--bs-tooltip-opacity) +} + +.tooltip .tooltip-arrow { + display: block; + height: var(--bs-tooltip-arrow-height); + width: var(--bs-tooltip-arrow-width) +} + +.tooltip .tooltip-arrow:before { + border-color: transparent; + border-style: solid; + content: ""; + position: absolute +} + +.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow, .bs-tooltip-top .tooltip-arrow { + bottom: 0 +} + +.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow:before, .bs-tooltip-top .tooltip-arrow:before { + border-top-color: var(--bs-tooltip-bg); + border-width: var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0; + top: -1px +} + +.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow, .bs-tooltip-end .tooltip-arrow { + height: var(--bs-tooltip-arrow-width); + left: 0; + width: var(--bs-tooltip-arrow-height) +} + +.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow:before, .bs-tooltip-end .tooltip-arrow:before { + border-right-color: var(--bs-tooltip-bg); + border-width: calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0; + right: -1px +} + +.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow, .bs-tooltip-bottom .tooltip-arrow { + top: 0 +} + +.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow:before, .bs-tooltip-bottom .tooltip-arrow:before { + border-bottom-color: var(--bs-tooltip-bg); + border-width: 0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height); + bottom: -1px +} + +.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow, .bs-tooltip-start .tooltip-arrow { + height: var(--bs-tooltip-arrow-width); + right: 0; + width: var(--bs-tooltip-arrow-height) +} + +.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow:before, .bs-tooltip-start .tooltip-arrow:before { + border-left-color: var(--bs-tooltip-bg); + border-width: calc(var(--bs-tooltip-arrow-width) * .5) 0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height); + left: -1px +} + +.tooltip-inner { + background-color: var(--bs-tooltip-bg); + border-radius: var(--bs-tooltip-border-radius); + color: var(--bs-tooltip-color); + max-width: var(--bs-tooltip-max-width); + padding: var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x); + text-align: center +} + +.popover { + --bs-popover-zindex: 1070; + --bs-popover-max-width: 276px; + --bs-popover-font-size: 0.812rem; + --bs-popover-bg: #fff; + --bs-popover-border-width: 1px; + --bs-popover-border-color: #e9ecef; + --bs-popover-border-radius: 0.5rem; + --bs-popover-inner-border-radius: calc(0.5rem - 1px); + --bs-popover-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, .15); + --bs-popover-header-padding-x: 1rem; + --bs-popover-header-padding-y: 0.5rem; + --bs-popover-header-font-size: 0.875rem; + --bs-popover-header-color: ; + --bs-popover-header-bg: #e9ecef; + --bs-popover-body-padding-x: 1rem; + --bs-popover-body-padding-y: 1rem; + --bs-popover-body-color: #000; + --bs-popover-arrow-width: 1rem; + --bs-popover-arrow-height: 0.5rem; + --bs-popover-arrow-border: var(--bs-popover-border-color); + word-wrap: break-word; + background-clip: padding-box; + background-color: var(--bs-popover-bg); + border: var(--bs-popover-border-width) solid var(--bs-popover-border-color); + border-radius: var(--bs-popover-border-radius); + display: block; + font-family: var(--bs-font-sans-serif); + font-size: var(--bs-popover-font-size); + font-style: normal; + font-weight: 400; + letter-spacing: normal; + line-break: auto; + line-height: 1.5; + max-width: var(--bs-popover-max-width); + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + white-space: normal; + word-break: normal; + word-spacing: normal; + z-index: var(--bs-popover-zindex) +} + +.popover .popover-arrow { + display: block; + height: var(--bs-popover-arrow-height); + width: var(--bs-popover-arrow-width) +} + +.popover .popover-arrow:after, .popover .popover-arrow:before { + border: 0 solid transparent; + content: ""; + display: block; + position: absolute +} + +.bs-popover-auto[data-popper-placement^=top] > .popover-arrow, .bs-popover-top > .popover-arrow { + bottom: calc((var(--bs-popover-arrow-height)) * -1 - var(--bs-popover-border-width)) +} + +.bs-popover-auto[data-popper-placement^=top] > .popover-arrow:after, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow:before, .bs-popover-top > .popover-arrow:after, .bs-popover-top > .popover-arrow:before { + border-width: var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0 +} + +.bs-popover-auto[data-popper-placement^=top] > .popover-arrow:before, .bs-popover-top > .popover-arrow:before { + border-top-color: var(--bs-popover-arrow-border); + bottom: 0 +} + +.bs-popover-auto[data-popper-placement^=top] > .popover-arrow:after, .bs-popover-top > .popover-arrow:after { + border-top-color: var(--bs-popover-bg); + bottom: var(--bs-popover-border-width) +} + +.bs-popover-auto[data-popper-placement^=right] > .popover-arrow, .bs-popover-end > .popover-arrow { + height: var(--bs-popover-arrow-width); + left: calc((var(--bs-popover-arrow-height)) * -1 - var(--bs-popover-border-width)); + width: var(--bs-popover-arrow-height) +} + +.bs-popover-auto[data-popper-placement^=right] > .popover-arrow:after, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow:before, .bs-popover-end > .popover-arrow:after, .bs-popover-end > .popover-arrow:before { + border-width: calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0 +} + +.bs-popover-auto[data-popper-placement^=right] > .popover-arrow:before, .bs-popover-end > .popover-arrow:before { + border-right-color: var(--bs-popover-arrow-border); + left: 0 +} + +.bs-popover-auto[data-popper-placement^=right] > .popover-arrow:after, .bs-popover-end > .popover-arrow:after { + border-right-color: var(--bs-popover-bg); + left: var(--bs-popover-border-width) +} + +.bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow, .bs-popover-bottom > .popover-arrow { + top: calc((var(--bs-popover-arrow-height)) * -1 - var(--bs-popover-border-width)) +} + +.bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow:after, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow:before, .bs-popover-bottom > .popover-arrow:after, .bs-popover-bottom > .popover-arrow:before { + border-width: 0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height) +} + +.bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow:before, .bs-popover-bottom > .popover-arrow:before { + border-bottom-color: var(--bs-popover-arrow-border); + top: 0 +} + +.bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow:after, .bs-popover-bottom > .popover-arrow:after { + border-bottom-color: var(--bs-popover-bg); + top: var(--bs-popover-border-width) +} + +.bs-popover-auto[data-popper-placement^=bottom] .popover-header:before, .bs-popover-bottom .popover-header:before { + border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-header-bg); + content: ""; + display: block; + left: 50%; + margin-left: calc(var(--bs-popover-arrow-width) * -.5); + position: absolute; + top: 0; + width: var(--bs-popover-arrow-width) +} + +.bs-popover-auto[data-popper-placement^=left] > .popover-arrow, .bs-popover-start > .popover-arrow { + height: var(--bs-popover-arrow-width); + right: calc((var(--bs-popover-arrow-height)) * -1 - var(--bs-popover-border-width)); + width: var(--bs-popover-arrow-height) +} + +.bs-popover-auto[data-popper-placement^=left] > .popover-arrow:after, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow:before, .bs-popover-start > .popover-arrow:after, .bs-popover-start > .popover-arrow:before { + border-width: calc(var(--bs-popover-arrow-width) * .5) 0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height) +} + +.bs-popover-auto[data-popper-placement^=left] > .popover-arrow:before, .bs-popover-start > .popover-arrow:before { + border-left-color: var(--bs-popover-arrow-border); + right: 0 +} + +.bs-popover-auto[data-popper-placement^=left] > .popover-arrow:after, .bs-popover-start > .popover-arrow:after { + border-left-color: var(--bs-popover-bg); + right: var(--bs-popover-border-width) +} + +.popover-header { + background-color: var(--bs-popover-header-bg); + border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-border-color); + border-top-left-radius: var(--bs-popover-inner-border-radius); + border-top-right-radius: var(--bs-popover-inner-border-radius); + color: var(--bs-popover-header-color); + font-size: var(--bs-popover-header-font-size); + margin-bottom: 0; + padding: var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x) +} + +.popover-header:empty { + display: none +} + +.popover-body { + color: var(--bs-popover-body-color); + padding: var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x) +} + +.carousel { + position: relative +} + +.carousel.pointer-event { + touch-action: pan-y +} + +.carousel-inner { + overflow: hidden; + position: relative; + width: 100% +} + +.carousel-inner:after { + clear: both; + content: ""; + display: block +} + +.carousel-item { + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + display: none; + float: left; + margin-right: -100%; + position: relative; + transition: transform .6s ease-in-out; + width: 100% +} + +@media (prefers-reduced-motion: reduce) { + .carousel-item { + transition: none + } +} + +.carousel-item-next, .carousel-item-prev, .carousel-item.active { + display: block +} + +.active.carousel-item-end, .carousel-item-next:not(.carousel-item-start) { + transform: translateX(100%) +} + +.active.carousel-item-start, .carousel-item-prev:not(.carousel-item-end) { + transform: translateX(-100%) +} + +.carousel-fade .carousel-item { + opacity: 0; + transform: none; + transition-property: opacity +} + +.carousel-fade .carousel-item-next.carousel-item-start, .carousel-fade .carousel-item-prev.carousel-item-end, .carousel-fade .carousel-item.active { + opacity: 1; + z-index: 1 +} + +.carousel-fade .active.carousel-item-end, .carousel-fade .active.carousel-item-start { + opacity: 0; + transition: opacity 0s .6s; + z-index: 0 +} + +@media (prefers-reduced-motion: reduce) { + .carousel-fade .active.carousel-item-end, .carousel-fade .active.carousel-item-start { + transition: none + } +} + +.carousel-control-next, .carousel-control-prev { + align-items: center; + background: none; + border: 0; + bottom: 0; + color: #fff; + display: flex; + justify-content: center; + opacity: .5; + padding: 0; + position: absolute; + text-align: center; + top: 0; + transition: opacity .15s ease; + width: 15%; + z-index: 1 +} + +@media (prefers-reduced-motion: reduce) { + .carousel-control-next, .carousel-control-prev { + transition: none + } +} + +.carousel-control-next:focus, .carousel-control-next:hover, .carousel-control-prev:focus, .carousel-control-prev:hover { + color: #fff; + opacity: .9; + outline: 0; + text-decoration: none +} + +.carousel-control-prev { + left: 0 +} + +.carousel-control-next { + right: 0 +} + +.carousel-control-next-icon, .carousel-control-prev-icon { + background-position: 50%; + background-repeat: no-repeat; + background-size: 100% 100%; + display: inline-block; + height: 2rem; + width: 2rem +} + +.carousel-control-prev-icon { + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3E%3Cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3E%3C/svg%3E") +} + +.carousel-control-next-icon { + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3E%3Cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3E%3C/svg%3E") +} + +.carousel-indicators { + bottom: 0; + display: flex; + justify-content: center; + left: 0; + list-style: none; + margin-bottom: 1rem; + margin-left: 15%; + margin-right: 15%; + padding: 0; + position: absolute; + right: 0; + z-index: 2 +} + +.carousel-indicators [data-bs-target] { + background-clip: padding-box; + background-color: #fff; + border: 0; + border-bottom: 10px solid transparent; + border-top: 10px solid transparent; + box-sizing: content-box; + cursor: pointer; + flex: 0 1 auto; + height: 3px; + margin-left: 3px; + margin-right: 3px; + opacity: .5; + padding: 0; + text-indent: -999px; + transition: opacity .6s ease; + width: 30px +} + +@media (prefers-reduced-motion: reduce) { + .carousel-indicators [data-bs-target] { + transition: none + } +} + +.carousel-indicators .active { + opacity: 1 +} + +.carousel-caption { + bottom: 1.25rem; + color: #fff; + left: 15%; + padding-bottom: 1.25rem; + padding-top: 1.25rem; + position: absolute; + right: 15%; + text-align: center +} + +.carousel-dark .carousel-control-next-icon, .carousel-dark .carousel-control-prev-icon { + filter: invert(1) grayscale(100) +} + +.carousel-dark .carousel-indicators [data-bs-target] { + background-color: #000 +} + +.carousel-dark .carousel-caption { + color: #000 +} + +.spinner-border, .spinner-grow { + animation: var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name); + border-radius: 50%; + display: inline-block; + height: var(--bs-spinner-height); + vertical-align: var(--bs-spinner-vertical-align); + width: var(--bs-spinner-width) +} + +@keyframes spinner-border { + to { + transform: rotate(1turn) + } +} + +.spinner-border { + --bs-spinner-width: 2rem; + --bs-spinner-height: 2rem; + --bs-spinner-vertical-align: -0.125em; + --bs-spinner-border-width: 0.25em; + --bs-spinner-animation-speed: 0.75s; + --bs-spinner-animation-name: spinner-border; + border-right-color: currentcolor; + border: var(--bs-spinner-border-width) solid; + border-right: var(--bs-spinner-border-width) solid transparent +} + +.spinner-border-sm { + --bs-spinner-width: 1rem; + --bs-spinner-height: 1rem; + --bs-spinner-border-width: 0.2em +} + +@keyframes spinner-grow { + 0% { + transform: scale(0) + } + 50% { + opacity: 1; + transform: none + } +} + +.spinner-grow { + --bs-spinner-width: 2rem; + --bs-spinner-height: 2rem; + --bs-spinner-vertical-align: -0.125em; + --bs-spinner-animation-speed: 0.75s; + --bs-spinner-animation-name: spinner-grow; + background-color: currentcolor; + opacity: 0 +} + +.spinner-grow-sm { + --bs-spinner-width: 1rem; + --bs-spinner-height: 1rem +} + +@media (prefers-reduced-motion: reduce) { + .spinner-border, .spinner-grow { + --bs-spinner-animation-speed: 1.5s + } +} + +.clearfix:after { + clear: both; + content: ""; + display: block +} + +.text-bg-primary { + background-color: RGBA(101, 113, 255, var(--bs-bg-opacity, 1)) !important; + color: #fff !important +} + +.text-bg-secondary { + background-color: RGBA(121, 135, 161, var(--bs-bg-opacity, 1)) !important; + color: #fff !important +} + +.text-bg-success { + background-color: RGBA(5, 163, 74, var(--bs-bg-opacity, 1)) !important; + color: #fff !important +} + +.text-bg-info { + background-color: RGBA(102, 209, 209, var(--bs-bg-opacity, 1)) !important; + color: #000 !important +} + +.text-bg-warning { + background-color: RGBA(251, 188, 6, var(--bs-bg-opacity, 1)) !important; + color: #000 !important +} + +.text-bg-danger { + background-color: RGBA(255, 51, 102, var(--bs-bg-opacity, 1)) !important; + color: #fff !important +} + +.text-bg-light { + background-color: RGBA(233, 236, 239, var(--bs-bg-opacity, 1)) !important; + color: #000 !important +} + +.text-bg-dark { + background-color: RGBA(6, 12, 23, var(--bs-bg-opacity, 1)) !important; + color: #fff !important +} + +.link-primary { + color: #6571ff !important +} + +.link-primary:focus, .link-primary:hover { + color: #515acc !important +} + +.link-secondary { + color: #7987a1 !important +} + +.link-secondary:focus, .link-secondary:hover { + color: #616c81 !important +} + +.link-success { + color: #05a34a !important +} + +.link-success:focus, .link-success:hover { + color: #04823b !important +} + +.link-info { + color: #66d1d1 !important +} + +.link-info:focus, .link-info:hover { + color: #85dada !important +} + +.link-warning { + color: #fbbc06 !important +} + +.link-warning:focus, .link-warning:hover { + color: #fcc938 !important +} + +.link-danger { + color: #f36 !important +} + +.link-danger:focus, .link-danger:hover { + color: #cc2952 !important +} + +.link-light { + color: #e9ecef !important +} + +.link-light:focus, .link-light:hover { + color: #edf0f2 !important +} + +.link-dark { + color: #060c17 !important +} + +.link-dark:focus, .link-dark:hover { + color: #050a12 !important +} + +.ratio { + position: relative; + width: 100% +} + +.ratio:before { + content: ""; + display: block; + padding-top: var(--bs-aspect-ratio) +} + +.ratio > * { + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100% +} + +.ratio-1x1 { + --bs-aspect-ratio: 100% +} + +.ratio-4x3 { + --bs-aspect-ratio: 75% +} + +.ratio-16x9 { + --bs-aspect-ratio: 56.25% +} + +.ratio-21x9 { + --bs-aspect-ratio: 42.8571428571% +} + +.fixed-top, .horizontal-menu.fixed-on-scroll .bottom-navbar { + left: 0; + position: fixed; + right: 0; + top: 0; + z-index: 1030 +} + +.fixed-bottom { + bottom: 0; + left: 0; + position: fixed; + right: 0; + z-index: 1030 +} + +.sticky-top { + top: 0 +} + +.sticky-bottom, .sticky-top { + position: sticky; + z-index: 1020 +} + +.sticky-bottom { + bottom: 0 +} + +@media (min-width: 576px) { + .sticky-sm-top { + position: sticky; + top: 0; + z-index: 1020 + } + + .sticky-sm-bottom { + bottom: 0; + position: sticky; + z-index: 1020 + } +} + +@media (min-width: 768px) { + .sticky-md-top { + position: sticky; + top: 0; + z-index: 1020 + } + + .sticky-md-bottom { + bottom: 0; + position: sticky; + z-index: 1020 + } +} + +@media (min-width: 992px) { + .sticky-lg-top { + position: sticky; + top: 0; + z-index: 1020 + } + + .sticky-lg-bottom { + bottom: 0; + position: sticky; + z-index: 1020 + } +} + +@media (min-width: 1200px) { + .sticky-xl-top { + position: sticky; + top: 0; + z-index: 1020 + } + + .sticky-xl-bottom { + bottom: 0; + position: sticky; + z-index: 1020 + } +} + +@media (min-width: 1400px) { + .sticky-xxl-top { + position: sticky; + top: 0; + z-index: 1020 + } + + .sticky-xxl-bottom { + bottom: 0; + position: sticky; + z-index: 1020 + } +} + +.hstack { + align-items: center; + flex-direction: row +} + +.hstack, .vstack { + align-self: stretch; + display: flex +} + +.vstack { + flex: 1 1 auto; + flex-direction: column +} + +.visually-hidden, .visually-hidden-focusable:not(:focus):not(:focus-within) { + clip: rect(0, 0, 0, 0) !important; + border: 0 !important; + height: 1px !important; + margin: -1px !important; + overflow: hidden !important; + padding: 0 !important; + position: absolute !important; + white-space: nowrap !important; + width: 1px !important +} + +.stretched-link:after { + bottom: 0; + content: ""; + left: 0; + position: absolute; + right: 0; + top: 0; + z-index: 1 +} + +.text-truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap +} + +.vr { + align-self: stretch; + background-color: currentcolor; + display: inline-block; + min-height: 1em; + opacity: .1; + width: 1px +} + +.align-baseline { + vertical-align: baseline !important +} + +.align-top { + vertical-align: top !important +} + +.align-middle { + vertical-align: middle !important +} + +.align-bottom { + vertical-align: bottom !important +} + +.align-text-bottom { + vertical-align: text-bottom !important +} + +.align-text-top { + vertical-align: text-top !important +} + +.float-start { + float: left !important +} + +.float-end { + float: right !important +} + +.float-none { + float: none !important +} + +.opacity-0 { + opacity: 0 !important +} + +.opacity-25 { + opacity: .25 !important +} + +.opacity-50 { + opacity: .5 !important +} + +.opacity-75 { + opacity: .75 !important +} + +.opacity-100 { + opacity: 1 !important +} + +.overflow-auto { + overflow: auto !important +} + +.overflow-hidden { + overflow: hidden !important +} + +.overflow-visible { + overflow: visible !important +} + +.overflow-scroll { + overflow: scroll !important +} + +.d-inline { + display: inline !important +} + +.d-inline-block { + display: inline-block !important +} + +.d-block { + display: block !important +} + +.d-grid { + display: grid !important +} + +.d-table { + display: table !important +} + +.d-table-row { + display: table-row !important +} + +.d-table-cell { + display: table-cell !important +} + +.d-flex, .horizontal-menu .bottom-navbar .page-navigation > .nav-item > .nav-link { + display: flex !important +} + +.d-inline-flex { + display: inline-flex !important +} + +.d-none, .horizontal-menu .navbar .navbar-content .search-form { + display: none !important +} + +.shadow { + box-shadow: 0 .5rem 1rem rgba(0, 0, 0, .15) !important +} + +.shadow-sm { + box-shadow: 0 .125rem .25rem rgba(0, 0, 0, .075) !important +} + +.shadow-lg { + box-shadow: 0 1rem 3rem rgba(0, 0, 0, .175) !important +} + +.shadow-none { + box-shadow: none !important +} + +.position-static { + position: static !important +} + +.position-relative { + position: relative !important +} + +.position-absolute { + position: absolute !important +} + +.position-fixed { + position: fixed !important +} + +.position-sticky { + position: sticky !important +} + +.top-0 { + top: 0 !important +} + +.top-10 { + top: 10% !important +} + +.top-20 { + top: 20% !important +} + +.top-25 { + top: 25% !important +} + +.top-30 { + top: 30% !important +} + +.top-40 { + top: 40% !important +} + +.top-50 { + top: 50% !important +} + +.top-60 { + top: 60% !important +} + +.top-70 { + top: 70% !important +} + +.top-75 { + top: 75% !important +} + +.top-80 { + top: 80% !important +} + +.top-90 { + top: 90% !important +} + +.top-100 { + top: 100% !important +} + +.bottom-0 { + bottom: 0 !important +} + +.bottom-10 { + bottom: 10% !important +} + +.bottom-20 { + bottom: 20% !important +} + +.bottom-25 { + bottom: 25% !important +} + +.bottom-30 { + bottom: 30% !important +} + +.bottom-40 { + bottom: 40% !important +} + +.bottom-50 { + bottom: 50% !important +} + +.bottom-60 { + bottom: 60% !important +} + +.bottom-70 { + bottom: 70% !important +} + +.bottom-75 { + bottom: 75% !important +} + +.bottom-80 { + bottom: 80% !important +} + +.bottom-90 { + bottom: 90% !important +} + +.bottom-100 { + bottom: 100% !important +} + +.start-0 { + left: 0 !important +} + +.start-10 { + left: 10% !important +} + +.start-20 { + left: 20% !important +} + +.start-25 { + left: 25% !important +} + +.start-30 { + left: 30% !important +} + +.start-40 { + left: 40% !important +} + +.start-50 { + left: 50% !important +} + +.start-60 { + left: 60% !important +} + +.start-70 { + left: 70% !important +} + +.start-75 { + left: 75% !important +} + +.start-80 { + left: 80% !important +} + +.start-90 { + left: 90% !important +} + +.start-100 { + left: 100% !important +} + +.end-0 { + right: 0 !important +} + +.end-10 { + right: 10% !important +} + +.end-20 { + right: 20% !important +} + +.end-25 { + right: 25% !important +} + +.end-30 { + right: 30% !important +} + +.end-40 { + right: 40% !important +} + +.end-50 { + right: 50% !important +} + +.end-60 { + right: 60% !important +} + +.end-70 { + right: 70% !important +} + +.end-75 { + right: 75% !important +} + +.end-80 { + right: 80% !important +} + +.end-90 { + right: 90% !important +} + +.end-100 { + right: 100% !important +} + +.translate-middle { + transform: translate(-50%, -50%) !important +} + +.translate-middle-x { + transform: translateX(-50%) !important +} + +.translate-middle-y { + transform: translateY(-50%) !important +} + +.border { + border: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important +} + +.border-0 { + border: 0 !important +} + +.border-top { + border-top: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important +} + +.border-top-0 { + border-top: 0 !important +} + +.border-end { + border-right: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important +} + +.border-end-0 { + border-right: 0 !important +} + +.border-bottom { + border-bottom: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important +} + +.border-bottom-0 { + border-bottom: 0 !important +} + +.border-start { + border-left: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important +} + +.border-start-0 { + border-left: 0 !important +} + +.border-primary { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-primary-rgb), var(--bs-border-opacity)) !important +} + +.border-secondary { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-secondary-rgb), var(--bs-border-opacity)) !important +} + +.border-success { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-success-rgb), var(--bs-border-opacity)) !important +} + +.border-info { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-info-rgb), var(--bs-border-opacity)) !important +} + +.border-warning { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-warning-rgb), var(--bs-border-opacity)) !important +} + +.border-danger, .swal2-popup .swal2-actions button.swal2-cancel { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-danger-rgb), var(--bs-border-opacity)) !important +} + +.border-light { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-light-rgb), var(--bs-border-opacity)) !important +} + +.border-dark { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-dark-rgb), var(--bs-border-opacity)) !important +} + +.border-white { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-white-rgb), var(--bs-border-opacity)) !important +} + +.border-1 { + --bs-border-width: 1px +} + +.border-2 { + --bs-border-width: 2px +} + +.border-3 { + --bs-border-width: 3px +} + +.border-4 { + --bs-border-width: 4px +} + +.border-5 { + --bs-border-width: 5px +} + +.border-opacity-10 { + --bs-border-opacity: 0.1 +} + +.border-opacity-25 { + --bs-border-opacity: 0.25 +} + +.border-opacity-50 { + --bs-border-opacity: 0.5 +} + +.border-opacity-75 { + --bs-border-opacity: 0.75 +} + +.border-opacity-100 { + --bs-border-opacity: 1 +} + +.w-25 { + width: 25% !important +} + +.w-50 { + width: 50% !important +} + +.w-75 { + width: 75% !important +} + +.dataTables_wrapper.dt-bootstrap4 .dataTables_length select, .w-100 { + width: 100% !important +} + +.w-auto { + width: auto !important +} + +.mw-100 { + max-width: 100% !important +} + +.vw-100 { + width: 100vw !important +} + +.min-vw-100 { + min-width: 100vw !important +} + +.h-25 { + height: 25% !important +} + +.h-50 { + height: 50% !important +} + +.h-75 { + height: 75% !important +} + +.h-100 { + height: 100% !important +} + +.h-auto { + height: auto !important +} + +.mh-100 { + max-height: 100% !important +} + +.vh-100 { + height: 100vh !important +} + +.min-vh-100 { + min-height: 100vh !important +} + +.flex-fill { + flex: 1 1 auto !important +} + +.flex-row { + flex-direction: row !important +} + +.flex-column { + flex-direction: column !important +} + +.flex-row-reverse { + flex-direction: row-reverse !important +} + +.flex-column-reverse { + flex-direction: column-reverse !important +} + +.flex-grow-0 { + flex-grow: 0 !important +} + +.flex-grow-1 { + flex-grow: 1 !important +} + +.flex-shrink-0 { + flex-shrink: 0 !important +} + +.flex-shrink-1 { + flex-shrink: 1 !important +} + +.flex-wrap { + flex-wrap: wrap !important +} + +.flex-nowrap { + flex-wrap: nowrap !important +} + +.flex-wrap-reverse { + flex-wrap: wrap-reverse !important +} + +.justify-content-start { + justify-content: flex-start !important +} + +.justify-content-end { + justify-content: flex-end !important +} + +.dataTables_wrapper div.dataTables_paginate ul.pagination, .justify-content-center { + justify-content: center !important +} + +.justify-content-between { + justify-content: space-between !important +} + +.justify-content-around { + justify-content: space-around !important +} + +.justify-content-evenly { + justify-content: space-evenly !important +} + +.align-items-start { + align-items: flex-start !important +} + +.align-items-end { + align-items: flex-end !important +} + +.align-items-center, .horizontal-menu .bottom-navbar .page-navigation > .nav-item > .nav-link, .horizontal-menu .navbar .navbar-content .search-form { + align-items: center !important +} + +.align-items-baseline { + align-items: baseline !important +} + +.align-items-stretch { + align-items: stretch !important +} + +.align-content-start { + align-content: flex-start !important +} + +.align-content-end { + align-content: flex-end !important +} + +.align-content-center { + align-content: center !important +} + +.align-content-between { + align-content: space-between !important +} + +.align-content-around { + align-content: space-around !important +} + +.align-content-stretch { + align-content: stretch !important +} + +.align-self-auto { + align-self: auto !important +} + +.align-self-start { + align-self: flex-start !important +} + +.align-self-end { + align-self: flex-end !important +} + +.align-self-center { + align-self: center !important +} + +.align-self-baseline { + align-self: baseline !important +} + +.align-self-stretch { + align-self: stretch !important +} + +.order-first { + order: -1 !important +} + +.order-0 { + order: 0 !important +} + +.order-1 { + order: 1 !important +} + +.order-2 { + order: 2 !important +} + +.order-3 { + order: 3 !important +} + +.order-4 { + order: 4 !important +} + +.order-5 { + order: 5 !important +} + +.order-last { + order: 6 !important +} + +.m-0 { + margin: 0 !important +} + +.m-1 { + margin: .25rem !important +} + +.m-2 { + margin: .5rem !important +} + +.m-3 { + margin: 1rem !important +} + +.m-4 { + margin: 1.5rem !important +} + +.m-5 { + margin: 3rem !important +} + +.m-6 { + margin: 4.5rem !important +} + +.m-7 { + margin: 6rem !important +} + +.m-auto { + margin: auto !important +} + +.mx-0 { + margin-left: 0 !important; + margin-right: 0 !important +} + +.mx-1 { + margin-left: .25rem !important; + margin-right: .25rem !important +} + +.mx-2 { + margin-left: .5rem !important; + margin-right: .5rem !important +} + +.mx-3 { + margin-left: 1rem !important; + margin-right: 1rem !important +} + +.mx-4 { + margin-left: 1.5rem !important; + margin-right: 1.5rem !important +} + +.mx-5 { + margin-left: 3rem !important; + margin-right: 3rem !important +} + +.mx-6 { + margin-left: 4.5rem !important; + margin-right: 4.5rem !important +} + +.mx-7 { + margin-left: 6rem !important; + margin-right: 6rem !important +} + +.mx-auto { + margin-left: auto !important; + margin-right: auto !important +} + +.my-0 { + margin-bottom: 0 !important; + margin-top: 0 !important +} + +.my-1 { + margin-bottom: .25rem !important; + margin-top: .25rem !important +} + +.my-2 { + margin-bottom: .5rem !important; + margin-top: .5rem !important +} + +.my-3 { + margin-bottom: 1rem !important; + margin-top: 1rem !important +} + +.my-4 { + margin-bottom: 1.5rem !important; + margin-top: 1.5rem !important +} + +.my-5 { + margin-bottom: 3rem !important; + margin-top: 3rem !important +} + +.my-6 { + margin-bottom: 4.5rem !important; + margin-top: 4.5rem !important +} + +.my-7 { + margin-bottom: 6rem !important; + margin-top: 6rem !important +} + +.my-auto { + margin-bottom: auto !important; + margin-top: auto !important +} + +.mt-0 { + margin-top: 0 !important +} + +.mt-1 { + margin-top: .25rem !important +} + +.mt-2 { + margin-top: .5rem !important +} + +.dataTables_wrapper div.dataTables_paginate ul.pagination, .mt-3 { + margin-top: 1rem !important +} + +.mt-4 { + margin-top: 1.5rem !important +} + +.mt-5 { + margin-top: 3rem !important +} + +.mt-6 { + margin-top: 4.5rem !important +} + +.mt-7 { + margin-top: 6rem !important +} + +.mt-auto { + margin-top: auto !important +} + +.me-0 { + margin-right: 0 !important +} + +.me-1 { + margin-right: .25rem !important +} + +.me-2 { + margin-right: .5rem !important +} + +.me-3 { + margin-right: 1rem !important +} + +.me-4 { + margin-right: 1.5rem !important +} + +.me-5 { + margin-right: 3rem !important +} + +.me-6 { + margin-right: 4.5rem !important +} + +.me-7 { + margin-right: 6rem !important +} + +.me-auto { + margin-right: auto !important +} + +.mb-0 { + margin-bottom: 0 !important +} + +.example .btn-group, .mb-1 { + margin-bottom: .25rem !important +} + +.mb-2 { + margin-bottom: .5rem !important +} + +.mb-3 { + margin-bottom: 1rem !important +} + +.mb-4 { + margin-bottom: 1.5rem !important +} + +.mb-5 { + margin-bottom: 3rem !important +} + +.mb-6 { + margin-bottom: 4.5rem !important +} + +.mb-7 { + margin-bottom: 6rem !important +} + +.mb-auto { + margin-bottom: auto !important +} + +.ms-0 { + margin-left: 0 !important +} + +.ms-1 { + margin-left: .25rem !important +} + +.ms-2 { + margin-left: .5rem !important +} + +.ms-3 { + margin-left: 1rem !important +} + +.ms-4 { + margin-left: 1.5rem !important +} + +.ms-5 { + margin-left: 3rem !important +} + +.ms-6 { + margin-left: 4.5rem !important +} + +.ms-7 { + margin-left: 6rem !important +} + +.ms-auto { + margin-left: auto !important +} + +.m-n1 { + margin: -.25rem !important +} + +.m-n2 { + margin: -.5rem !important +} + +.m-n3 { + margin: -1rem !important +} + +.m-n4 { + margin: -1.5rem !important +} + +.m-n5 { + margin: -3rem !important +} + +.m-n6 { + margin: -4.5rem !important +} + +.m-n7 { + margin: -6rem !important +} + +.mx-n1 { + margin-left: -.25rem !important; + margin-right: -.25rem !important +} + +.mx-n2 { + margin-left: -.5rem !important; + margin-right: -.5rem !important +} + +.mx-n3 { + margin-left: -1rem !important; + margin-right: -1rem !important +} + +.mx-n4 { + margin-left: -1.5rem !important; + margin-right: -1.5rem !important +} + +.mx-n5 { + margin-left: -3rem !important; + margin-right: -3rem !important +} + +.mx-n6 { + margin-left: -4.5rem !important; + margin-right: -4.5rem !important +} + +.mx-n7 { + margin-left: -6rem !important; + margin-right: -6rem !important +} + +.my-n1 { + margin-bottom: -.25rem !important; + margin-top: -.25rem !important +} + +.my-n2 { + margin-bottom: -.5rem !important; + margin-top: -.5rem !important +} + +.my-n3 { + margin-bottom: -1rem !important; + margin-top: -1rem !important +} + +.my-n4 { + margin-bottom: -1.5rem !important; + margin-top: -1.5rem !important +} + +.my-n5 { + margin-bottom: -3rem !important; + margin-top: -3rem !important +} + +.my-n6 { + margin-bottom: -4.5rem !important; + margin-top: -4.5rem !important +} + +.my-n7 { + margin-bottom: -6rem !important; + margin-top: -6rem !important +} + +.mt-n1 { + margin-top: -.25rem !important +} + +.mt-n2 { + margin-top: -.5rem !important +} + +.mt-n3 { + margin-top: -1rem !important +} + +.mt-n4 { + margin-top: -1.5rem !important +} + +.mt-n5 { + margin-top: -3rem !important +} + +.mt-n6 { + margin-top: -4.5rem !important +} + +.mt-n7 { + margin-top: -6rem !important +} + +.me-n1 { + margin-right: -.25rem !important +} + +.me-n2 { + margin-right: -.5rem !important +} + +.me-n3 { + margin-right: -1rem !important +} + +.me-n4 { + margin-right: -1.5rem !important +} + +.me-n5 { + margin-right: -3rem !important +} + +.me-n6 { + margin-right: -4.5rem !important +} + +.me-n7 { + margin-right: -6rem !important +} + +.mb-n1 { + margin-bottom: -.25rem !important +} + +.mb-n2 { + margin-bottom: -.5rem !important +} + +.mb-n3 { + margin-bottom: -1rem !important +} + +.mb-n4 { + margin-bottom: -1.5rem !important +} + +.mb-n5 { + margin-bottom: -3rem !important +} + +.mb-n6 { + margin-bottom: -4.5rem !important +} + +.mb-n7 { + margin-bottom: -6rem !important +} + +.ms-n1 { + margin-left: -.25rem !important +} + +.ms-n2 { + margin-left: -.5rem !important +} + +.ms-n3 { + margin-left: -1rem !important +} + +.ms-n4 { + margin-left: -1.5rem !important +} + +.ms-n5 { + margin-left: -3rem !important +} + +.ms-n6 { + margin-left: -4.5rem !important +} + +.ms-n7 { + margin-left: -6rem !important +} + +.p-0 { + padding: 0 !important +} + +.p-1 { + padding: .25rem !important +} + +.p-2 { + padding: .5rem !important +} + +.p-3 { + padding: 1rem !important +} + +.p-4 { + padding: 1.5rem !important +} + +.p-5 { + padding: 3rem !important +} + +.p-6 { + padding: 4.5rem !important +} + +.p-7 { + padding: 6rem !important +} + +.px-0 { + padding-left: 0 !important; + padding-right: 0 !important +} + +.px-1 { + padding-left: .25rem !important; + padding-right: .25rem !important +} + +.px-2 { + padding-left: .5rem !important; + padding-right: .5rem !important +} + +.px-3 { + padding-left: 1rem !important; + padding-right: 1rem !important +} + +.px-4 { + padding-left: 1.5rem !important; + padding-right: 1.5rem !important +} + +.px-5 { + padding-left: 3rem !important; + padding-right: 3rem !important +} + +.px-6 { + padding-left: 4.5rem !important; + padding-right: 4.5rem !important +} + +.px-7 { + padding-left: 6rem !important; + padding-right: 6rem !important +} + +.py-0 { + padding-bottom: 0 !important; + padding-top: 0 !important +} + +.py-1 { + padding-bottom: .25rem !important; + padding-top: .25rem !important +} + +.py-2 { + padding-bottom: .5rem !important; + padding-top: .5rem !important +} + +.py-3 { + padding-bottom: 1rem !important; + padding-top: 1rem !important +} + +.py-4 { + padding-bottom: 1.5rem !important; + padding-top: 1.5rem !important +} + +.py-5 { + padding-bottom: 3rem !important; + padding-top: 3rem !important +} + +.py-6 { + padding-bottom: 4.5rem !important; + padding-top: 4.5rem !important +} + +.py-7 { + padding-bottom: 6rem !important; + padding-top: 6rem !important +} + +.pt-0 { + padding-top: 0 !important +} + +.pt-1 { + padding-top: .25rem !important +} + +.pt-2 { + padding-top: .5rem !important +} + +.pt-3 { + padding-top: 1rem !important +} + +.pt-4 { + padding-top: 1.5rem !important +} + +.pt-5 { + padding-top: 3rem !important +} + +.pt-6 { + padding-top: 4.5rem !important +} + +.pt-7 { + padding-top: 6rem !important +} + +.pe-0 { + padding-right: 0 !important +} + +.pe-1 { + padding-right: .25rem !important +} + +.pe-2 { + padding-right: .5rem !important +} + +.pe-3 { + padding-right: 1rem !important +} + +.pe-4 { + padding-right: 1.5rem !important +} + +.pe-5 { + padding-right: 3rem !important +} + +.pe-6 { + padding-right: 4.5rem !important +} + +.pe-7 { + padding-right: 6rem !important +} + +.pb-0 { + padding-bottom: 0 !important +} + +.pb-1 { + padding-bottom: .25rem !important +} + +.pb-2 { + padding-bottom: .5rem !important +} + +.pb-3 { + padding-bottom: 1rem !important +} + +.pb-4 { + padding-bottom: 1.5rem !important +} + +.pb-5 { + padding-bottom: 3rem !important +} + +.pb-6 { + padding-bottom: 4.5rem !important +} + +.pb-7 { + padding-bottom: 6rem !important +} + +.ps-0 { + padding-left: 0 !important +} + +.ps-1 { + padding-left: .25rem !important +} + +.ps-2 { + padding-left: .5rem !important +} + +.ps-3 { + padding-left: 1rem !important +} + +.ps-4 { + padding-left: 1.5rem !important +} + +.ps-5 { + padding-left: 3rem !important +} + +.ps-6 { + padding-left: 4.5rem !important +} + +.ps-7 { + padding-left: 6rem !important +} + +.gap-0 { + gap: 0 !important +} + +.gap-1 { + gap: .25rem !important +} + +.gap-2 { + gap: .5rem !important +} + +.gap-3 { + gap: 1rem !important +} + +.gap-4 { + gap: 1.5rem !important +} + +.gap-5 { + gap: 3rem !important +} + +.gap-6 { + gap: 4.5rem !important +} + +.gap-7 { + gap: 6rem !important +} + +.font-monospace { + font-family: var(--bs-font-monospace) !important +} + +.fs-1 { + font-size: calc(1.375rem + 1.5vw) !important +} + +.fs-2 { + font-size: calc(1.325rem + .9vw) !important +} + +.fs-3 { + font-size: calc(1.275rem + .3vw) !important +} + +.fs-4 { + font-size: 1.25rem !important +} + +.fs-5 { + font-size: 1rem !important +} + +.fs-6 { + font-size: .875rem !important +} + +.fst-italic { + font-style: italic !important +} + +.fst-normal { + font-style: normal !important +} + +.fw-light { + font-weight: 300 !important +} + +.fw-lighter { + font-weight: lighter !important +} + +.fw-normal { + font-weight: 400 !important +} + +.fw-bold { + font-weight: 500 !important +} + +.fw-semibold { + font-weight: 600 !important +} + +.fw-bolder { + font-weight: 700 !important +} + +.lh-1 { + line-height: 1 !important +} + +.lh-sm { + line-height: 1.25 !important +} + +.lh-base { + line-height: 1.5 !important +} + +.lh-lg { + line-height: 2 !important +} + +.text-start { + text-align: left !important +} + +.text-end { + text-align: right !important +} + +.text-center { + text-align: center !important +} + +.text-decoration-none { + text-decoration: none !important +} + +.text-decoration-underline { + text-decoration: underline !important +} + +.text-decoration-line-through { + text-decoration: line-through !important +} + +.text-lowercase { + text-transform: lowercase !important +} + +.text-uppercase { + text-transform: uppercase !important +} + +.text-capitalize { + text-transform: capitalize !important +} + +.text-wrap { + white-space: normal !important +} + +.text-nowrap { + white-space: nowrap !important +} + +.text-break { + word-wrap: break-word !important; + word-break: break-word !important +} + +.horizontal-menu .bottom-navbar .page-navigation > .nav-item .category-heading, .text-primary { + --bs-text-opacity: 1; + color: rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important +} + +.text-secondary { + --bs-text-opacity: 1; + color: rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important +} + +.text-success { + --bs-text-opacity: 1; + color: rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important +} + +.text-info { + --bs-text-opacity: 1; + color: rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important +} + +.text-warning { + --bs-text-opacity: 1; + color: rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important +} + +.text-danger { + --bs-text-opacity: 1; + color: rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important +} + +.text-light { + --bs-text-opacity: 1; + color: rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important +} + +.text-dark { + --bs-text-opacity: 1; + color: rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important +} + +.text-black { + --bs-text-opacity: 1; + color: rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important +} + +.text-white { + --bs-text-opacity: 1; + color: rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important +} + +.text-body { + --bs-text-opacity: 1; + color: rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important +} + +.dropzone.dz-clickable .dz-message *, .text-muted { + --bs-text-opacity: 1; + color: #7987a1 !important +} + +.text-black-50 { + --bs-text-opacity: 1; + color: rgba(0, 0, 0, .5) !important +} + +.text-white-50 { + --bs-text-opacity: 1; + color: hsla(0, 0%, 100%, .5) !important +} + +.text-reset { + --bs-text-opacity: 1; + color: inherit !important +} + +.text-opacity-25 { + --bs-text-opacity: 0.25 +} + +.text-opacity-50 { + --bs-text-opacity: 0.5 +} + +.text-opacity-75 { + --bs-text-opacity: 0.75 +} + +.text-opacity-100 { + --bs-text-opacity: 1 +} + +.bg-primary { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important +} + +.bg-secondary { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important +} + +.bg-success { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important +} + +.bg-info { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important +} + +.bg-warning { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important +} + +.bg-danger { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important +} + +.bg-light { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important +} + +.bg-dark { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important +} + +.bg-black { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important +} + +.bg-white { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important +} + +.bg-body { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important +} + +.bg-transparent { + --bs-bg-opacity: 1; + background-color: transparent !important +} + +.bg-opacity-10 { + --bs-bg-opacity: 0.1 +} + +.bg-opacity-25 { + --bs-bg-opacity: 0.25 +} + +.bg-opacity-50 { + --bs-bg-opacity: 0.5 +} + +.bg-opacity-75 { + --bs-bg-opacity: 0.75 +} + +.bg-opacity-100 { + --bs-bg-opacity: 1 +} + +.bg-gradient { + background-image: var(--bs-gradient) !important +} + +.user-select-all { + -webkit-user-select: all !important; + -moz-user-select: all !important; + user-select: all !important +} + +.user-select-auto { + -webkit-user-select: auto !important; + -moz-user-select: auto !important; + user-select: auto !important +} + +.user-select-none { + -webkit-user-select: none !important; + -moz-user-select: none !important; + user-select: none !important +} + +.pe-none { + pointer-events: none !important +} + +.pe-auto { + pointer-events: auto !important +} + +.rounded { + border-radius: var(--bs-border-radius) !important +} + +.rounded-0 { + border-radius: 0 !important +} + +.rounded-1 { + border-radius: var(--bs-border-radius-sm) !important +} + +.rounded-2 { + border-radius: var(--bs-border-radius) !important +} + +.rounded-3 { + border-radius: var(--bs-border-radius-lg) !important +} + +.rounded-4 { + border-radius: var(--bs-border-radius-xl) !important +} + +.rounded-5 { + border-radius: var(--bs-border-radius-2xl) !important +} + +.rounded-circle { + border-radius: 50% !important +} + +.rounded-pill { + border-radius: var(--bs-border-radius-pill) !important +} + +.rounded-top { + border-top-left-radius: var(--bs-border-radius) !important +} + +.rounded-end, .rounded-top { + border-top-right-radius: var(--bs-border-radius) !important +} + +.rounded-bottom, .rounded-end { + border-bottom-right-radius: var(--bs-border-radius) !important +} + +.rounded-bottom, .rounded-start { + border-bottom-left-radius: var(--bs-border-radius) !important +} + +.rounded-start { + border-top-left-radius: var(--bs-border-radius) !important +} + +.visible { + visibility: visible !important +} + +.invisible { + visibility: hidden !important +} + +.bg-gray-100 { + background-color: #f8f9fa !important +} + +.bg-gray-200 { + background-color: #e9ecef !important +} + +.bg-gray-300 { + background-color: #dee2e6 !important +} + +.bg-gray-400 { + background-color: #ced4da !important +} + +.bg-gray-500 { + background-color: #adb5bd !important +} + +.bg-gray-600 { + background-color: #7987a1 !important +} + +.bg-gray-700 { + background-color: #495057 !important +} + +.bg-gray-800 { + background-color: #212a3a !important +} + +.bg-gray-900 { + background-color: #060c17 !important +} + +@media (min-width: 576px) { + .float-sm-start { + float: left !important + } + + .float-sm-end { + float: right !important + } + + .float-sm-none { + float: none !important + } + + .d-sm-inline { + display: inline !important + } + + .d-sm-inline-block { + display: inline-block !important + } + + .d-sm-block { + display: block !important + } + + .d-sm-grid { + display: grid !important + } + + .d-sm-table { + display: table !important + } + + .d-sm-table-row { + display: table-row !important + } + + .d-sm-table-cell { + display: table-cell !important + } + + .d-sm-flex { + display: flex !important + } + + .d-sm-inline-flex { + display: inline-flex !important + } + + .d-sm-none { + display: none !important + } + + .border-sm { + border: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important + } + + .border-sm-0 { + border: 0 !important + } + + .border-top-sm { + border-top: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important + } + + .border-top-sm-0 { + border-top: 0 !important + } + + .border-end-sm { + border-right: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important + } + + .border-end-sm-0 { + border-right: 0 !important + } + + .border-bottom-sm { + border-bottom: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important + } + + .border-bottom-sm-0 { + border-bottom: 0 !important + } + + .border-start-sm { + border-left: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important + } + + .border-start-sm-0 { + border-left: 0 !important + } + + .flex-sm-fill { + flex: 1 1 auto !important + } + + .flex-sm-row { + flex-direction: row !important + } + + .flex-sm-column { + flex-direction: column !important + } + + .flex-sm-row-reverse { + flex-direction: row-reverse !important + } + + .flex-sm-column-reverse { + flex-direction: column-reverse !important + } + + .flex-sm-grow-0 { + flex-grow: 0 !important + } + + .flex-sm-grow-1 { + flex-grow: 1 !important + } + + .flex-sm-shrink-0 { + flex-shrink: 0 !important + } + + .flex-sm-shrink-1 { + flex-shrink: 1 !important + } + + .flex-sm-wrap { + flex-wrap: wrap !important + } + + .flex-sm-nowrap { + flex-wrap: nowrap !important + } + + .flex-sm-wrap-reverse { + flex-wrap: wrap-reverse !important + } + + .justify-content-sm-start { + justify-content: flex-start !important + } + + .justify-content-sm-end { + justify-content: flex-end !important + } + + .justify-content-sm-center { + justify-content: center !important + } + + .justify-content-sm-between { + justify-content: space-between !important + } + + .justify-content-sm-around { + justify-content: space-around !important + } + + .justify-content-sm-evenly { + justify-content: space-evenly !important + } + + .align-items-sm-start { + align-items: flex-start !important + } + + .align-items-sm-end { + align-items: flex-end !important + } + + .align-items-sm-center { + align-items: center !important + } + + .align-items-sm-baseline { + align-items: baseline !important + } + + .align-items-sm-stretch { + align-items: stretch !important + } + + .align-content-sm-start { + align-content: flex-start !important + } + + .align-content-sm-end { + align-content: flex-end !important + } + + .align-content-sm-center { + align-content: center !important + } + + .align-content-sm-between { + align-content: space-between !important + } + + .align-content-sm-around { + align-content: space-around !important + } + + .align-content-sm-stretch { + align-content: stretch !important + } + + .align-self-sm-auto { + align-self: auto !important + } + + .align-self-sm-start { + align-self: flex-start !important + } + + .align-self-sm-end { + align-self: flex-end !important + } + + .align-self-sm-center { + align-self: center !important + } + + .align-self-sm-baseline { + align-self: baseline !important + } + + .align-self-sm-stretch { + align-self: stretch !important + } + + .order-sm-first { + order: -1 !important + } + + .order-sm-0 { + order: 0 !important + } + + .order-sm-1 { + order: 1 !important + } + + .order-sm-2 { + order: 2 !important + } + + .order-sm-3 { + order: 3 !important + } + + .order-sm-4 { + order: 4 !important + } + + .order-sm-5 { + order: 5 !important + } + + .order-sm-last { + order: 6 !important + } + + .m-sm-0 { + margin: 0 !important + } + + .m-sm-1 { + margin: .25rem !important + } + + .m-sm-2 { + margin: .5rem !important + } + + .m-sm-3 { + margin: 1rem !important + } + + .m-sm-4 { + margin: 1.5rem !important + } + + .m-sm-5 { + margin: 3rem !important + } + + .m-sm-6 { + margin: 4.5rem !important + } + + .m-sm-7 { + margin: 6rem !important + } + + .m-sm-auto { + margin: auto !important + } + + .mx-sm-0 { + margin-left: 0 !important; + margin-right: 0 !important + } + + .mx-sm-1 { + margin-left: .25rem !important; + margin-right: .25rem !important + } + + .mx-sm-2 { + margin-left: .5rem !important; + margin-right: .5rem !important + } + + .mx-sm-3 { + margin-left: 1rem !important; + margin-right: 1rem !important + } + + .mx-sm-4 { + margin-left: 1.5rem !important; + margin-right: 1.5rem !important + } + + .mx-sm-5 { + margin-left: 3rem !important; + margin-right: 3rem !important + } + + .mx-sm-6 { + margin-left: 4.5rem !important; + margin-right: 4.5rem !important + } + + .mx-sm-7 { + margin-left: 6rem !important; + margin-right: 6rem !important + } + + .mx-sm-auto { + margin-left: auto !important; + margin-right: auto !important + } + + .my-sm-0 { + margin-bottom: 0 !important; + margin-top: 0 !important + } + + .my-sm-1 { + margin-bottom: .25rem !important; + margin-top: .25rem !important + } + + .my-sm-2 { + margin-bottom: .5rem !important; + margin-top: .5rem !important + } + + .my-sm-3 { + margin-bottom: 1rem !important; + margin-top: 1rem !important + } + + .my-sm-4 { + margin-bottom: 1.5rem !important; + margin-top: 1.5rem !important + } + + .my-sm-5 { + margin-bottom: 3rem !important; + margin-top: 3rem !important + } + + .my-sm-6 { + margin-bottom: 4.5rem !important; + margin-top: 4.5rem !important + } + + .my-sm-7 { + margin-bottom: 6rem !important; + margin-top: 6rem !important + } + + .my-sm-auto { + margin-bottom: auto !important; + margin-top: auto !important + } + + .mt-sm-0 { + margin-top: 0 !important + } + + .mt-sm-1 { + margin-top: .25rem !important + } + + .mt-sm-2 { + margin-top: .5rem !important + } + + .mt-sm-3 { + margin-top: 1rem !important + } + + .mt-sm-4 { + margin-top: 1.5rem !important + } + + .mt-sm-5 { + margin-top: 3rem !important + } + + .mt-sm-6 { + margin-top: 4.5rem !important + } + + .mt-sm-7 { + margin-top: 6rem !important + } + + .mt-sm-auto { + margin-top: auto !important + } + + .me-sm-0 { + margin-right: 0 !important + } + + .me-sm-1 { + margin-right: .25rem !important + } + + .me-sm-2 { + margin-right: .5rem !important + } + + .me-sm-3 { + margin-right: 1rem !important + } + + .me-sm-4 { + margin-right: 1.5rem !important + } + + .me-sm-5 { + margin-right: 3rem !important + } + + .me-sm-6 { + margin-right: 4.5rem !important + } + + .me-sm-7 { + margin-right: 6rem !important + } + + .me-sm-auto { + margin-right: auto !important + } + + .mb-sm-0 { + margin-bottom: 0 !important + } + + .mb-sm-1 { + margin-bottom: .25rem !important + } + + .mb-sm-2 { + margin-bottom: .5rem !important + } + + .mb-sm-3 { + margin-bottom: 1rem !important + } + + .mb-sm-4 { + margin-bottom: 1.5rem !important + } + + .mb-sm-5 { + margin-bottom: 3rem !important + } + + .mb-sm-6 { + margin-bottom: 4.5rem !important + } + + .mb-sm-7 { + margin-bottom: 6rem !important + } + + .mb-sm-auto { + margin-bottom: auto !important + } + + .ms-sm-0 { + margin-left: 0 !important + } + + .ms-sm-1 { + margin-left: .25rem !important + } + + .ms-sm-2 { + margin-left: .5rem !important + } + + .ms-sm-3 { + margin-left: 1rem !important + } + + .ms-sm-4 { + margin-left: 1.5rem !important + } + + .ms-sm-5 { + margin-left: 3rem !important + } + + .ms-sm-6 { + margin-left: 4.5rem !important + } + + .ms-sm-7 { + margin-left: 6rem !important + } + + .ms-sm-auto { + margin-left: auto !important + } + + .m-sm-n1 { + margin: -.25rem !important + } + + .m-sm-n2 { + margin: -.5rem !important + } + + .m-sm-n3 { + margin: -1rem !important + } + + .m-sm-n4 { + margin: -1.5rem !important + } + + .m-sm-n5 { + margin: -3rem !important + } + + .m-sm-n6 { + margin: -4.5rem !important + } + + .m-sm-n7 { + margin: -6rem !important + } + + .mx-sm-n1 { + margin-left: -.25rem !important; + margin-right: -.25rem !important + } + + .mx-sm-n2 { + margin-left: -.5rem !important; + margin-right: -.5rem !important + } + + .mx-sm-n3 { + margin-left: -1rem !important; + margin-right: -1rem !important + } + + .mx-sm-n4 { + margin-left: -1.5rem !important; + margin-right: -1.5rem !important + } + + .mx-sm-n5 { + margin-left: -3rem !important; + margin-right: -3rem !important + } + + .mx-sm-n6 { + margin-left: -4.5rem !important; + margin-right: -4.5rem !important + } + + .mx-sm-n7 { + margin-left: -6rem !important; + margin-right: -6rem !important + } + + .my-sm-n1 { + margin-bottom: -.25rem !important; + margin-top: -.25rem !important + } + + .my-sm-n2 { + margin-bottom: -.5rem !important; + margin-top: -.5rem !important + } + + .my-sm-n3 { + margin-bottom: -1rem !important; + margin-top: -1rem !important + } + + .my-sm-n4 { + margin-bottom: -1.5rem !important; + margin-top: -1.5rem !important + } + + .my-sm-n5 { + margin-bottom: -3rem !important; + margin-top: -3rem !important + } + + .my-sm-n6 { + margin-bottom: -4.5rem !important; + margin-top: -4.5rem !important + } + + .my-sm-n7 { + margin-bottom: -6rem !important; + margin-top: -6rem !important + } + + .mt-sm-n1 { + margin-top: -.25rem !important + } + + .mt-sm-n2 { + margin-top: -.5rem !important + } + + .mt-sm-n3 { + margin-top: -1rem !important + } + + .mt-sm-n4 { + margin-top: -1.5rem !important + } + + .mt-sm-n5 { + margin-top: -3rem !important + } + + .mt-sm-n6 { + margin-top: -4.5rem !important + } + + .mt-sm-n7 { + margin-top: -6rem !important + } + + .me-sm-n1 { + margin-right: -.25rem !important + } + + .me-sm-n2 { + margin-right: -.5rem !important + } + + .me-sm-n3 { + margin-right: -1rem !important + } + + .me-sm-n4 { + margin-right: -1.5rem !important + } + + .me-sm-n5 { + margin-right: -3rem !important + } + + .me-sm-n6 { + margin-right: -4.5rem !important + } + + .me-sm-n7 { + margin-right: -6rem !important + } + + .mb-sm-n1 { + margin-bottom: -.25rem !important + } + + .mb-sm-n2 { + margin-bottom: -.5rem !important + } + + .mb-sm-n3 { + margin-bottom: -1rem !important + } + + .mb-sm-n4 { + margin-bottom: -1.5rem !important + } + + .mb-sm-n5 { + margin-bottom: -3rem !important + } + + .mb-sm-n6 { + margin-bottom: -4.5rem !important + } + + .mb-sm-n7 { + margin-bottom: -6rem !important + } + + .ms-sm-n1 { + margin-left: -.25rem !important + } + + .ms-sm-n2 { + margin-left: -.5rem !important + } + + .ms-sm-n3 { + margin-left: -1rem !important + } + + .ms-sm-n4 { + margin-left: -1.5rem !important + } + + .ms-sm-n5 { + margin-left: -3rem !important + } + + .ms-sm-n6 { + margin-left: -4.5rem !important + } + + .ms-sm-n7 { + margin-left: -6rem !important + } + + .p-sm-0 { + padding: 0 !important + } + + .p-sm-1 { + padding: .25rem !important + } + + .p-sm-2 { + padding: .5rem !important + } + + .p-sm-3 { + padding: 1rem !important + } + + .p-sm-4 { + padding: 1.5rem !important + } + + .p-sm-5 { + padding: 3rem !important + } + + .p-sm-6 { + padding: 4.5rem !important + } + + .p-sm-7 { + padding: 6rem !important + } + + .px-sm-0 { + padding-left: 0 !important; + padding-right: 0 !important + } + + .px-sm-1 { + padding-left: .25rem !important; + padding-right: .25rem !important + } + + .px-sm-2 { + padding-left: .5rem !important; + padding-right: .5rem !important + } + + .px-sm-3 { + padding-left: 1rem !important; + padding-right: 1rem !important + } + + .px-sm-4 { + padding-left: 1.5rem !important; + padding-right: 1.5rem !important + } + + .px-sm-5 { + padding-left: 3rem !important; + padding-right: 3rem !important + } + + .px-sm-6 { + padding-left: 4.5rem !important; + padding-right: 4.5rem !important + } + + .px-sm-7 { + padding-left: 6rem !important; + padding-right: 6rem !important + } + + .py-sm-0 { + padding-bottom: 0 !important; + padding-top: 0 !important + } + + .py-sm-1 { + padding-bottom: .25rem !important; + padding-top: .25rem !important + } + + .py-sm-2 { + padding-bottom: .5rem !important; + padding-top: .5rem !important + } + + .py-sm-3 { + padding-bottom: 1rem !important; + padding-top: 1rem !important + } + + .py-sm-4 { + padding-bottom: 1.5rem !important; + padding-top: 1.5rem !important + } + + .py-sm-5 { + padding-bottom: 3rem !important; + padding-top: 3rem !important + } + + .py-sm-6 { + padding-bottom: 4.5rem !important; + padding-top: 4.5rem !important + } + + .py-sm-7 { + padding-bottom: 6rem !important; + padding-top: 6rem !important + } + + .pt-sm-0 { + padding-top: 0 !important + } + + .pt-sm-1 { + padding-top: .25rem !important + } + + .pt-sm-2 { + padding-top: .5rem !important + } + + .pt-sm-3 { + padding-top: 1rem !important + } + + .pt-sm-4 { + padding-top: 1.5rem !important + } + + .pt-sm-5 { + padding-top: 3rem !important + } + + .pt-sm-6 { + padding-top: 4.5rem !important + } + + .pt-sm-7 { + padding-top: 6rem !important + } + + .pe-sm-0 { + padding-right: 0 !important + } + + .pe-sm-1 { + padding-right: .25rem !important + } + + .pe-sm-2 { + padding-right: .5rem !important + } + + .pe-sm-3 { + padding-right: 1rem !important + } + + .pe-sm-4 { + padding-right: 1.5rem !important + } + + .pe-sm-5 { + padding-right: 3rem !important + } + + .pe-sm-6 { + padding-right: 4.5rem !important + } + + .pe-sm-7 { + padding-right: 6rem !important + } + + .pb-sm-0 { + padding-bottom: 0 !important + } + + .pb-sm-1 { + padding-bottom: .25rem !important + } + + .pb-sm-2 { + padding-bottom: .5rem !important + } + + .pb-sm-3 { + padding-bottom: 1rem !important + } + + .pb-sm-4 { + padding-bottom: 1.5rem !important + } + + .pb-sm-5 { + padding-bottom: 3rem !important + } + + .pb-sm-6 { + padding-bottom: 4.5rem !important + } + + .pb-sm-7 { + padding-bottom: 6rem !important + } + + .ps-sm-0 { + padding-left: 0 !important + } + + .ps-sm-1 { + padding-left: .25rem !important + } + + .ps-sm-2 { + padding-left: .5rem !important + } + + .ps-sm-3 { + padding-left: 1rem !important + } + + .ps-sm-4 { + padding-left: 1.5rem !important + } + + .ps-sm-5 { + padding-left: 3rem !important + } + + .ps-sm-6 { + padding-left: 4.5rem !important + } + + .ps-sm-7 { + padding-left: 6rem !important + } + + .gap-sm-0 { + gap: 0 !important + } + + .gap-sm-1 { + gap: .25rem !important + } + + .gap-sm-2 { + gap: .5rem !important + } + + .gap-sm-3 { + gap: 1rem !important + } + + .gap-sm-4 { + gap: 1.5rem !important + } + + .gap-sm-5 { + gap: 3rem !important + } + + .gap-sm-6 { + gap: 4.5rem !important + } + + .gap-sm-7 { + gap: 6rem !important + } + + .text-sm-start { + text-align: left !important + } + + .text-sm-end { + text-align: right !important + } + + .text-sm-center { + text-align: center !important + } +} + +@media (min-width: 768px) { + .float-md-start { + float: left !important + } + + .float-md-end { + float: right !important + } + + .float-md-none { + float: none !important + } + + .d-md-inline { + display: inline !important + } + + .d-md-inline-block { + display: inline-block !important + } + + .d-md-block { + display: block !important + } + + .d-md-grid { + display: grid !important + } + + .d-md-table { + display: table !important + } + + .d-md-table-row { + display: table-row !important + } + + .d-md-table-cell { + display: table-cell !important + } + + .d-md-flex, .horizontal-menu .navbar .navbar-content .search-form { + display: flex !important + } + + .d-md-inline-flex { + display: inline-flex !important + } + + .d-md-none { + display: none !important + } + + .border-md { + border: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important + } + + .border-md-0 { + border: 0 !important + } + + .border-top-md { + border-top: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important + } + + .border-top-md-0 { + border-top: 0 !important + } + + .border-end-md { + border-right: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important + } + + .border-end-md-0 { + border-right: 0 !important + } + + .border-bottom-md { + border-bottom: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important + } + + .border-bottom-md-0 { + border-bottom: 0 !important + } + + .border-start-md { + border-left: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important + } + + .border-start-md-0 { + border-left: 0 !important + } + + .flex-md-fill { + flex: 1 1 auto !important + } + + .flex-md-row { + flex-direction: row !important + } + + .flex-md-column { + flex-direction: column !important + } + + .flex-md-row-reverse { + flex-direction: row-reverse !important + } + + .flex-md-column-reverse { + flex-direction: column-reverse !important + } + + .flex-md-grow-0 { + flex-grow: 0 !important + } + + .flex-md-grow-1 { + flex-grow: 1 !important + } + + .flex-md-shrink-0 { + flex-shrink: 0 !important + } + + .flex-md-shrink-1 { + flex-shrink: 1 !important + } + + .flex-md-wrap { + flex-wrap: wrap !important + } + + .flex-md-nowrap { + flex-wrap: nowrap !important + } + + .flex-md-wrap-reverse { + flex-wrap: wrap-reverse !important + } + + .justify-content-md-start { + justify-content: flex-start !important + } + + .dataTables_wrapper div.dataTables_paginate ul.pagination, .justify-content-md-end { + justify-content: flex-end !important + } + + .justify-content-md-center { + justify-content: center !important + } + + .justify-content-md-between { + justify-content: space-between !important + } + + .justify-content-md-around { + justify-content: space-around !important + } + + .justify-content-md-evenly { + justify-content: space-evenly !important + } + + .align-items-md-start { + align-items: flex-start !important + } + + .align-items-md-end { + align-items: flex-end !important + } + + .align-items-md-center { + align-items: center !important + } + + .align-items-md-baseline { + align-items: baseline !important + } + + .align-items-md-stretch { + align-items: stretch !important + } + + .align-content-md-start { + align-content: flex-start !important + } + + .align-content-md-end { + align-content: flex-end !important + } + + .align-content-md-center { + align-content: center !important + } + + .align-content-md-between { + align-content: space-between !important + } + + .align-content-md-around { + align-content: space-around !important + } + + .align-content-md-stretch { + align-content: stretch !important + } + + .align-self-md-auto { + align-self: auto !important + } + + .align-self-md-start { + align-self: flex-start !important + } + + .align-self-md-end { + align-self: flex-end !important + } + + .align-self-md-center { + align-self: center !important + } + + .align-self-md-baseline { + align-self: baseline !important + } + + .align-self-md-stretch { + align-self: stretch !important + } + + .order-md-first { + order: -1 !important + } + + .order-md-0 { + order: 0 !important + } + + .order-md-1 { + order: 1 !important + } + + .order-md-2 { + order: 2 !important + } + + .order-md-3 { + order: 3 !important + } + + .order-md-4 { + order: 4 !important + } + + .order-md-5 { + order: 5 !important + } + + .order-md-last { + order: 6 !important + } + + .m-md-0 { + margin: 0 !important + } + + .m-md-1 { + margin: .25rem !important + } + + .m-md-2 { + margin: .5rem !important + } + + .m-md-3 { + margin: 1rem !important + } + + .m-md-4 { + margin: 1.5rem !important + } + + .m-md-5 { + margin: 3rem !important + } + + .m-md-6 { + margin: 4.5rem !important + } + + .m-md-7 { + margin: 6rem !important + } + + .m-md-auto { + margin: auto !important + } + + .mx-md-0 { + margin-left: 0 !important; + margin-right: 0 !important + } + + .mx-md-1 { + margin-left: .25rem !important; + margin-right: .25rem !important + } + + .mx-md-2 { + margin-left: .5rem !important; + margin-right: .5rem !important + } + + .mx-md-3 { + margin-left: 1rem !important; + margin-right: 1rem !important + } + + .mx-md-4 { + margin-left: 1.5rem !important; + margin-right: 1.5rem !important + } + + .mx-md-5 { + margin-left: 3rem !important; + margin-right: 3rem !important + } + + .mx-md-6 { + margin-left: 4.5rem !important; + margin-right: 4.5rem !important + } + + .mx-md-7 { + margin-left: 6rem !important; + margin-right: 6rem !important + } + + .mx-md-auto { + margin-left: auto !important; + margin-right: auto !important + } + + .my-md-0 { + margin-bottom: 0 !important; + margin-top: 0 !important + } + + .my-md-1 { + margin-bottom: .25rem !important; + margin-top: .25rem !important + } + + .my-md-2 { + margin-bottom: .5rem !important; + margin-top: .5rem !important + } + + .my-md-3 { + margin-bottom: 1rem !important; + margin-top: 1rem !important + } + + .my-md-4 { + margin-bottom: 1.5rem !important; + margin-top: 1.5rem !important + } + + .my-md-5 { + margin-bottom: 3rem !important; + margin-top: 3rem !important + } + + .my-md-6 { + margin-bottom: 4.5rem !important; + margin-top: 4.5rem !important + } + + .my-md-7 { + margin-bottom: 6rem !important; + margin-top: 6rem !important + } + + .my-md-auto { + margin-bottom: auto !important; + margin-top: auto !important + } + + .dataTables_wrapper div.dataTables_paginate ul.pagination, .mt-md-0 { + margin-top: 0 !important + } + + .mt-md-1 { + margin-top: .25rem !important + } + + .mt-md-2 { + margin-top: .5rem !important + } + + .mt-md-3 { + margin-top: 1rem !important + } + + .mt-md-4 { + margin-top: 1.5rem !important + } + + .mt-md-5 { + margin-top: 3rem !important + } + + .mt-md-6 { + margin-top: 4.5rem !important + } + + .mt-md-7 { + margin-top: 6rem !important + } + + .mt-md-auto { + margin-top: auto !important + } + + .me-md-0 { + margin-right: 0 !important + } + + .me-md-1 { + margin-right: .25rem !important + } + + .me-md-2 { + margin-right: .5rem !important + } + + .me-md-3 { + margin-right: 1rem !important + } + + .me-md-4 { + margin-right: 1.5rem !important + } + + .me-md-5 { + margin-right: 3rem !important + } + + .me-md-6 { + margin-right: 4.5rem !important + } + + .me-md-7 { + margin-right: 6rem !important + } + + .me-md-auto { + margin-right: auto !important + } + + .example .btn-group, .mb-md-0 { + margin-bottom: 0 !important + } + + .mb-md-1 { + margin-bottom: .25rem !important + } + + .mb-md-2 { + margin-bottom: .5rem !important + } + + .mb-md-3 { + margin-bottom: 1rem !important + } + + .mb-md-4 { + margin-bottom: 1.5rem !important + } + + .mb-md-5 { + margin-bottom: 3rem !important + } + + .mb-md-6 { + margin-bottom: 4.5rem !important + } + + .mb-md-7 { + margin-bottom: 6rem !important + } + + .mb-md-auto { + margin-bottom: auto !important + } + + .ms-md-0 { + margin-left: 0 !important + } + + .ms-md-1 { + margin-left: .25rem !important + } + + .ms-md-2 { + margin-left: .5rem !important + } + + .ms-md-3 { + margin-left: 1rem !important + } + + .ms-md-4 { + margin-left: 1.5rem !important + } + + .ms-md-5 { + margin-left: 3rem !important + } + + .ms-md-6 { + margin-left: 4.5rem !important + } + + .ms-md-7 { + margin-left: 6rem !important + } + + .ms-md-auto { + margin-left: auto !important + } + + .m-md-n1 { + margin: -.25rem !important + } + + .m-md-n2 { + margin: -.5rem !important + } + + .m-md-n3 { + margin: -1rem !important + } + + .m-md-n4 { + margin: -1.5rem !important + } + + .m-md-n5 { + margin: -3rem !important + } + + .m-md-n6 { + margin: -4.5rem !important + } + + .m-md-n7 { + margin: -6rem !important + } + + .mx-md-n1 { + margin-left: -.25rem !important; + margin-right: -.25rem !important + } + + .mx-md-n2 { + margin-left: -.5rem !important; + margin-right: -.5rem !important + } + + .mx-md-n3 { + margin-left: -1rem !important; + margin-right: -1rem !important + } + + .mx-md-n4 { + margin-left: -1.5rem !important; + margin-right: -1.5rem !important + } + + .mx-md-n5 { + margin-left: -3rem !important; + margin-right: -3rem !important + } + + .mx-md-n6 { + margin-left: -4.5rem !important; + margin-right: -4.5rem !important + } + + .mx-md-n7 { + margin-left: -6rem !important; + margin-right: -6rem !important + } + + .my-md-n1 { + margin-bottom: -.25rem !important; + margin-top: -.25rem !important + } + + .my-md-n2 { + margin-bottom: -.5rem !important; + margin-top: -.5rem !important + } + + .my-md-n3 { + margin-bottom: -1rem !important; + margin-top: -1rem !important + } + + .my-md-n4 { + margin-bottom: -1.5rem !important; + margin-top: -1.5rem !important + } + + .my-md-n5 { + margin-bottom: -3rem !important; + margin-top: -3rem !important + } + + .my-md-n6 { + margin-bottom: -4.5rem !important; + margin-top: -4.5rem !important + } + + .my-md-n7 { + margin-bottom: -6rem !important; + margin-top: -6rem !important + } + + .mt-md-n1 { + margin-top: -.25rem !important + } + + .mt-md-n2 { + margin-top: -.5rem !important + } + + .mt-md-n3 { + margin-top: -1rem !important + } + + .mt-md-n4 { + margin-top: -1.5rem !important + } + + .mt-md-n5 { + margin-top: -3rem !important + } + + .mt-md-n6 { + margin-top: -4.5rem !important + } + + .mt-md-n7 { + margin-top: -6rem !important + } + + .me-md-n1 { + margin-right: -.25rem !important + } + + .me-md-n2 { + margin-right: -.5rem !important + } + + .me-md-n3 { + margin-right: -1rem !important + } + + .me-md-n4 { + margin-right: -1.5rem !important + } + + .me-md-n5 { + margin-right: -3rem !important + } + + .me-md-n6 { + margin-right: -4.5rem !important + } + + .me-md-n7 { + margin-right: -6rem !important + } + + .mb-md-n1 { + margin-bottom: -.25rem !important + } + + .mb-md-n2 { + margin-bottom: -.5rem !important + } + + .mb-md-n3 { + margin-bottom: -1rem !important + } + + .mb-md-n4 { + margin-bottom: -1.5rem !important + } + + .mb-md-n5 { + margin-bottom: -3rem !important + } + + .mb-md-n6 { + margin-bottom: -4.5rem !important + } + + .mb-md-n7 { + margin-bottom: -6rem !important + } + + .ms-md-n1 { + margin-left: -.25rem !important + } + + .ms-md-n2 { + margin-left: -.5rem !important + } + + .ms-md-n3 { + margin-left: -1rem !important + } + + .ms-md-n4 { + margin-left: -1.5rem !important + } + + .ms-md-n5 { + margin-left: -3rem !important + } + + .ms-md-n6 { + margin-left: -4.5rem !important + } + + .ms-md-n7 { + margin-left: -6rem !important + } + + .p-md-0 { + padding: 0 !important + } + + .p-md-1 { + padding: .25rem !important + } + + .p-md-2 { + padding: .5rem !important + } + + .p-md-3 { + padding: 1rem !important + } + + .p-md-4 { + padding: 1.5rem !important + } + + .p-md-5 { + padding: 3rem !important + } + + .p-md-6 { + padding: 4.5rem !important + } + + .p-md-7 { + padding: 6rem !important + } + + .px-md-0 { + padding-left: 0 !important; + padding-right: 0 !important + } + + .px-md-1 { + padding-left: .25rem !important; + padding-right: .25rem !important + } + + .px-md-2 { + padding-left: .5rem !important; + padding-right: .5rem !important + } + + .px-md-3 { + padding-left: 1rem !important; + padding-right: 1rem !important + } + + .px-md-4 { + padding-left: 1.5rem !important; + padding-right: 1.5rem !important + } + + .px-md-5 { + padding-left: 3rem !important; + padding-right: 3rem !important + } + + .px-md-6 { + padding-left: 4.5rem !important; + padding-right: 4.5rem !important + } + + .px-md-7 { + padding-left: 6rem !important; + padding-right: 6rem !important + } + + .py-md-0 { + padding-bottom: 0 !important; + padding-top: 0 !important + } + + .py-md-1 { + padding-bottom: .25rem !important; + padding-top: .25rem !important + } + + .py-md-2 { + padding-bottom: .5rem !important; + padding-top: .5rem !important + } + + .py-md-3 { + padding-bottom: 1rem !important; + padding-top: 1rem !important + } + + .py-md-4 { + padding-bottom: 1.5rem !important; + padding-top: 1.5rem !important + } + + .py-md-5 { + padding-bottom: 3rem !important; + padding-top: 3rem !important + } + + .py-md-6 { + padding-bottom: 4.5rem !important; + padding-top: 4.5rem !important + } + + .py-md-7 { + padding-bottom: 6rem !important; + padding-top: 6rem !important + } + + .pt-md-0 { + padding-top: 0 !important + } + + .pt-md-1 { + padding-top: .25rem !important + } + + .pt-md-2 { + padding-top: .5rem !important + } + + .pt-md-3 { + padding-top: 1rem !important + } + + .pt-md-4 { + padding-top: 1.5rem !important + } + + .pt-md-5 { + padding-top: 3rem !important + } + + .pt-md-6 { + padding-top: 4.5rem !important + } + + .pt-md-7 { + padding-top: 6rem !important + } + + .pe-md-0 { + padding-right: 0 !important + } + + .pe-md-1 { + padding-right: .25rem !important + } + + .pe-md-2 { + padding-right: .5rem !important + } + + .pe-md-3 { + padding-right: 1rem !important + } + + .pe-md-4 { + padding-right: 1.5rem !important + } + + .pe-md-5 { + padding-right: 3rem !important + } + + .pe-md-6 { + padding-right: 4.5rem !important + } + + .pe-md-7 { + padding-right: 6rem !important + } + + .pb-md-0 { + padding-bottom: 0 !important + } + + .pb-md-1 { + padding-bottom: .25rem !important + } + + .pb-md-2 { + padding-bottom: .5rem !important + } + + .pb-md-3 { + padding-bottom: 1rem !important + } + + .pb-md-4 { + padding-bottom: 1.5rem !important + } + + .pb-md-5 { + padding-bottom: 3rem !important + } + + .pb-md-6 { + padding-bottom: 4.5rem !important + } + + .pb-md-7 { + padding-bottom: 6rem !important + } + + .ps-md-0 { + padding-left: 0 !important + } + + .ps-md-1 { + padding-left: .25rem !important + } + + .ps-md-2 { + padding-left: .5rem !important + } + + .ps-md-3 { + padding-left: 1rem !important + } + + .ps-md-4 { + padding-left: 1.5rem !important + } + + .ps-md-5 { + padding-left: 3rem !important + } + + .ps-md-6 { + padding-left: 4.5rem !important + } + + .ps-md-7 { + padding-left: 6rem !important + } + + .gap-md-0 { + gap: 0 !important + } + + .gap-md-1 { + gap: .25rem !important + } + + .gap-md-2 { + gap: .5rem !important + } + + .gap-md-3 { + gap: 1rem !important + } + + .gap-md-4 { + gap: 1.5rem !important + } + + .gap-md-5 { + gap: 3rem !important + } + + .gap-md-6 { + gap: 4.5rem !important + } + + .gap-md-7 { + gap: 6rem !important + } + + .text-md-start { + text-align: left !important + } + + .text-md-end { + text-align: right !important + } + + .text-md-center { + text-align: center !important + } +} + +@media (min-width: 992px) { + .float-lg-start { + float: left !important + } + + .float-lg-end { + float: right !important + } + + .float-lg-none { + float: none !important + } + + .d-lg-inline { + display: inline !important + } + + .d-lg-inline-block { + display: inline-block !important + } + + .d-lg-block { + display: block !important + } + + .d-lg-grid { + display: grid !important + } + + .d-lg-table { + display: table !important + } + + .d-lg-table-row { + display: table-row !important + } + + .d-lg-table-cell { + display: table-cell !important + } + + .d-lg-flex { + display: flex !important + } + + .d-lg-inline-flex { + display: inline-flex !important + } + + .d-lg-none { + display: none !important + } + + .border-lg { + border: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important + } + + .border-lg-0 { + border: 0 !important + } + + .border-top-lg { + border-top: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important + } + + .border-top-lg-0 { + border-top: 0 !important + } + + .border-end-lg { + border-right: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important + } + + .border-end-lg-0 { + border-right: 0 !important + } + + .border-bottom-lg { + border-bottom: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important + } + + .border-bottom-lg-0 { + border-bottom: 0 !important + } + + .border-start-lg { + border-left: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important + } + + .border-start-lg-0 { + border-left: 0 !important + } + + .flex-lg-fill { + flex: 1 1 auto !important + } + + .flex-lg-row { + flex-direction: row !important + } + + .flex-lg-column { + flex-direction: column !important + } + + .flex-lg-row-reverse { + flex-direction: row-reverse !important + } + + .flex-lg-column-reverse { + flex-direction: column-reverse !important + } + + .flex-lg-grow-0 { + flex-grow: 0 !important + } + + .flex-lg-grow-1 { + flex-grow: 1 !important + } + + .flex-lg-shrink-0 { + flex-shrink: 0 !important + } + + .flex-lg-shrink-1 { + flex-shrink: 1 !important + } + + .flex-lg-wrap { + flex-wrap: wrap !important + } + + .flex-lg-nowrap { + flex-wrap: nowrap !important + } + + .flex-lg-wrap-reverse { + flex-wrap: wrap-reverse !important + } + + .justify-content-lg-start { + justify-content: flex-start !important + } + + .justify-content-lg-end { + justify-content: flex-end !important + } + + .justify-content-lg-center { + justify-content: center !important + } + + .justify-content-lg-between { + justify-content: space-between !important + } + + .justify-content-lg-around { + justify-content: space-around !important + } + + .justify-content-lg-evenly { + justify-content: space-evenly !important + } + + .align-items-lg-start { + align-items: flex-start !important + } + + .align-items-lg-end { + align-items: flex-end !important + } + + .align-items-lg-center { + align-items: center !important + } + + .align-items-lg-baseline { + align-items: baseline !important + } + + .align-items-lg-stretch { + align-items: stretch !important + } + + .align-content-lg-start { + align-content: flex-start !important + } + + .align-content-lg-end { + align-content: flex-end !important + } + + .align-content-lg-center { + align-content: center !important + } + + .align-content-lg-between { + align-content: space-between !important + } + + .align-content-lg-around { + align-content: space-around !important + } + + .align-content-lg-stretch { + align-content: stretch !important + } + + .align-self-lg-auto { + align-self: auto !important + } + + .align-self-lg-start { + align-self: flex-start !important + } + + .align-self-lg-end { + align-self: flex-end !important + } + + .align-self-lg-center { + align-self: center !important + } + + .align-self-lg-baseline { + align-self: baseline !important + } + + .align-self-lg-stretch { + align-self: stretch !important + } + + .order-lg-first { + order: -1 !important + } + + .order-lg-0 { + order: 0 !important + } + + .order-lg-1 { + order: 1 !important + } + + .order-lg-2 { + order: 2 !important + } + + .order-lg-3 { + order: 3 !important + } + + .order-lg-4 { + order: 4 !important + } + + .order-lg-5 { + order: 5 !important + } + + .order-lg-last { + order: 6 !important + } + + .m-lg-0 { + margin: 0 !important + } + + .m-lg-1 { + margin: .25rem !important + } + + .m-lg-2 { + margin: .5rem !important + } + + .m-lg-3 { + margin: 1rem !important + } + + .m-lg-4 { + margin: 1.5rem !important + } + + .m-lg-5 { + margin: 3rem !important + } + + .m-lg-6 { + margin: 4.5rem !important + } + + .m-lg-7 { + margin: 6rem !important + } + + .m-lg-auto { + margin: auto !important + } + + .mx-lg-0 { + margin-left: 0 !important; + margin-right: 0 !important + } + + .mx-lg-1 { + margin-left: .25rem !important; + margin-right: .25rem !important + } + + .mx-lg-2 { + margin-left: .5rem !important; + margin-right: .5rem !important + } + + .mx-lg-3 { + margin-left: 1rem !important; + margin-right: 1rem !important + } + + .mx-lg-4 { + margin-left: 1.5rem !important; + margin-right: 1.5rem !important + } + + .mx-lg-5 { + margin-left: 3rem !important; + margin-right: 3rem !important + } + + .mx-lg-6 { + margin-left: 4.5rem !important; + margin-right: 4.5rem !important + } + + .mx-lg-7 { + margin-left: 6rem !important; + margin-right: 6rem !important + } + + .mx-lg-auto { + margin-left: auto !important; + margin-right: auto !important + } + + .my-lg-0 { + margin-bottom: 0 !important; + margin-top: 0 !important + } + + .my-lg-1 { + margin-bottom: .25rem !important; + margin-top: .25rem !important + } + + .my-lg-2 { + margin-bottom: .5rem !important; + margin-top: .5rem !important + } + + .my-lg-3 { + margin-bottom: 1rem !important; + margin-top: 1rem !important + } + + .my-lg-4 { + margin-bottom: 1.5rem !important; + margin-top: 1.5rem !important + } + + .my-lg-5 { + margin-bottom: 3rem !important; + margin-top: 3rem !important + } + + .my-lg-6 { + margin-bottom: 4.5rem !important; + margin-top: 4.5rem !important + } + + .my-lg-7 { + margin-bottom: 6rem !important; + margin-top: 6rem !important + } + + .my-lg-auto { + margin-bottom: auto !important; + margin-top: auto !important + } + + .mt-lg-0 { + margin-top: 0 !important + } + + .mt-lg-1 { + margin-top: .25rem !important + } + + .mt-lg-2 { + margin-top: .5rem !important + } + + .mt-lg-3 { + margin-top: 1rem !important + } + + .mt-lg-4 { + margin-top: 1.5rem !important + } + + .mt-lg-5 { + margin-top: 3rem !important + } + + .mt-lg-6 { + margin-top: 4.5rem !important + } + + .mt-lg-7 { + margin-top: 6rem !important + } + + .mt-lg-auto { + margin-top: auto !important + } + + .me-lg-0 { + margin-right: 0 !important + } + + .me-lg-1 { + margin-right: .25rem !important + } + + .me-lg-2 { + margin-right: .5rem !important + } + + .me-lg-3 { + margin-right: 1rem !important + } + + .me-lg-4 { + margin-right: 1.5rem !important + } + + .me-lg-5 { + margin-right: 3rem !important + } + + .me-lg-6 { + margin-right: 4.5rem !important + } + + .me-lg-7 { + margin-right: 6rem !important + } + + .me-lg-auto { + margin-right: auto !important + } + + .mb-lg-0 { + margin-bottom: 0 !important + } + + .mb-lg-1 { + margin-bottom: .25rem !important + } + + .mb-lg-2 { + margin-bottom: .5rem !important + } + + .mb-lg-3 { + margin-bottom: 1rem !important + } + + .mb-lg-4 { + margin-bottom: 1.5rem !important + } + + .mb-lg-5 { + margin-bottom: 3rem !important + } + + .mb-lg-6 { + margin-bottom: 4.5rem !important + } + + .mb-lg-7 { + margin-bottom: 6rem !important + } + + .mb-lg-auto { + margin-bottom: auto !important + } + + .ms-lg-0 { + margin-left: 0 !important + } + + .ms-lg-1 { + margin-left: .25rem !important + } + + .ms-lg-2 { + margin-left: .5rem !important + } + + .ms-lg-3 { + margin-left: 1rem !important + } + + .ms-lg-4 { + margin-left: 1.5rem !important + } + + .ms-lg-5 { + margin-left: 3rem !important + } + + .ms-lg-6 { + margin-left: 4.5rem !important + } + + .ms-lg-7 { + margin-left: 6rem !important + } + + .ms-lg-auto { + margin-left: auto !important + } + + .m-lg-n1 { + margin: -.25rem !important + } + + .m-lg-n2 { + margin: -.5rem !important + } + + .m-lg-n3 { + margin: -1rem !important + } + + .m-lg-n4 { + margin: -1.5rem !important + } + + .m-lg-n5 { + margin: -3rem !important + } + + .m-lg-n6 { + margin: -4.5rem !important + } + + .m-lg-n7 { + margin: -6rem !important + } + + .mx-lg-n1 { + margin-left: -.25rem !important; + margin-right: -.25rem !important + } + + .mx-lg-n2 { + margin-left: -.5rem !important; + margin-right: -.5rem !important + } + + .mx-lg-n3 { + margin-left: -1rem !important; + margin-right: -1rem !important + } + + .mx-lg-n4 { + margin-left: -1.5rem !important; + margin-right: -1.5rem !important + } + + .mx-lg-n5 { + margin-left: -3rem !important; + margin-right: -3rem !important + } + + .mx-lg-n6 { + margin-left: -4.5rem !important; + margin-right: -4.5rem !important + } + + .mx-lg-n7 { + margin-left: -6rem !important; + margin-right: -6rem !important + } + + .my-lg-n1 { + margin-bottom: -.25rem !important; + margin-top: -.25rem !important + } + + .my-lg-n2 { + margin-bottom: -.5rem !important; + margin-top: -.5rem !important + } + + .my-lg-n3 { + margin-bottom: -1rem !important; + margin-top: -1rem !important + } + + .my-lg-n4 { + margin-bottom: -1.5rem !important; + margin-top: -1.5rem !important + } + + .my-lg-n5 { + margin-bottom: -3rem !important; + margin-top: -3rem !important + } + + .my-lg-n6 { + margin-bottom: -4.5rem !important; + margin-top: -4.5rem !important + } + + .my-lg-n7 { + margin-bottom: -6rem !important; + margin-top: -6rem !important + } + + .mt-lg-n1 { + margin-top: -.25rem !important + } + + .mt-lg-n2 { + margin-top: -.5rem !important + } + + .mt-lg-n3 { + margin-top: -1rem !important + } + + .mt-lg-n4 { + margin-top: -1.5rem !important + } + + .mt-lg-n5 { + margin-top: -3rem !important + } + + .mt-lg-n6 { + margin-top: -4.5rem !important + } + + .mt-lg-n7 { + margin-top: -6rem !important + } + + .me-lg-n1 { + margin-right: -.25rem !important + } + + .me-lg-n2 { + margin-right: -.5rem !important + } + + .me-lg-n3 { + margin-right: -1rem !important + } + + .me-lg-n4 { + margin-right: -1.5rem !important + } + + .me-lg-n5 { + margin-right: -3rem !important + } + + .me-lg-n6 { + margin-right: -4.5rem !important + } + + .me-lg-n7 { + margin-right: -6rem !important + } + + .mb-lg-n1 { + margin-bottom: -.25rem !important + } + + .mb-lg-n2 { + margin-bottom: -.5rem !important + } + + .mb-lg-n3 { + margin-bottom: -1rem !important + } + + .mb-lg-n4 { + margin-bottom: -1.5rem !important + } + + .mb-lg-n5 { + margin-bottom: -3rem !important + } + + .mb-lg-n6 { + margin-bottom: -4.5rem !important + } + + .mb-lg-n7 { + margin-bottom: -6rem !important + } + + .ms-lg-n1 { + margin-left: -.25rem !important + } + + .ms-lg-n2 { + margin-left: -.5rem !important + } + + .ms-lg-n3 { + margin-left: -1rem !important + } + + .ms-lg-n4 { + margin-left: -1.5rem !important + } + + .ms-lg-n5 { + margin-left: -3rem !important + } + + .ms-lg-n6 { + margin-left: -4.5rem !important + } + + .ms-lg-n7 { + margin-left: -6rem !important + } + + .p-lg-0 { + padding: 0 !important + } + + .p-lg-1 { + padding: .25rem !important + } + + .p-lg-2 { + padding: .5rem !important + } + + .p-lg-3 { + padding: 1rem !important + } + + .p-lg-4 { + padding: 1.5rem !important + } + + .p-lg-5 { + padding: 3rem !important + } + + .p-lg-6 { + padding: 4.5rem !important + } + + .p-lg-7 { + padding: 6rem !important + } + + .px-lg-0 { + padding-left: 0 !important; + padding-right: 0 !important + } + + .px-lg-1 { + padding-left: .25rem !important; + padding-right: .25rem !important + } + + .px-lg-2 { + padding-left: .5rem !important; + padding-right: .5rem !important + } + + .px-lg-3 { + padding-left: 1rem !important; + padding-right: 1rem !important + } + + .px-lg-4 { + padding-left: 1.5rem !important; + padding-right: 1.5rem !important + } + + .px-lg-5 { + padding-left: 3rem !important; + padding-right: 3rem !important + } + + .px-lg-6 { + padding-left: 4.5rem !important; + padding-right: 4.5rem !important + } + + .px-lg-7 { + padding-left: 6rem !important; + padding-right: 6rem !important + } + + .py-lg-0 { + padding-bottom: 0 !important; + padding-top: 0 !important + } + + .py-lg-1 { + padding-bottom: .25rem !important; + padding-top: .25rem !important + } + + .py-lg-2 { + padding-bottom: .5rem !important; + padding-top: .5rem !important + } + + .py-lg-3 { + padding-bottom: 1rem !important; + padding-top: 1rem !important + } + + .py-lg-4 { + padding-bottom: 1.5rem !important; + padding-top: 1.5rem !important + } + + .py-lg-5 { + padding-bottom: 3rem !important; + padding-top: 3rem !important + } + + .py-lg-6 { + padding-bottom: 4.5rem !important; + padding-top: 4.5rem !important + } + + .py-lg-7 { + padding-bottom: 6rem !important; + padding-top: 6rem !important + } + + .pt-lg-0 { + padding-top: 0 !important + } + + .pt-lg-1 { + padding-top: .25rem !important + } + + .pt-lg-2 { + padding-top: .5rem !important + } + + .pt-lg-3 { + padding-top: 1rem !important + } + + .pt-lg-4 { + padding-top: 1.5rem !important + } + + .pt-lg-5 { + padding-top: 3rem !important + } + + .pt-lg-6 { + padding-top: 4.5rem !important + } + + .pt-lg-7 { + padding-top: 6rem !important + } + + .pe-lg-0 { + padding-right: 0 !important + } + + .pe-lg-1 { + padding-right: .25rem !important + } + + .pe-lg-2 { + padding-right: .5rem !important + } + + .pe-lg-3 { + padding-right: 1rem !important + } + + .pe-lg-4 { + padding-right: 1.5rem !important + } + + .pe-lg-5 { + padding-right: 3rem !important + } + + .pe-lg-6 { + padding-right: 4.5rem !important + } + + .pe-lg-7 { + padding-right: 6rem !important + } + + .pb-lg-0 { + padding-bottom: 0 !important + } + + .pb-lg-1 { + padding-bottom: .25rem !important + } + + .pb-lg-2 { + padding-bottom: .5rem !important + } + + .pb-lg-3 { + padding-bottom: 1rem !important + } + + .pb-lg-4 { + padding-bottom: 1.5rem !important + } + + .pb-lg-5 { + padding-bottom: 3rem !important + } + + .pb-lg-6 { + padding-bottom: 4.5rem !important + } + + .pb-lg-7 { + padding-bottom: 6rem !important + } + + .ps-lg-0 { + padding-left: 0 !important + } + + .ps-lg-1 { + padding-left: .25rem !important + } + + .ps-lg-2 { + padding-left: .5rem !important + } + + .ps-lg-3 { + padding-left: 1rem !important + } + + .ps-lg-4 { + padding-left: 1.5rem !important + } + + .ps-lg-5 { + padding-left: 3rem !important + } + + .ps-lg-6 { + padding-left: 4.5rem !important + } + + .ps-lg-7 { + padding-left: 6rem !important + } + + .gap-lg-0 { + gap: 0 !important + } + + .gap-lg-1 { + gap: .25rem !important + } + + .gap-lg-2 { + gap: .5rem !important + } + + .gap-lg-3 { + gap: 1rem !important + } + + .gap-lg-4 { + gap: 1.5rem !important + } + + .gap-lg-5 { + gap: 3rem !important + } + + .gap-lg-6 { + gap: 4.5rem !important + } + + .gap-lg-7 { + gap: 6rem !important + } + + .text-lg-start { + text-align: left !important + } + + .text-lg-end { + text-align: right !important + } + + .text-lg-center { + text-align: center !important + } +} + +@media (min-width: 1200px) { + .float-xl-start { + float: left !important + } + + .float-xl-end { + float: right !important + } + + .float-xl-none { + float: none !important + } + + .d-xl-inline { + display: inline !important + } + + .d-xl-inline-block { + display: inline-block !important + } + + .d-xl-block { + display: block !important + } + + .d-xl-grid { + display: grid !important + } + + .d-xl-table { + display: table !important + } + + .d-xl-table-row { + display: table-row !important + } + + .d-xl-table-cell { + display: table-cell !important + } + + .d-xl-flex { + display: flex !important + } + + .d-xl-inline-flex { + display: inline-flex !important + } + + .d-xl-none { + display: none !important + } + + .border-xl { + border: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important + } + + .border-xl-0 { + border: 0 !important + } + + .border-top-xl { + border-top: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important + } + + .border-top-xl-0 { + border-top: 0 !important + } + + .border-end-xl { + border-right: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important + } + + .border-end-xl-0 { + border-right: 0 !important + } + + .border-bottom-xl { + border-bottom: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important + } + + .border-bottom-xl-0 { + border-bottom: 0 !important + } + + .border-start-xl { + border-left: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important + } + + .border-start-xl-0 { + border-left: 0 !important + } + + .flex-xl-fill { + flex: 1 1 auto !important + } + + .flex-xl-row { + flex-direction: row !important + } + + .flex-xl-column { + flex-direction: column !important + } + + .flex-xl-row-reverse { + flex-direction: row-reverse !important + } + + .flex-xl-column-reverse { + flex-direction: column-reverse !important + } + + .flex-xl-grow-0 { + flex-grow: 0 !important + } + + .flex-xl-grow-1 { + flex-grow: 1 !important + } + + .flex-xl-shrink-0 { + flex-shrink: 0 !important + } + + .flex-xl-shrink-1 { + flex-shrink: 1 !important + } + + .flex-xl-wrap { + flex-wrap: wrap !important + } + + .flex-xl-nowrap { + flex-wrap: nowrap !important + } + + .flex-xl-wrap-reverse { + flex-wrap: wrap-reverse !important + } + + .justify-content-xl-start { + justify-content: flex-start !important + } + + .justify-content-xl-end { + justify-content: flex-end !important + } + + .justify-content-xl-center { + justify-content: center !important + } + + .justify-content-xl-between { + justify-content: space-between !important + } + + .justify-content-xl-around { + justify-content: space-around !important + } + + .justify-content-xl-evenly { + justify-content: space-evenly !important + } + + .align-items-xl-start { + align-items: flex-start !important + } + + .align-items-xl-end { + align-items: flex-end !important + } + + .align-items-xl-center { + align-items: center !important + } + + .align-items-xl-baseline { + align-items: baseline !important + } + + .align-items-xl-stretch { + align-items: stretch !important + } + + .align-content-xl-start { + align-content: flex-start !important + } + + .align-content-xl-end { + align-content: flex-end !important + } + + .align-content-xl-center { + align-content: center !important + } + + .align-content-xl-between { + align-content: space-between !important + } + + .align-content-xl-around { + align-content: space-around !important + } + + .align-content-xl-stretch { + align-content: stretch !important + } + + .align-self-xl-auto { + align-self: auto !important + } + + .align-self-xl-start { + align-self: flex-start !important + } + + .align-self-xl-end { + align-self: flex-end !important + } + + .align-self-xl-center { + align-self: center !important + } + + .align-self-xl-baseline { + align-self: baseline !important + } + + .align-self-xl-stretch { + align-self: stretch !important + } + + .order-xl-first { + order: -1 !important + } + + .order-xl-0 { + order: 0 !important + } + + .order-xl-1 { + order: 1 !important + } + + .order-xl-2 { + order: 2 !important + } + + .order-xl-3 { + order: 3 !important + } + + .order-xl-4 { + order: 4 !important + } + + .order-xl-5 { + order: 5 !important + } + + .order-xl-last { + order: 6 !important + } + + .m-xl-0 { + margin: 0 !important + } + + .m-xl-1 { + margin: .25rem !important + } + + .m-xl-2 { + margin: .5rem !important + } + + .m-xl-3 { + margin: 1rem !important + } + + .m-xl-4 { + margin: 1.5rem !important + } + + .m-xl-5 { + margin: 3rem !important + } + + .m-xl-6 { + margin: 4.5rem !important + } + + .m-xl-7 { + margin: 6rem !important + } + + .m-xl-auto { + margin: auto !important + } + + .mx-xl-0 { + margin-left: 0 !important; + margin-right: 0 !important + } + + .mx-xl-1 { + margin-left: .25rem !important; + margin-right: .25rem !important + } + + .mx-xl-2 { + margin-left: .5rem !important; + margin-right: .5rem !important + } + + .mx-xl-3 { + margin-left: 1rem !important; + margin-right: 1rem !important + } + + .mx-xl-4 { + margin-left: 1.5rem !important; + margin-right: 1.5rem !important + } + + .mx-xl-5 { + margin-left: 3rem !important; + margin-right: 3rem !important + } + + .mx-xl-6 { + margin-left: 4.5rem !important; + margin-right: 4.5rem !important + } + + .mx-xl-7 { + margin-left: 6rem !important; + margin-right: 6rem !important + } + + .mx-xl-auto { + margin-left: auto !important; + margin-right: auto !important + } + + .my-xl-0 { + margin-bottom: 0 !important; + margin-top: 0 !important + } + + .my-xl-1 { + margin-bottom: .25rem !important; + margin-top: .25rem !important + } + + .my-xl-2 { + margin-bottom: .5rem !important; + margin-top: .5rem !important + } + + .my-xl-3 { + margin-bottom: 1rem !important; + margin-top: 1rem !important + } + + .my-xl-4 { + margin-bottom: 1.5rem !important; + margin-top: 1.5rem !important + } + + .my-xl-5 { + margin-bottom: 3rem !important; + margin-top: 3rem !important + } + + .my-xl-6 { + margin-bottom: 4.5rem !important; + margin-top: 4.5rem !important + } + + .my-xl-7 { + margin-bottom: 6rem !important; + margin-top: 6rem !important + } + + .my-xl-auto { + margin-bottom: auto !important; + margin-top: auto !important + } + + .mt-xl-0 { + margin-top: 0 !important + } + + .mt-xl-1 { + margin-top: .25rem !important + } + + .mt-xl-2 { + margin-top: .5rem !important + } + + .mt-xl-3 { + margin-top: 1rem !important + } + + .mt-xl-4 { + margin-top: 1.5rem !important + } + + .mt-xl-5 { + margin-top: 3rem !important + } + + .mt-xl-6 { + margin-top: 4.5rem !important + } + + .mt-xl-7 { + margin-top: 6rem !important + } + + .mt-xl-auto { + margin-top: auto !important + } + + .me-xl-0 { + margin-right: 0 !important + } + + .me-xl-1 { + margin-right: .25rem !important + } + + .me-xl-2 { + margin-right: .5rem !important + } + + .me-xl-3 { + margin-right: 1rem !important + } + + .me-xl-4 { + margin-right: 1.5rem !important + } + + .me-xl-5 { + margin-right: 3rem !important + } + + .me-xl-6 { + margin-right: 4.5rem !important + } + + .me-xl-7 { + margin-right: 6rem !important + } + + .me-xl-auto { + margin-right: auto !important + } + + .mb-xl-0 { + margin-bottom: 0 !important + } + + .mb-xl-1 { + margin-bottom: .25rem !important + } + + .mb-xl-2 { + margin-bottom: .5rem !important + } + + .mb-xl-3 { + margin-bottom: 1rem !important + } + + .mb-xl-4 { + margin-bottom: 1.5rem !important + } + + .mb-xl-5 { + margin-bottom: 3rem !important + } + + .mb-xl-6 { + margin-bottom: 4.5rem !important + } + + .mb-xl-7 { + margin-bottom: 6rem !important + } + + .mb-xl-auto { + margin-bottom: auto !important + } + + .ms-xl-0 { + margin-left: 0 !important + } + + .ms-xl-1 { + margin-left: .25rem !important + } + + .ms-xl-2 { + margin-left: .5rem !important + } + + .ms-xl-3 { + margin-left: 1rem !important + } + + .ms-xl-4 { + margin-left: 1.5rem !important + } + + .ms-xl-5 { + margin-left: 3rem !important + } + + .ms-xl-6 { + margin-left: 4.5rem !important + } + + .ms-xl-7 { + margin-left: 6rem !important + } + + .ms-xl-auto { + margin-left: auto !important + } + + .m-xl-n1 { + margin: -.25rem !important + } + + .m-xl-n2 { + margin: -.5rem !important + } + + .m-xl-n3 { + margin: -1rem !important + } + + .m-xl-n4 { + margin: -1.5rem !important + } + + .m-xl-n5 { + margin: -3rem !important + } + + .m-xl-n6 { + margin: -4.5rem !important + } + + .m-xl-n7 { + margin: -6rem !important + } + + .mx-xl-n1 { + margin-left: -.25rem !important; + margin-right: -.25rem !important + } + + .mx-xl-n2 { + margin-left: -.5rem !important; + margin-right: -.5rem !important + } + + .mx-xl-n3 { + margin-left: -1rem !important; + margin-right: -1rem !important + } + + .mx-xl-n4 { + margin-left: -1.5rem !important; + margin-right: -1.5rem !important + } + + .mx-xl-n5 { + margin-left: -3rem !important; + margin-right: -3rem !important + } + + .mx-xl-n6 { + margin-left: -4.5rem !important; + margin-right: -4.5rem !important + } + + .mx-xl-n7 { + margin-left: -6rem !important; + margin-right: -6rem !important + } + + .my-xl-n1 { + margin-bottom: -.25rem !important; + margin-top: -.25rem !important + } + + .my-xl-n2 { + margin-bottom: -.5rem !important; + margin-top: -.5rem !important + } + + .my-xl-n3 { + margin-bottom: -1rem !important; + margin-top: -1rem !important + } + + .my-xl-n4 { + margin-bottom: -1.5rem !important; + margin-top: -1.5rem !important + } + + .my-xl-n5 { + margin-bottom: -3rem !important; + margin-top: -3rem !important + } + + .my-xl-n6 { + margin-bottom: -4.5rem !important; + margin-top: -4.5rem !important + } + + .my-xl-n7 { + margin-bottom: -6rem !important; + margin-top: -6rem !important + } + + .mt-xl-n1 { + margin-top: -.25rem !important + } + + .mt-xl-n2 { + margin-top: -.5rem !important + } + + .mt-xl-n3 { + margin-top: -1rem !important + } + + .mt-xl-n4 { + margin-top: -1.5rem !important + } + + .mt-xl-n5 { + margin-top: -3rem !important + } + + .mt-xl-n6 { + margin-top: -4.5rem !important + } + + .mt-xl-n7 { + margin-top: -6rem !important + } + + .me-xl-n1 { + margin-right: -.25rem !important + } + + .me-xl-n2 { + margin-right: -.5rem !important + } + + .me-xl-n3 { + margin-right: -1rem !important + } + + .me-xl-n4 { + margin-right: -1.5rem !important + } + + .me-xl-n5 { + margin-right: -3rem !important + } + + .me-xl-n6 { + margin-right: -4.5rem !important + } + + .me-xl-n7 { + margin-right: -6rem !important + } + + .mb-xl-n1 { + margin-bottom: -.25rem !important + } + + .mb-xl-n2 { + margin-bottom: -.5rem !important + } + + .mb-xl-n3 { + margin-bottom: -1rem !important + } + + .mb-xl-n4 { + margin-bottom: -1.5rem !important + } + + .mb-xl-n5 { + margin-bottom: -3rem !important + } + + .mb-xl-n6 { + margin-bottom: -4.5rem !important + } + + .mb-xl-n7 { + margin-bottom: -6rem !important + } + + .ms-xl-n1 { + margin-left: -.25rem !important + } + + .ms-xl-n2 { + margin-left: -.5rem !important + } + + .ms-xl-n3 { + margin-left: -1rem !important + } + + .ms-xl-n4 { + margin-left: -1.5rem !important + } + + .ms-xl-n5 { + margin-left: -3rem !important + } + + .ms-xl-n6 { + margin-left: -4.5rem !important + } + + .ms-xl-n7 { + margin-left: -6rem !important + } + + .p-xl-0 { + padding: 0 !important + } + + .p-xl-1 { + padding: .25rem !important + } + + .p-xl-2 { + padding: .5rem !important + } + + .p-xl-3 { + padding: 1rem !important + } + + .p-xl-4 { + padding: 1.5rem !important + } + + .p-xl-5 { + padding: 3rem !important + } + + .p-xl-6 { + padding: 4.5rem !important + } + + .p-xl-7 { + padding: 6rem !important + } + + .px-xl-0 { + padding-left: 0 !important; + padding-right: 0 !important + } + + .px-xl-1 { + padding-left: .25rem !important; + padding-right: .25rem !important + } + + .px-xl-2 { + padding-left: .5rem !important; + padding-right: .5rem !important + } + + .px-xl-3 { + padding-left: 1rem !important; + padding-right: 1rem !important + } + + .px-xl-4 { + padding-left: 1.5rem !important; + padding-right: 1.5rem !important + } + + .px-xl-5 { + padding-left: 3rem !important; + padding-right: 3rem !important + } + + .px-xl-6 { + padding-left: 4.5rem !important; + padding-right: 4.5rem !important + } + + .px-xl-7 { + padding-left: 6rem !important; + padding-right: 6rem !important + } + + .py-xl-0 { + padding-bottom: 0 !important; + padding-top: 0 !important + } + + .py-xl-1 { + padding-bottom: .25rem !important; + padding-top: .25rem !important + } + + .py-xl-2 { + padding-bottom: .5rem !important; + padding-top: .5rem !important + } + + .py-xl-3 { + padding-bottom: 1rem !important; + padding-top: 1rem !important + } + + .py-xl-4 { + padding-bottom: 1.5rem !important; + padding-top: 1.5rem !important + } + + .py-xl-5 { + padding-bottom: 3rem !important; + padding-top: 3rem !important + } + + .py-xl-6 { + padding-bottom: 4.5rem !important; + padding-top: 4.5rem !important + } + + .py-xl-7 { + padding-bottom: 6rem !important; + padding-top: 6rem !important + } + + .pt-xl-0 { + padding-top: 0 !important + } + + .pt-xl-1 { + padding-top: .25rem !important + } + + .pt-xl-2 { + padding-top: .5rem !important + } + + .pt-xl-3 { + padding-top: 1rem !important + } + + .pt-xl-4 { + padding-top: 1.5rem !important + } + + .pt-xl-5 { + padding-top: 3rem !important + } + + .pt-xl-6 { + padding-top: 4.5rem !important + } + + .pt-xl-7 { + padding-top: 6rem !important + } + + .pe-xl-0 { + padding-right: 0 !important + } + + .pe-xl-1 { + padding-right: .25rem !important + } + + .pe-xl-2 { + padding-right: .5rem !important + } + + .pe-xl-3 { + padding-right: 1rem !important + } + + .pe-xl-4 { + padding-right: 1.5rem !important + } + + .pe-xl-5 { + padding-right: 3rem !important + } + + .pe-xl-6 { + padding-right: 4.5rem !important + } + + .pe-xl-7 { + padding-right: 6rem !important + } + + .pb-xl-0 { + padding-bottom: 0 !important + } + + .pb-xl-1 { + padding-bottom: .25rem !important + } + + .pb-xl-2 { + padding-bottom: .5rem !important + } + + .pb-xl-3 { + padding-bottom: 1rem !important + } + + .pb-xl-4 { + padding-bottom: 1.5rem !important + } + + .pb-xl-5 { + padding-bottom: 3rem !important + } + + .pb-xl-6 { + padding-bottom: 4.5rem !important + } + + .pb-xl-7 { + padding-bottom: 6rem !important + } + + .ps-xl-0 { + padding-left: 0 !important + } + + .ps-xl-1 { + padding-left: .25rem !important + } + + .ps-xl-2 { + padding-left: .5rem !important + } + + .ps-xl-3 { + padding-left: 1rem !important + } + + .ps-xl-4 { + padding-left: 1.5rem !important + } + + .ps-xl-5 { + padding-left: 3rem !important + } + + .ps-xl-6 { + padding-left: 4.5rem !important + } + + .ps-xl-7 { + padding-left: 6rem !important + } + + .gap-xl-0 { + gap: 0 !important + } + + .gap-xl-1 { + gap: .25rem !important + } + + .gap-xl-2 { + gap: .5rem !important + } + + .gap-xl-3 { + gap: 1rem !important + } + + .gap-xl-4 { + gap: 1.5rem !important + } + + .gap-xl-5 { + gap: 3rem !important + } + + .gap-xl-6 { + gap: 4.5rem !important + } + + .gap-xl-7 { + gap: 6rem !important + } + + .text-xl-start { + text-align: left !important + } + + .text-xl-end { + text-align: right !important + } + + .text-xl-center { + text-align: center !important + } +} + +@media (min-width: 1400px) { + .float-xxl-start { + float: left !important + } + + .float-xxl-end { + float: right !important + } + + .float-xxl-none { + float: none !important + } + + .d-xxl-inline { + display: inline !important + } + + .d-xxl-inline-block { + display: inline-block !important + } + + .d-xxl-block { + display: block !important + } + + .d-xxl-grid { + display: grid !important + } + + .d-xxl-table { + display: table !important + } + + .d-xxl-table-row { + display: table-row !important + } + + .d-xxl-table-cell { + display: table-cell !important + } + + .d-xxl-flex { + display: flex !important + } + + .d-xxl-inline-flex { + display: inline-flex !important + } + + .d-xxl-none { + display: none !important + } + + .border-xxl { + border: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important + } + + .border-xxl-0 { + border: 0 !important + } + + .border-top-xxl { + border-top: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important + } + + .border-top-xxl-0 { + border-top: 0 !important + } + + .border-end-xxl { + border-right: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important + } + + .border-end-xxl-0 { + border-right: 0 !important + } + + .border-bottom-xxl { + border-bottom: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important + } + + .border-bottom-xxl-0 { + border-bottom: 0 !important + } + + .border-start-xxl { + border-left: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important + } + + .border-start-xxl-0 { + border-left: 0 !important + } + + .flex-xxl-fill { + flex: 1 1 auto !important + } + + .flex-xxl-row { + flex-direction: row !important + } + + .flex-xxl-column { + flex-direction: column !important + } + + .flex-xxl-row-reverse { + flex-direction: row-reverse !important + } + + .flex-xxl-column-reverse { + flex-direction: column-reverse !important + } + + .flex-xxl-grow-0 { + flex-grow: 0 !important + } + + .flex-xxl-grow-1 { + flex-grow: 1 !important + } + + .flex-xxl-shrink-0 { + flex-shrink: 0 !important + } + + .flex-xxl-shrink-1 { + flex-shrink: 1 !important + } + + .flex-xxl-wrap { + flex-wrap: wrap !important + } + + .flex-xxl-nowrap { + flex-wrap: nowrap !important + } + + .flex-xxl-wrap-reverse { + flex-wrap: wrap-reverse !important + } + + .justify-content-xxl-start { + justify-content: flex-start !important + } + + .justify-content-xxl-end { + justify-content: flex-end !important + } + + .justify-content-xxl-center { + justify-content: center !important + } + + .justify-content-xxl-between { + justify-content: space-between !important + } + + .justify-content-xxl-around { + justify-content: space-around !important + } + + .justify-content-xxl-evenly { + justify-content: space-evenly !important + } + + .align-items-xxl-start { + align-items: flex-start !important + } + + .align-items-xxl-end { + align-items: flex-end !important + } + + .align-items-xxl-center { + align-items: center !important + } + + .align-items-xxl-baseline { + align-items: baseline !important + } + + .align-items-xxl-stretch { + align-items: stretch !important + } + + .align-content-xxl-start { + align-content: flex-start !important + } + + .align-content-xxl-end { + align-content: flex-end !important + } + + .align-content-xxl-center { + align-content: center !important + } + + .align-content-xxl-between { + align-content: space-between !important + } + + .align-content-xxl-around { + align-content: space-around !important + } + + .align-content-xxl-stretch { + align-content: stretch !important + } + + .align-self-xxl-auto { + align-self: auto !important + } + + .align-self-xxl-start { + align-self: flex-start !important + } + + .align-self-xxl-end { + align-self: flex-end !important + } + + .align-self-xxl-center { + align-self: center !important + } + + .align-self-xxl-baseline { + align-self: baseline !important + } + + .align-self-xxl-stretch { + align-self: stretch !important + } + + .order-xxl-first { + order: -1 !important + } + + .order-xxl-0 { + order: 0 !important + } + + .order-xxl-1 { + order: 1 !important + } + + .order-xxl-2 { + order: 2 !important + } + + .order-xxl-3 { + order: 3 !important + } + + .order-xxl-4 { + order: 4 !important + } + + .order-xxl-5 { + order: 5 !important + } + + .order-xxl-last { + order: 6 !important + } + + .m-xxl-0 { + margin: 0 !important + } + + .m-xxl-1 { + margin: .25rem !important + } + + .m-xxl-2 { + margin: .5rem !important + } + + .m-xxl-3 { + margin: 1rem !important + } + + .m-xxl-4 { + margin: 1.5rem !important + } + + .m-xxl-5 { + margin: 3rem !important + } + + .m-xxl-6 { + margin: 4.5rem !important + } + + .m-xxl-7 { + margin: 6rem !important + } + + .m-xxl-auto { + margin: auto !important + } + + .mx-xxl-0 { + margin-left: 0 !important; + margin-right: 0 !important + } + + .mx-xxl-1 { + margin-left: .25rem !important; + margin-right: .25rem !important + } + + .mx-xxl-2 { + margin-left: .5rem !important; + margin-right: .5rem !important + } + + .mx-xxl-3 { + margin-left: 1rem !important; + margin-right: 1rem !important + } + + .mx-xxl-4 { + margin-left: 1.5rem !important; + margin-right: 1.5rem !important + } + + .mx-xxl-5 { + margin-left: 3rem !important; + margin-right: 3rem !important + } + + .mx-xxl-6 { + margin-left: 4.5rem !important; + margin-right: 4.5rem !important + } + + .mx-xxl-7 { + margin-left: 6rem !important; + margin-right: 6rem !important + } + + .mx-xxl-auto { + margin-left: auto !important; + margin-right: auto !important + } + + .my-xxl-0 { + margin-bottom: 0 !important; + margin-top: 0 !important + } + + .my-xxl-1 { + margin-bottom: .25rem !important; + margin-top: .25rem !important + } + + .my-xxl-2 { + margin-bottom: .5rem !important; + margin-top: .5rem !important + } + + .my-xxl-3 { + margin-bottom: 1rem !important; + margin-top: 1rem !important + } + + .my-xxl-4 { + margin-bottom: 1.5rem !important; + margin-top: 1.5rem !important + } + + .my-xxl-5 { + margin-bottom: 3rem !important; + margin-top: 3rem !important + } + + .my-xxl-6 { + margin-bottom: 4.5rem !important; + margin-top: 4.5rem !important + } + + .my-xxl-7 { + margin-bottom: 6rem !important; + margin-top: 6rem !important + } + + .my-xxl-auto { + margin-bottom: auto !important; + margin-top: auto !important + } + + .mt-xxl-0 { + margin-top: 0 !important + } + + .mt-xxl-1 { + margin-top: .25rem !important + } + + .mt-xxl-2 { + margin-top: .5rem !important + } + + .mt-xxl-3 { + margin-top: 1rem !important + } + + .mt-xxl-4 { + margin-top: 1.5rem !important + } + + .mt-xxl-5 { + margin-top: 3rem !important + } + + .mt-xxl-6 { + margin-top: 4.5rem !important + } + + .mt-xxl-7 { + margin-top: 6rem !important + } + + .mt-xxl-auto { + margin-top: auto !important + } + + .me-xxl-0 { + margin-right: 0 !important + } + + .me-xxl-1 { + margin-right: .25rem !important + } + + .me-xxl-2 { + margin-right: .5rem !important + } + + .me-xxl-3 { + margin-right: 1rem !important + } + + .me-xxl-4 { + margin-right: 1.5rem !important + } + + .me-xxl-5 { + margin-right: 3rem !important + } + + .me-xxl-6 { + margin-right: 4.5rem !important + } + + .me-xxl-7 { + margin-right: 6rem !important + } + + .me-xxl-auto { + margin-right: auto !important + } + + .mb-xxl-0 { + margin-bottom: 0 !important + } + + .mb-xxl-1 { + margin-bottom: .25rem !important + } + + .mb-xxl-2 { + margin-bottom: .5rem !important + } + + .mb-xxl-3 { + margin-bottom: 1rem !important + } + + .mb-xxl-4 { + margin-bottom: 1.5rem !important + } + + .mb-xxl-5 { + margin-bottom: 3rem !important + } + + .mb-xxl-6 { + margin-bottom: 4.5rem !important + } + + .mb-xxl-7 { + margin-bottom: 6rem !important + } + + .mb-xxl-auto { + margin-bottom: auto !important + } + + .ms-xxl-0 { + margin-left: 0 !important + } + + .ms-xxl-1 { + margin-left: .25rem !important + } + + .ms-xxl-2 { + margin-left: .5rem !important + } + + .ms-xxl-3 { + margin-left: 1rem !important + } + + .ms-xxl-4 { + margin-left: 1.5rem !important + } + + .ms-xxl-5 { + margin-left: 3rem !important + } + + .ms-xxl-6 { + margin-left: 4.5rem !important + } + + .ms-xxl-7 { + margin-left: 6rem !important + } + + .ms-xxl-auto { + margin-left: auto !important + } + + .m-xxl-n1 { + margin: -.25rem !important + } + + .m-xxl-n2 { + margin: -.5rem !important + } + + .m-xxl-n3 { + margin: -1rem !important + } + + .m-xxl-n4 { + margin: -1.5rem !important + } + + .m-xxl-n5 { + margin: -3rem !important + } + + .m-xxl-n6 { + margin: -4.5rem !important + } + + .m-xxl-n7 { + margin: -6rem !important + } + + .mx-xxl-n1 { + margin-left: -.25rem !important; + margin-right: -.25rem !important + } + + .mx-xxl-n2 { + margin-left: -.5rem !important; + margin-right: -.5rem !important + } + + .mx-xxl-n3 { + margin-left: -1rem !important; + margin-right: -1rem !important + } + + .mx-xxl-n4 { + margin-left: -1.5rem !important; + margin-right: -1.5rem !important + } + + .mx-xxl-n5 { + margin-left: -3rem !important; + margin-right: -3rem !important + } + + .mx-xxl-n6 { + margin-left: -4.5rem !important; + margin-right: -4.5rem !important + } + + .mx-xxl-n7 { + margin-left: -6rem !important; + margin-right: -6rem !important + } + + .my-xxl-n1 { + margin-bottom: -.25rem !important; + margin-top: -.25rem !important + } + + .my-xxl-n2 { + margin-bottom: -.5rem !important; + margin-top: -.5rem !important + } + + .my-xxl-n3 { + margin-bottom: -1rem !important; + margin-top: -1rem !important + } + + .my-xxl-n4 { + margin-bottom: -1.5rem !important; + margin-top: -1.5rem !important + } + + .my-xxl-n5 { + margin-bottom: -3rem !important; + margin-top: -3rem !important + } + + .my-xxl-n6 { + margin-bottom: -4.5rem !important; + margin-top: -4.5rem !important + } + + .my-xxl-n7 { + margin-bottom: -6rem !important; + margin-top: -6rem !important + } + + .mt-xxl-n1 { + margin-top: -.25rem !important + } + + .mt-xxl-n2 { + margin-top: -.5rem !important + } + + .mt-xxl-n3 { + margin-top: -1rem !important + } + + .mt-xxl-n4 { + margin-top: -1.5rem !important + } + + .mt-xxl-n5 { + margin-top: -3rem !important + } + + .mt-xxl-n6 { + margin-top: -4.5rem !important + } + + .mt-xxl-n7 { + margin-top: -6rem !important + } + + .me-xxl-n1 { + margin-right: -.25rem !important + } + + .me-xxl-n2 { + margin-right: -.5rem !important + } + + .me-xxl-n3 { + margin-right: -1rem !important + } + + .me-xxl-n4 { + margin-right: -1.5rem !important + } + + .me-xxl-n5 { + margin-right: -3rem !important + } + + .me-xxl-n6 { + margin-right: -4.5rem !important + } + + .me-xxl-n7 { + margin-right: -6rem !important + } + + .mb-xxl-n1 { + margin-bottom: -.25rem !important + } + + .mb-xxl-n2 { + margin-bottom: -.5rem !important + } + + .mb-xxl-n3 { + margin-bottom: -1rem !important + } + + .mb-xxl-n4 { + margin-bottom: -1.5rem !important + } + + .mb-xxl-n5 { + margin-bottom: -3rem !important + } + + .mb-xxl-n6 { + margin-bottom: -4.5rem !important + } + + .mb-xxl-n7 { + margin-bottom: -6rem !important + } + + .ms-xxl-n1 { + margin-left: -.25rem !important + } + + .ms-xxl-n2 { + margin-left: -.5rem !important + } + + .ms-xxl-n3 { + margin-left: -1rem !important + } + + .ms-xxl-n4 { + margin-left: -1.5rem !important + } + + .ms-xxl-n5 { + margin-left: -3rem !important + } + + .ms-xxl-n6 { + margin-left: -4.5rem !important + } + + .ms-xxl-n7 { + margin-left: -6rem !important + } + + .p-xxl-0 { + padding: 0 !important + } + + .p-xxl-1 { + padding: .25rem !important + } + + .p-xxl-2 { + padding: .5rem !important + } + + .p-xxl-3 { + padding: 1rem !important + } + + .p-xxl-4 { + padding: 1.5rem !important + } + + .p-xxl-5 { + padding: 3rem !important + } + + .p-xxl-6 { + padding: 4.5rem !important + } + + .p-xxl-7 { + padding: 6rem !important + } + + .px-xxl-0 { + padding-left: 0 !important; + padding-right: 0 !important + } + + .px-xxl-1 { + padding-left: .25rem !important; + padding-right: .25rem !important + } + + .px-xxl-2 { + padding-left: .5rem !important; + padding-right: .5rem !important + } + + .px-xxl-3 { + padding-left: 1rem !important; + padding-right: 1rem !important + } + + .px-xxl-4 { + padding-left: 1.5rem !important; + padding-right: 1.5rem !important + } + + .px-xxl-5 { + padding-left: 3rem !important; + padding-right: 3rem !important + } + + .px-xxl-6 { + padding-left: 4.5rem !important; + padding-right: 4.5rem !important + } + + .px-xxl-7 { + padding-left: 6rem !important; + padding-right: 6rem !important + } + + .py-xxl-0 { + padding-bottom: 0 !important; + padding-top: 0 !important + } + + .py-xxl-1 { + padding-bottom: .25rem !important; + padding-top: .25rem !important + } + + .py-xxl-2 { + padding-bottom: .5rem !important; + padding-top: .5rem !important + } + + .py-xxl-3 { + padding-bottom: 1rem !important; + padding-top: 1rem !important + } + + .py-xxl-4 { + padding-bottom: 1.5rem !important; + padding-top: 1.5rem !important + } + + .py-xxl-5 { + padding-bottom: 3rem !important; + padding-top: 3rem !important + } + + .py-xxl-6 { + padding-bottom: 4.5rem !important; + padding-top: 4.5rem !important + } + + .py-xxl-7 { + padding-bottom: 6rem !important; + padding-top: 6rem !important + } + + .pt-xxl-0 { + padding-top: 0 !important + } + + .pt-xxl-1 { + padding-top: .25rem !important + } + + .pt-xxl-2 { + padding-top: .5rem !important + } + + .pt-xxl-3 { + padding-top: 1rem !important + } + + .pt-xxl-4 { + padding-top: 1.5rem !important + } + + .pt-xxl-5 { + padding-top: 3rem !important + } + + .pt-xxl-6 { + padding-top: 4.5rem !important + } + + .pt-xxl-7 { + padding-top: 6rem !important + } + + .pe-xxl-0 { + padding-right: 0 !important + } + + .pe-xxl-1 { + padding-right: .25rem !important + } + + .pe-xxl-2 { + padding-right: .5rem !important + } + + .pe-xxl-3 { + padding-right: 1rem !important + } + + .pe-xxl-4 { + padding-right: 1.5rem !important + } + + .pe-xxl-5 { + padding-right: 3rem !important + } + + .pe-xxl-6 { + padding-right: 4.5rem !important + } + + .pe-xxl-7 { + padding-right: 6rem !important + } + + .pb-xxl-0 { + padding-bottom: 0 !important + } + + .pb-xxl-1 { + padding-bottom: .25rem !important + } + + .pb-xxl-2 { + padding-bottom: .5rem !important + } + + .pb-xxl-3 { + padding-bottom: 1rem !important + } + + .pb-xxl-4 { + padding-bottom: 1.5rem !important + } + + .pb-xxl-5 { + padding-bottom: 3rem !important + } + + .pb-xxl-6 { + padding-bottom: 4.5rem !important + } + + .pb-xxl-7 { + padding-bottom: 6rem !important + } + + .ps-xxl-0 { + padding-left: 0 !important + } + + .ps-xxl-1 { + padding-left: .25rem !important + } + + .ps-xxl-2 { + padding-left: .5rem !important + } + + .ps-xxl-3 { + padding-left: 1rem !important + } + + .ps-xxl-4 { + padding-left: 1.5rem !important + } + + .ps-xxl-5 { + padding-left: 3rem !important + } + + .ps-xxl-6 { + padding-left: 4.5rem !important + } + + .ps-xxl-7 { + padding-left: 6rem !important + } + + .gap-xxl-0 { + gap: 0 !important + } + + .gap-xxl-1 { + gap: .25rem !important + } + + .gap-xxl-2 { + gap: .5rem !important + } + + .gap-xxl-3 { + gap: 1rem !important + } + + .gap-xxl-4 { + gap: 1.5rem !important + } + + .gap-xxl-5 { + gap: 3rem !important + } + + .gap-xxl-6 { + gap: 4.5rem !important + } + + .gap-xxl-7 { + gap: 6rem !important + } + + .text-xxl-start { + text-align: left !important + } + + .text-xxl-end { + text-align: right !important + } + + .text-xxl-center { + text-align: center !important + } +} + +@media (min-width: 1200px) { + .fs-1 { + font-size: 2.5rem !important + } + + .fs-2 { + font-size: 2rem !important + } + + .fs-3 { + font-size: 1.5rem !important + } +} + +@media print { + .d-print-inline { + display: inline !important + } + + .d-print-inline-block { + display: inline-block !important + } + + .d-print-block { + display: block !important + } + + .d-print-grid { + display: grid !important + } + + .d-print-table { + display: table !important + } + + .d-print-table-row { + display: table-row !important + } + + .d-print-table-cell { + display: table-cell !important + } + + .d-print-flex { + display: flex !important + } + + .d-print-inline-flex { + display: inline-flex !important + } + + .d-print-none { + display: none !important + } +} + +@keyframes dropdownAnimation { + 0% { + opacity: 0; + transform: translate3d(0, 20px, 0) + } + to { + opacity: 1; + transform: none; + transform: translateZ(0) + } +} + +.dropdownAnimation, .horizontal-menu .bottom-navbar .page-navigation > .nav-item .submenu, .horizontal-menu .navbar .navbar-content .navbar-nav .nav-item.dropdown .dropdown-menu, .horizontal-menu .navbar .navbar-content .navbar-nav .nav-item.dropdown .tt-menu { + animation-duration: .2s; + animation-fill-mode: both; + animation-name: dropdownAnimation +} + +@keyframes fadeOut { + 0% { + opacity: 1 + } + to { + opacity: 0 + } +} + +.fadeOut { + animation-name: fadeOUt +} + +@keyframes fadeInUp { + 0% { + opacity: 0; + transform: translate3d(0, 100%, 0) + } + to { + opacity: 1; + transform: none + } +} + +.fadeInUp { + animation-name: fadeInUp +} + +.infinite-spin { + animation-duration: 3s; + animation-iteration-count: infinite; + animation-name: spin; + animation-timing-function: linear +} + +@keyframes spin { + 0% { + transform: rotate(0deg) + } + to { + transform: rotate(1turn) + } +} + +.horizontal-menu .navbar .navbar-content .navbar-nav .nav-item .nav-link .indicator .circle:before, .pulse { + animation-duration: .9s; + animation-iteration-count: infinite; + animation-name: pulse; + animation-timing-function: ease-out +} + +@keyframes pulse { + 0% { + height: 7px; + left: 0; + opacity: 1; + top: 0; + width: 7px + } + 95% { + height: 28px; + left: -10.5px; + opacity: .1; + top: -10.5px; + width: 28px + } + to { + height: 7px; + left: 0; + opacity: 0; + top: 0; + width: 7px + } +} + +.wd-5 { + width: 5px +} + +.wd-5p { + width: 5% +} + +.mx-wd-5p { + max-width: 5% +} + +.mn-wd-5p { + min-width: 5% +} + +.wd-5-f { + width: 5px !important +} + +.wd-5p-f { + width: 5% !important +} + +.mx-wd-5p-f { + max-width: 5% !important +} + +.mn-wd-5p-f { + min-width: 5% !important +} + +.wd-10 { + width: 10px +} + +.wd-10p { + width: 10% +} + +.mx-wd-10p { + max-width: 10% +} + +.mn-wd-10p { + min-width: 10% +} + +.wd-10-f { + width: 10px !important +} + +.wd-10p-f { + width: 10% !important +} + +.mx-wd-10p-f { + max-width: 10% !important +} + +.mn-wd-10p-f { + min-width: 10% !important +} + +.wd-15 { + width: 15px +} + +.wd-15p { + width: 15% +} + +.mx-wd-15p { + max-width: 15% +} + +.mn-wd-15p { + min-width: 15% +} + +.wd-15-f { + width: 15px !important +} + +.wd-15p-f { + width: 15% !important +} + +.mx-wd-15p-f { + max-width: 15% !important +} + +.mn-wd-15p-f { + min-width: 15% !important +} + +.wd-20 { + width: 20px +} + +.wd-20p { + width: 20% +} + +.mx-wd-20p { + max-width: 20% +} + +.mn-wd-20p { + min-width: 20% +} + +.wd-20-f { + width: 20px !important +} + +.wd-20p-f { + width: 20% !important +} + +.mx-wd-20p-f { + max-width: 20% !important +} + +.mn-wd-20p-f { + min-width: 20% !important +} + +.wd-25 { + width: 25px +} + +.wd-25p { + width: 25% +} + +.mx-wd-25p { + max-width: 25% +} + +.mn-wd-25p { + min-width: 25% +} + +.wd-25-f { + width: 25px !important +} + +.wd-25p-f { + width: 25% !important +} + +.mx-wd-25p-f { + max-width: 25% !important +} + +.mn-wd-25p-f { + min-width: 25% !important +} + +.wd-30 { + width: 30px +} + +.wd-30p { + width: 30% +} + +.mx-wd-30p { + max-width: 30% +} + +.mn-wd-30p { + min-width: 30% +} + +.wd-30-f { + width: 30px !important +} + +.wd-30p-f { + width: 30% !important +} + +.mx-wd-30p-f { + max-width: 30% !important +} + +.mn-wd-30p-f { + min-width: 30% !important +} + +.wd-35 { + width: 35px +} + +.wd-35p { + width: 35% +} + +.mx-wd-35p { + max-width: 35% +} + +.mn-wd-35p { + min-width: 35% +} + +.wd-35-f { + width: 35px !important +} + +.wd-35p-f { + width: 35% !important +} + +.mx-wd-35p-f { + max-width: 35% !important +} + +.mn-wd-35p-f { + min-width: 35% !important +} + +.wd-40 { + width: 40px +} + +.wd-40p { + width: 40% +} + +.mx-wd-40p { + max-width: 40% +} + +.mn-wd-40p { + min-width: 40% +} + +.wd-40-f { + width: 40px !important +} + +.wd-40p-f { + width: 40% !important +} + +.mx-wd-40p-f { + max-width: 40% !important +} + +.mn-wd-40p-f { + min-width: 40% !important +} + +.wd-45 { + width: 45px +} + +.wd-45p { + width: 45% +} + +.mx-wd-45p { + max-width: 45% +} + +.mn-wd-45p { + min-width: 45% +} + +.wd-45-f { + width: 45px !important +} + +.wd-45p-f { + width: 45% !important +} + +.mx-wd-45p-f { + max-width: 45% !important +} + +.mn-wd-45p-f { + min-width: 45% !important +} + +.wd-50 { + width: 50px +} + +.wd-50p { + width: 50% +} + +.mx-wd-50p { + max-width: 50% +} + +.mn-wd-50p { + min-width: 50% +} + +.wd-50-f { + width: 50px !important +} + +.wd-50p-f { + width: 50% !important +} + +.mx-wd-50p-f { + max-width: 50% !important +} + +.mn-wd-50p-f { + min-width: 50% !important +} + +.wd-55 { + width: 55px +} + +.wd-55p { + width: 55% +} + +.mx-wd-55p { + max-width: 55% +} + +.mn-wd-55p { + min-width: 55% +} + +.wd-55-f { + width: 55px !important +} + +.wd-55p-f { + width: 55% !important +} + +.mx-wd-55p-f { + max-width: 55% !important +} + +.mn-wd-55p-f { + min-width: 55% !important +} + +.wd-60 { + width: 60px +} + +.wd-60p { + width: 60% +} + +.mx-wd-60p { + max-width: 60% +} + +.mn-wd-60p { + min-width: 60% +} + +.wd-60-f { + width: 60px !important +} + +.wd-60p-f { + width: 60% !important +} + +.mx-wd-60p-f { + max-width: 60% !important +} + +.mn-wd-60p-f { + min-width: 60% !important +} + +.wd-65 { + width: 65px +} + +.wd-65p { + width: 65% +} + +.mx-wd-65p { + max-width: 65% +} + +.mn-wd-65p { + min-width: 65% +} + +.wd-65-f { + width: 65px !important +} + +.wd-65p-f { + width: 65% !important +} + +.mx-wd-65p-f { + max-width: 65% !important +} + +.mn-wd-65p-f { + min-width: 65% !important +} + +.wd-70 { + width: 70px +} + +.wd-70p { + width: 70% +} + +.mx-wd-70p { + max-width: 70% +} + +.mn-wd-70p { + min-width: 70% +} + +.wd-70-f { + width: 70px !important +} + +.wd-70p-f { + width: 70% !important +} + +.mx-wd-70p-f { + max-width: 70% !important +} + +.mn-wd-70p-f { + min-width: 70% !important +} + +.wd-75 { + width: 75px +} + +.wd-75p { + width: 75% +} + +.mx-wd-75p { + max-width: 75% +} + +.mn-wd-75p { + min-width: 75% +} + +.wd-75-f { + width: 75px !important +} + +.wd-75p-f { + width: 75% !important +} + +.mx-wd-75p-f { + max-width: 75% !important +} + +.mn-wd-75p-f { + min-width: 75% !important +} + +.wd-80 { + width: 80px +} + +.wd-80p { + width: 80% +} + +.mx-wd-80p { + max-width: 80% +} + +.mn-wd-80p { + min-width: 80% +} + +.wd-80-f { + width: 80px !important +} + +.wd-80p-f { + width: 80% !important +} + +.mx-wd-80p-f { + max-width: 80% !important +} + +.mn-wd-80p-f { + min-width: 80% !important +} + +.wd-85 { + width: 85px +} + +.wd-85p { + width: 85% +} + +.mx-wd-85p { + max-width: 85% +} + +.mn-wd-85p { + min-width: 85% +} + +.wd-85-f { + width: 85px !important +} + +.wd-85p-f { + width: 85% !important +} + +.mx-wd-85p-f { + max-width: 85% !important +} + +.mn-wd-85p-f { + min-width: 85% !important +} + +.wd-90 { + width: 90px +} + +.wd-90p { + width: 90% +} + +.mx-wd-90p { + max-width: 90% +} + +.mn-wd-90p { + min-width: 90% +} + +.wd-90-f { + width: 90px !important +} + +.wd-90p-f { + width: 90% !important +} + +.mx-wd-90p-f { + max-width: 90% !important +} + +.mn-wd-90p-f { + min-width: 90% !important +} + +.wd-95 { + width: 95px +} + +.wd-95p { + width: 95% +} + +.mx-wd-95p { + max-width: 95% +} + +.mn-wd-95p { + min-width: 95% +} + +.wd-95-f { + width: 95px !important +} + +.wd-95p-f { + width: 95% !important +} + +.mx-wd-95p-f { + max-width: 95% !important +} + +.mn-wd-95p-f { + min-width: 95% !important +} + +.wd-100 { + width: 100px +} + +.wd-100p { + width: 100% +} + +.mx-wd-100p { + max-width: 100% +} + +.mn-wd-100p { + min-width: 100% +} + +.wd-100-f { + width: 100px !important +} + +.wd-100p-f { + width: 100% !important +} + +.mx-wd-100p-f { + max-width: 100% !important +} + +.mn-wd-100p-f { + min-width: 100% !important +} + +.wd-150 { + width: 150px +} + +.wd-150-f { + width: 150px !important +} + +.wd-200 { + width: 200px +} + +.wd-200-f { + width: 200px !important +} + +.wd-250 { + width: 250px +} + +.wd-250-f { + width: 250px !important +} + +.wd-300 { + width: 300px +} + +.wd-300-f { + width: 300px !important +} + +.wd-350 { + width: 350px +} + +.wd-350-f { + width: 350px !important +} + +.wd-400 { + width: 400px +} + +.wd-400-f { + width: 400px !important +} + +.wd-450 { + width: 450px +} + +.wd-450-f { + width: 450px !important +} + +.wd-500 { + width: 500px +} + +.wd-500-f { + width: 500px !important +} + +.wd-550 { + width: 550px +} + +.wd-550-f { + width: 550px !important +} + +.wd-600 { + width: 600px +} + +.wd-600-f { + width: 600px !important +} + +.wd-650 { + width: 650px +} + +.wd-650-f { + width: 650px !important +} + +.wd-700 { + width: 700px +} + +.wd-700-f { + width: 700px !important +} + +.wd-750 { + width: 750px +} + +.wd-750-f { + width: 750px !important +} + +.wd-800 { + width: 800px +} + +.wd-800-f { + width: 800px !important +} + +.wd-850 { + width: 850px +} + +.wd-850-f { + width: 850px !important +} + +.wd-900 { + width: 900px +} + +.wd-900-f { + width: 900px !important +} + +.wd-950 { + width: 950px +} + +.wd-950-f { + width: 950px !important +} + +.wd-1000 { + width: 1000px +} + +.wd-1000-f { + width: 1000px !important +} + +@media (min-width: 480px) { + .wd-xs-5 { + width: 5px + } + + .wd-xs-5p { + width: 5% + } + + .mx-wd-xs-5p { + max-width: 5% + } + + .mn-wd-xs-5p { + min-width: 5% + } + + .wd-xs-5-f { + width: 5px !important + } + + .wd-xs-5p-f { + width: 5% !important + } + + .mx-wd-xs-5p-f { + max-width: 5% !important + } + + .mn-wd-xs-5p-f { + min-width: 5% !important + } + + .wd-xs-10 { + width: 10px + } + + .wd-xs-10p { + width: 10% + } + + .mx-wd-xs-10p { + max-width: 10% + } + + .mn-wd-xs-10p { + min-width: 10% + } + + .wd-xs-10-f { + width: 10px !important + } + + .wd-xs-10p-f { + width: 10% !important + } + + .mx-wd-xs-10p-f { + max-width: 10% !important + } + + .mn-wd-xs-10p-f { + min-width: 10% !important + } + + .wd-xs-15 { + width: 15px + } + + .wd-xs-15p { + width: 15% + } + + .mx-wd-xs-15p { + max-width: 15% + } + + .mn-wd-xs-15p { + min-width: 15% + } + + .wd-xs-15-f { + width: 15px !important + } + + .wd-xs-15p-f { + width: 15% !important + } + + .mx-wd-xs-15p-f { + max-width: 15% !important + } + + .mn-wd-xs-15p-f { + min-width: 15% !important + } + + .wd-xs-20 { + width: 20px + } + + .wd-xs-20p { + width: 20% + } + + .mx-wd-xs-20p { + max-width: 20% + } + + .mn-wd-xs-20p { + min-width: 20% + } + + .wd-xs-20-f { + width: 20px !important + } + + .wd-xs-20p-f { + width: 20% !important + } + + .mx-wd-xs-20p-f { + max-width: 20% !important + } + + .mn-wd-xs-20p-f { + min-width: 20% !important + } + + .wd-xs-25 { + width: 25px + } + + .wd-xs-25p { + width: 25% + } + + .mx-wd-xs-25p { + max-width: 25% + } + + .mn-wd-xs-25p { + min-width: 25% + } + + .wd-xs-25-f { + width: 25px !important + } + + .wd-xs-25p-f { + width: 25% !important + } + + .mx-wd-xs-25p-f { + max-width: 25% !important + } + + .mn-wd-xs-25p-f { + min-width: 25% !important + } + + .wd-xs-30 { + width: 30px + } + + .wd-xs-30p { + width: 30% + } + + .mx-wd-xs-30p { + max-width: 30% + } + + .mn-wd-xs-30p { + min-width: 30% + } + + .wd-xs-30-f { + width: 30px !important + } + + .wd-xs-30p-f { + width: 30% !important + } + + .mx-wd-xs-30p-f { + max-width: 30% !important + } + + .mn-wd-xs-30p-f { + min-width: 30% !important + } + + .wd-xs-35 { + width: 35px + } + + .wd-xs-35p { + width: 35% + } + + .mx-wd-xs-35p { + max-width: 35% + } + + .mn-wd-xs-35p { + min-width: 35% + } + + .wd-xs-35-f { + width: 35px !important + } + + .wd-xs-35p-f { + width: 35% !important + } + + .mx-wd-xs-35p-f { + max-width: 35% !important + } + + .mn-wd-xs-35p-f { + min-width: 35% !important + } + + .wd-xs-40 { + width: 40px + } + + .wd-xs-40p { + width: 40% + } + + .mx-wd-xs-40p { + max-width: 40% + } + + .mn-wd-xs-40p { + min-width: 40% + } + + .wd-xs-40-f { + width: 40px !important + } + + .wd-xs-40p-f { + width: 40% !important + } + + .mx-wd-xs-40p-f { + max-width: 40% !important + } + + .mn-wd-xs-40p-f { + min-width: 40% !important + } + + .wd-xs-45 { + width: 45px + } + + .wd-xs-45p { + width: 45% + } + + .mx-wd-xs-45p { + max-width: 45% + } + + .mn-wd-xs-45p { + min-width: 45% + } + + .wd-xs-45-f { + width: 45px !important + } + + .wd-xs-45p-f { + width: 45% !important + } + + .mx-wd-xs-45p-f { + max-width: 45% !important + } + + .mn-wd-xs-45p-f { + min-width: 45% !important + } + + .wd-xs-50 { + width: 50px + } + + .wd-xs-50p { + width: 50% + } + + .mx-wd-xs-50p { + max-width: 50% + } + + .mn-wd-xs-50p { + min-width: 50% + } + + .wd-xs-50-f { + width: 50px !important + } + + .wd-xs-50p-f { + width: 50% !important + } + + .mx-wd-xs-50p-f { + max-width: 50% !important + } + + .mn-wd-xs-50p-f { + min-width: 50% !important + } + + .wd-xs-55 { + width: 55px + } + + .wd-xs-55p { + width: 55% + } + + .mx-wd-xs-55p { + max-width: 55% + } + + .mn-wd-xs-55p { + min-width: 55% + } + + .wd-xs-55-f { + width: 55px !important + } + + .wd-xs-55p-f { + width: 55% !important + } + + .mx-wd-xs-55p-f { + max-width: 55% !important + } + + .mn-wd-xs-55p-f { + min-width: 55% !important + } + + .wd-xs-60 { + width: 60px + } + + .wd-xs-60p { + width: 60% + } + + .mx-wd-xs-60p { + max-width: 60% + } + + .mn-wd-xs-60p { + min-width: 60% + } + + .wd-xs-60-f { + width: 60px !important + } + + .wd-xs-60p-f { + width: 60% !important + } + + .mx-wd-xs-60p-f { + max-width: 60% !important + } + + .mn-wd-xs-60p-f { + min-width: 60% !important + } + + .wd-xs-65 { + width: 65px + } + + .wd-xs-65p { + width: 65% + } + + .mx-wd-xs-65p { + max-width: 65% + } + + .mn-wd-xs-65p { + min-width: 65% + } + + .wd-xs-65-f { + width: 65px !important + } + + .wd-xs-65p-f { + width: 65% !important + } + + .mx-wd-xs-65p-f { + max-width: 65% !important + } + + .mn-wd-xs-65p-f { + min-width: 65% !important + } + + .wd-xs-70 { + width: 70px + } + + .wd-xs-70p { + width: 70% + } + + .mx-wd-xs-70p { + max-width: 70% + } + + .mn-wd-xs-70p { + min-width: 70% + } + + .wd-xs-70-f { + width: 70px !important + } + + .wd-xs-70p-f { + width: 70% !important + } + + .mx-wd-xs-70p-f { + max-width: 70% !important + } + + .mn-wd-xs-70p-f { + min-width: 70% !important + } + + .wd-xs-75 { + width: 75px + } + + .wd-xs-75p { + width: 75% + } + + .mx-wd-xs-75p { + max-width: 75% + } + + .mn-wd-xs-75p { + min-width: 75% + } + + .wd-xs-75-f { + width: 75px !important + } + + .wd-xs-75p-f { + width: 75% !important + } + + .mx-wd-xs-75p-f { + max-width: 75% !important + } + + .mn-wd-xs-75p-f { + min-width: 75% !important + } + + .wd-xs-80 { + width: 80px + } + + .wd-xs-80p { + width: 80% + } + + .mx-wd-xs-80p { + max-width: 80% + } + + .mn-wd-xs-80p { + min-width: 80% + } + + .wd-xs-80-f { + width: 80px !important + } + + .wd-xs-80p-f { + width: 80% !important + } + + .mx-wd-xs-80p-f { + max-width: 80% !important + } + + .mn-wd-xs-80p-f { + min-width: 80% !important + } + + .wd-xs-85 { + width: 85px + } + + .wd-xs-85p { + width: 85% + } + + .mx-wd-xs-85p { + max-width: 85% + } + + .mn-wd-xs-85p { + min-width: 85% + } + + .wd-xs-85-f { + width: 85px !important + } + + .wd-xs-85p-f { + width: 85% !important + } + + .mx-wd-xs-85p-f { + max-width: 85% !important + } + + .mn-wd-xs-85p-f { + min-width: 85% !important + } + + .wd-xs-90 { + width: 90px + } + + .wd-xs-90p { + width: 90% + } + + .mx-wd-xs-90p { + max-width: 90% + } + + .mn-wd-xs-90p { + min-width: 90% + } + + .wd-xs-90-f { + width: 90px !important + } + + .wd-xs-90p-f { + width: 90% !important + } + + .mx-wd-xs-90p-f { + max-width: 90% !important + } + + .mn-wd-xs-90p-f { + min-width: 90% !important + } + + .wd-xs-95 { + width: 95px + } + + .wd-xs-95p { + width: 95% + } + + .mx-wd-xs-95p { + max-width: 95% + } + + .mn-wd-xs-95p { + min-width: 95% + } + + .wd-xs-95-f { + width: 95px !important + } + + .wd-xs-95p-f { + width: 95% !important + } + + .mx-wd-xs-95p-f { + max-width: 95% !important + } + + .mn-wd-xs-95p-f { + min-width: 95% !important + } + + .wd-xs-100 { + width: 100px + } + + .wd-xs-100p { + width: 100% + } + + .mx-wd-xs-100p { + max-width: 100% + } + + .mn-wd-xs-100p { + min-width: 100% + } + + .wd-xs-100-f { + width: 100px !important + } + + .wd-xs-100p-f { + width: 100% !important + } + + .mx-wd-xs-100p-f { + max-width: 100% !important + } + + .mn-wd-xs-100p-f { + min-width: 100% !important + } + + .wd-xs-150 { + width: 150px + } + + .wd-xs-150p { + width: 150% + } + + .mx-wd-xs-150p { + max-width: 150% + } + + .mn-wd-xs-150p { + min-width: 150% + } + + .wd-xs-150-f { + width: 150px !important + } + + .wd-xs-150p-f { + width: 150% !important + } + + .mx-wd-xs-150p-f { + max-width: 150% !important + } + + .mn-wd-xs-150p-f { + min-width: 150% !important + } + + .wd-xs-200 { + width: 200px + } + + .wd-xs-200p { + width: 200% + } + + .mx-wd-xs-200p { + max-width: 200% + } + + .mn-wd-xs-200p { + min-width: 200% + } + + .wd-xs-200-f { + width: 200px !important + } + + .wd-xs-200p-f { + width: 200% !important + } + + .mx-wd-xs-200p-f { + max-width: 200% !important + } + + .mn-wd-xs-200p-f { + min-width: 200% !important + } + + .wd-xs-250 { + width: 250px + } + + .wd-xs-250p { + width: 250% + } + + .mx-wd-xs-250p { + max-width: 250% + } + + .mn-wd-xs-250p { + min-width: 250% + } + + .wd-xs-250-f { + width: 250px !important + } + + .wd-xs-250p-f { + width: 250% !important + } + + .mx-wd-xs-250p-f { + max-width: 250% !important + } + + .mn-wd-xs-250p-f { + min-width: 250% !important + } + + .wd-xs-300 { + width: 300px + } + + .wd-xs-300p { + width: 300% + } + + .mx-wd-xs-300p { + max-width: 300% + } + + .mn-wd-xs-300p { + min-width: 300% + } + + .wd-xs-300-f { + width: 300px !important + } + + .wd-xs-300p-f { + width: 300% !important + } + + .mx-wd-xs-300p-f { + max-width: 300% !important + } + + .mn-wd-xs-300p-f { + min-width: 300% !important + } + + .wd-xs-350 { + width: 350px + } + + .wd-xs-350p { + width: 350% + } + + .mx-wd-xs-350p { + max-width: 350% + } + + .mn-wd-xs-350p { + min-width: 350% + } + + .wd-xs-350-f { + width: 350px !important + } + + .wd-xs-350p-f { + width: 350% !important + } + + .mx-wd-xs-350p-f { + max-width: 350% !important + } + + .mn-wd-xs-350p-f { + min-width: 350% !important + } + + .wd-xs-400 { + width: 400px + } + + .wd-xs-400p { + width: 400% + } + + .mx-wd-xs-400p { + max-width: 400% + } + + .mn-wd-xs-400p { + min-width: 400% + } + + .wd-xs-400-f { + width: 400px !important + } + + .wd-xs-400p-f { + width: 400% !important + } + + .mx-wd-xs-400p-f { + max-width: 400% !important + } + + .mn-wd-xs-400p-f { + min-width: 400% !important + } + + .wd-xs-450 { + width: 450px + } + + .wd-xs-450p { + width: 450% + } + + .mx-wd-xs-450p { + max-width: 450% + } + + .mn-wd-xs-450p { + min-width: 450% + } + + .wd-xs-450-f { + width: 450px !important + } + + .wd-xs-450p-f { + width: 450% !important + } + + .mx-wd-xs-450p-f { + max-width: 450% !important + } + + .mn-wd-xs-450p-f { + min-width: 450% !important + } + + .wd-xs-500 { + width: 500px + } + + .wd-xs-500p { + width: 500% + } + + .mx-wd-xs-500p { + max-width: 500% + } + + .mn-wd-xs-500p { + min-width: 500% + } + + .wd-xs-500-f { + width: 500px !important + } + + .wd-xs-500p-f { + width: 500% !important + } + + .mx-wd-xs-500p-f { + max-width: 500% !important + } + + .mn-wd-xs-500p-f { + min-width: 500% !important + } + + .wd-xs-550 { + width: 550px + } + + .wd-xs-550p { + width: 550% + } + + .mx-wd-xs-550p { + max-width: 550% + } + + .mn-wd-xs-550p { + min-width: 550% + } + + .wd-xs-550-f { + width: 550px !important + } + + .wd-xs-550p-f { + width: 550% !important + } + + .mx-wd-xs-550p-f { + max-width: 550% !important + } + + .mn-wd-xs-550p-f { + min-width: 550% !important + } + + .wd-xs-600 { + width: 600px + } + + .wd-xs-600p { + width: 600% + } + + .mx-wd-xs-600p { + max-width: 600% + } + + .mn-wd-xs-600p { + min-width: 600% + } + + .wd-xs-600-f { + width: 600px !important + } + + .wd-xs-600p-f { + width: 600% !important + } + + .mx-wd-xs-600p-f { + max-width: 600% !important + } + + .mn-wd-xs-600p-f { + min-width: 600% !important + } + + .wd-xs-650 { + width: 650px + } + + .wd-xs-650p { + width: 650% + } + + .mx-wd-xs-650p { + max-width: 650% + } + + .mn-wd-xs-650p { + min-width: 650% + } + + .wd-xs-650-f { + width: 650px !important + } + + .wd-xs-650p-f { + width: 650% !important + } + + .mx-wd-xs-650p-f { + max-width: 650% !important + } + + .mn-wd-xs-650p-f { + min-width: 650% !important + } + + .wd-xs-700 { + width: 700px + } + + .wd-xs-700p { + width: 700% + } + + .mx-wd-xs-700p { + max-width: 700% + } + + .mn-wd-xs-700p { + min-width: 700% + } + + .wd-xs-700-f { + width: 700px !important + } + + .wd-xs-700p-f { + width: 700% !important + } + + .mx-wd-xs-700p-f { + max-width: 700% !important + } + + .mn-wd-xs-700p-f { + min-width: 700% !important + } + + .wd-xs-750 { + width: 750px + } + + .wd-xs-750p { + width: 750% + } + + .mx-wd-xs-750p { + max-width: 750% + } + + .mn-wd-xs-750p { + min-width: 750% + } + + .wd-xs-750-f { + width: 750px !important + } + + .wd-xs-750p-f { + width: 750% !important + } + + .mx-wd-xs-750p-f { + max-width: 750% !important + } + + .mn-wd-xs-750p-f { + min-width: 750% !important + } + + .wd-xs-800 { + width: 800px + } + + .wd-xs-800p { + width: 800% + } + + .mx-wd-xs-800p { + max-width: 800% + } + + .mn-wd-xs-800p { + min-width: 800% + } + + .wd-xs-800-f { + width: 800px !important + } + + .wd-xs-800p-f { + width: 800% !important + } + + .mx-wd-xs-800p-f { + max-width: 800% !important + } + + .mn-wd-xs-800p-f { + min-width: 800% !important + } + + .wd-xs-850 { + width: 850px + } + + .wd-xs-850p { + width: 850% + } + + .mx-wd-xs-850p { + max-width: 850% + } + + .mn-wd-xs-850p { + min-width: 850% + } + + .wd-xs-850-f { + width: 850px !important + } + + .wd-xs-850p-f { + width: 850% !important + } + + .mx-wd-xs-850p-f { + max-width: 850% !important + } + + .mn-wd-xs-850p-f { + min-width: 850% !important + } + + .wd-xs-900 { + width: 900px + } + + .wd-xs-900p { + width: 900% + } + + .mx-wd-xs-900p { + max-width: 900% + } + + .mn-wd-xs-900p { + min-width: 900% + } + + .wd-xs-900-f { + width: 900px !important + } + + .wd-xs-900p-f { + width: 900% !important + } + + .mx-wd-xs-900p-f { + max-width: 900% !important + } + + .mn-wd-xs-900p-f { + min-width: 900% !important + } + + .wd-xs-950 { + width: 950px + } + + .wd-xs-950p { + width: 950% + } + + .mx-wd-xs-950p { + max-width: 950% + } + + .mn-wd-xs-950p { + min-width: 950% + } + + .wd-xs-950-f { + width: 950px !important + } + + .wd-xs-950p-f { + width: 950% !important + } + + .mx-wd-xs-950p-f { + max-width: 950% !important + } + + .mn-wd-xs-950p-f { + min-width: 950% !important + } + + .wd-xs-1000 { + width: 1000px + } + + .wd-xs-1000p { + width: 1000% + } + + .mx-wd-xs-1000p { + max-width: 1000% + } + + .mn-wd-xs-1000p { + min-width: 1000% + } + + .wd-xs-1000-f { + width: 1000px !important + } + + .wd-xs-1000p-f { + width: 1000% !important + } + + .mx-wd-xs-1000p-f { + max-width: 1000% !important + } + + .mn-wd-xs-1000p-f { + min-width: 1000% !important + } + + .wd-xs-auto { + width: auto + } + + .wd-xs-auto-f { + width: auto !important + } +} + +@media (min-width: 576px) { + .wd-sm-5 { + width: 5px + } + + .wd-sm-5p { + width: 5% + } + + .mx-wd-sm-5p { + max-width: 5% + } + + .mn-wd-sm-5p { + min-width: 5% + } + + .wd-sm-5-f { + width: 5px !important + } + + .wd-sm-5p-f { + width: 5% !important + } + + .mx-wd-sm-5p-f { + max-width: 5% !important + } + + .mn-wd-sm-5p-f { + min-width: 5% !important + } + + .wd-sm-10 { + width: 10px + } + + .wd-sm-10p { + width: 10% + } + + .mx-wd-sm-10p { + max-width: 10% + } + + .mn-wd-sm-10p { + min-width: 10% + } + + .wd-sm-10-f { + width: 10px !important + } + + .wd-sm-10p-f { + width: 10% !important + } + + .mx-wd-sm-10p-f { + max-width: 10% !important + } + + .mn-wd-sm-10p-f { + min-width: 10% !important + } + + .wd-sm-15 { + width: 15px + } + + .wd-sm-15p { + width: 15% + } + + .mx-wd-sm-15p { + max-width: 15% + } + + .mn-wd-sm-15p { + min-width: 15% + } + + .wd-sm-15-f { + width: 15px !important + } + + .wd-sm-15p-f { + width: 15% !important + } + + .mx-wd-sm-15p-f { + max-width: 15% !important + } + + .mn-wd-sm-15p-f { + min-width: 15% !important + } + + .wd-sm-20 { + width: 20px + } + + .wd-sm-20p { + width: 20% + } + + .mx-wd-sm-20p { + max-width: 20% + } + + .mn-wd-sm-20p { + min-width: 20% + } + + .wd-sm-20-f { + width: 20px !important + } + + .wd-sm-20p-f { + width: 20% !important + } + + .mx-wd-sm-20p-f { + max-width: 20% !important + } + + .mn-wd-sm-20p-f { + min-width: 20% !important + } + + .wd-sm-25 { + width: 25px + } + + .wd-sm-25p { + width: 25% + } + + .mx-wd-sm-25p { + max-width: 25% + } + + .mn-wd-sm-25p { + min-width: 25% + } + + .wd-sm-25-f { + width: 25px !important + } + + .wd-sm-25p-f { + width: 25% !important + } + + .mx-wd-sm-25p-f { + max-width: 25% !important + } + + .mn-wd-sm-25p-f { + min-width: 25% !important + } + + .wd-sm-30 { + width: 30px + } + + .wd-sm-30p { + width: 30% + } + + .mx-wd-sm-30p { + max-width: 30% + } + + .mn-wd-sm-30p { + min-width: 30% + } + + .wd-sm-30-f { + width: 30px !important + } + + .wd-sm-30p-f { + width: 30% !important + } + + .mx-wd-sm-30p-f { + max-width: 30% !important + } + + .mn-wd-sm-30p-f { + min-width: 30% !important + } + + .wd-sm-35 { + width: 35px + } + + .wd-sm-35p { + width: 35% + } + + .mx-wd-sm-35p { + max-width: 35% + } + + .mn-wd-sm-35p { + min-width: 35% + } + + .wd-sm-35-f { + width: 35px !important + } + + .wd-sm-35p-f { + width: 35% !important + } + + .mx-wd-sm-35p-f { + max-width: 35% !important + } + + .mn-wd-sm-35p-f { + min-width: 35% !important + } + + .wd-sm-40 { + width: 40px + } + + .wd-sm-40p { + width: 40% + } + + .mx-wd-sm-40p { + max-width: 40% + } + + .mn-wd-sm-40p { + min-width: 40% + } + + .wd-sm-40-f { + width: 40px !important + } + + .wd-sm-40p-f { + width: 40% !important + } + + .mx-wd-sm-40p-f { + max-width: 40% !important + } + + .mn-wd-sm-40p-f { + min-width: 40% !important + } + + .wd-sm-45 { + width: 45px + } + + .wd-sm-45p { + width: 45% + } + + .mx-wd-sm-45p { + max-width: 45% + } + + .mn-wd-sm-45p { + min-width: 45% + } + + .wd-sm-45-f { + width: 45px !important + } + + .wd-sm-45p-f { + width: 45% !important + } + + .mx-wd-sm-45p-f { + max-width: 45% !important + } + + .mn-wd-sm-45p-f { + min-width: 45% !important + } + + .wd-sm-50 { + width: 50px + } + + .wd-sm-50p { + width: 50% + } + + .mx-wd-sm-50p { + max-width: 50% + } + + .mn-wd-sm-50p { + min-width: 50% + } + + .wd-sm-50-f { + width: 50px !important + } + + .wd-sm-50p-f { + width: 50% !important + } + + .mx-wd-sm-50p-f { + max-width: 50% !important + } + + .mn-wd-sm-50p-f { + min-width: 50% !important + } + + .wd-sm-55 { + width: 55px + } + + .wd-sm-55p { + width: 55% + } + + .mx-wd-sm-55p { + max-width: 55% + } + + .mn-wd-sm-55p { + min-width: 55% + } + + .wd-sm-55-f { + width: 55px !important + } + + .wd-sm-55p-f { + width: 55% !important + } + + .mx-wd-sm-55p-f { + max-width: 55% !important + } + + .mn-wd-sm-55p-f { + min-width: 55% !important + } + + .wd-sm-60 { + width: 60px + } + + .wd-sm-60p { + width: 60% + } + + .mx-wd-sm-60p { + max-width: 60% + } + + .mn-wd-sm-60p { + min-width: 60% + } + + .wd-sm-60-f { + width: 60px !important + } + + .wd-sm-60p-f { + width: 60% !important + } + + .mx-wd-sm-60p-f { + max-width: 60% !important + } + + .mn-wd-sm-60p-f { + min-width: 60% !important + } + + .wd-sm-65 { + width: 65px + } + + .wd-sm-65p { + width: 65% + } + + .mx-wd-sm-65p { + max-width: 65% + } + + .mn-wd-sm-65p { + min-width: 65% + } + + .wd-sm-65-f { + width: 65px !important + } + + .wd-sm-65p-f { + width: 65% !important + } + + .mx-wd-sm-65p-f { + max-width: 65% !important + } + + .mn-wd-sm-65p-f { + min-width: 65% !important + } + + .wd-sm-70 { + width: 70px + } + + .wd-sm-70p { + width: 70% + } + + .mx-wd-sm-70p { + max-width: 70% + } + + .mn-wd-sm-70p { + min-width: 70% + } + + .wd-sm-70-f { + width: 70px !important + } + + .wd-sm-70p-f { + width: 70% !important + } + + .mx-wd-sm-70p-f { + max-width: 70% !important + } + + .mn-wd-sm-70p-f { + min-width: 70% !important + } + + .wd-sm-75 { + width: 75px + } + + .wd-sm-75p { + width: 75% + } + + .mx-wd-sm-75p { + max-width: 75% + } + + .mn-wd-sm-75p { + min-width: 75% + } + + .wd-sm-75-f { + width: 75px !important + } + + .wd-sm-75p-f { + width: 75% !important + } + + .mx-wd-sm-75p-f { + max-width: 75% !important + } + + .mn-wd-sm-75p-f { + min-width: 75% !important + } + + .wd-sm-80 { + width: 80px + } + + .wd-sm-80p { + width: 80% + } + + .mx-wd-sm-80p { + max-width: 80% + } + + .mn-wd-sm-80p { + min-width: 80% + } + + .wd-sm-80-f { + width: 80px !important + } + + .wd-sm-80p-f { + width: 80% !important + } + + .mx-wd-sm-80p-f { + max-width: 80% !important + } + + .mn-wd-sm-80p-f { + min-width: 80% !important + } + + .wd-sm-85 { + width: 85px + } + + .wd-sm-85p { + width: 85% + } + + .mx-wd-sm-85p { + max-width: 85% + } + + .mn-wd-sm-85p { + min-width: 85% + } + + .wd-sm-85-f { + width: 85px !important + } + + .wd-sm-85p-f { + width: 85% !important + } + + .mx-wd-sm-85p-f { + max-width: 85% !important + } + + .mn-wd-sm-85p-f { + min-width: 85% !important + } + + .wd-sm-90 { + width: 90px + } + + .wd-sm-90p { + width: 90% + } + + .mx-wd-sm-90p { + max-width: 90% + } + + .mn-wd-sm-90p { + min-width: 90% + } + + .wd-sm-90-f { + width: 90px !important + } + + .wd-sm-90p-f { + width: 90% !important + } + + .mx-wd-sm-90p-f { + max-width: 90% !important + } + + .mn-wd-sm-90p-f { + min-width: 90% !important + } + + .wd-sm-95 { + width: 95px + } + + .wd-sm-95p { + width: 95% + } + + .mx-wd-sm-95p { + max-width: 95% + } + + .mn-wd-sm-95p { + min-width: 95% + } + + .wd-sm-95-f { + width: 95px !important + } + + .wd-sm-95p-f { + width: 95% !important + } + + .mx-wd-sm-95p-f { + max-width: 95% !important + } + + .mn-wd-sm-95p-f { + min-width: 95% !important + } + + .wd-sm-100 { + width: 100px + } + + .wd-sm-100p { + width: 100% + } + + .mx-wd-sm-100p { + max-width: 100% + } + + .mn-wd-sm-100p { + min-width: 100% + } + + .wd-sm-100-f { + width: 100px !important + } + + .wd-sm-100p-f { + width: 100% !important + } + + .mx-wd-sm-100p-f { + max-width: 100% !important + } + + .mn-wd-sm-100p-f { + min-width: 100% !important + } + + .wd-sm-150 { + width: 150px + } + + .wd-sm-150p { + width: 150% + } + + .mx-wd-sm-150p { + max-width: 150% + } + + .mn-wd-sm-150p { + min-width: 150% + } + + .wd-sm-150-f { + width: 150px !important + } + + .wd-sm-150p-f { + width: 150% !important + } + + .mx-wd-sm-150p-f { + max-width: 150% !important + } + + .mn-wd-sm-150p-f { + min-width: 150% !important + } + + .wd-sm-200 { + width: 200px + } + + .wd-sm-200p { + width: 200% + } + + .mx-wd-sm-200p { + max-width: 200% + } + + .mn-wd-sm-200p { + min-width: 200% + } + + .wd-sm-200-f { + width: 200px !important + } + + .wd-sm-200p-f { + width: 200% !important + } + + .mx-wd-sm-200p-f { + max-width: 200% !important + } + + .mn-wd-sm-200p-f { + min-width: 200% !important + } + + .wd-sm-250 { + width: 250px + } + + .wd-sm-250p { + width: 250% + } + + .mx-wd-sm-250p { + max-width: 250% + } + + .mn-wd-sm-250p { + min-width: 250% + } + + .wd-sm-250-f { + width: 250px !important + } + + .wd-sm-250p-f { + width: 250% !important + } + + .mx-wd-sm-250p-f { + max-width: 250% !important + } + + .mn-wd-sm-250p-f { + min-width: 250% !important + } + + .wd-sm-300 { + width: 300px + } + + .wd-sm-300p { + width: 300% + } + + .mx-wd-sm-300p { + max-width: 300% + } + + .mn-wd-sm-300p { + min-width: 300% + } + + .wd-sm-300-f { + width: 300px !important + } + + .wd-sm-300p-f { + width: 300% !important + } + + .mx-wd-sm-300p-f { + max-width: 300% !important + } + + .mn-wd-sm-300p-f { + min-width: 300% !important + } + + .wd-sm-350 { + width: 350px + } + + .wd-sm-350p { + width: 350% + } + + .mx-wd-sm-350p { + max-width: 350% + } + + .mn-wd-sm-350p { + min-width: 350% + } + + .wd-sm-350-f { + width: 350px !important + } + + .wd-sm-350p-f { + width: 350% !important + } + + .mx-wd-sm-350p-f { + max-width: 350% !important + } + + .mn-wd-sm-350p-f { + min-width: 350% !important + } + + .wd-sm-400 { + width: 400px + } + + .wd-sm-400p { + width: 400% + } + + .mx-wd-sm-400p { + max-width: 400% + } + + .mn-wd-sm-400p { + min-width: 400% + } + + .wd-sm-400-f { + width: 400px !important + } + + .wd-sm-400p-f { + width: 400% !important + } + + .mx-wd-sm-400p-f { + max-width: 400% !important + } + + .mn-wd-sm-400p-f { + min-width: 400% !important + } + + .wd-sm-450 { + width: 450px + } + + .wd-sm-450p { + width: 450% + } + + .mx-wd-sm-450p { + max-width: 450% + } + + .mn-wd-sm-450p { + min-width: 450% + } + + .wd-sm-450-f { + width: 450px !important + } + + .wd-sm-450p-f { + width: 450% !important + } + + .mx-wd-sm-450p-f { + max-width: 450% !important + } + + .mn-wd-sm-450p-f { + min-width: 450% !important + } + + .wd-sm-500 { + width: 500px + } + + .wd-sm-500p { + width: 500% + } + + .mx-wd-sm-500p { + max-width: 500% + } + + .mn-wd-sm-500p { + min-width: 500% + } + + .wd-sm-500-f { + width: 500px !important + } + + .wd-sm-500p-f { + width: 500% !important + } + + .mx-wd-sm-500p-f { + max-width: 500% !important + } + + .mn-wd-sm-500p-f { + min-width: 500% !important + } + + .wd-sm-550 { + width: 550px + } + + .wd-sm-550p { + width: 550% + } + + .mx-wd-sm-550p { + max-width: 550% + } + + .mn-wd-sm-550p { + min-width: 550% + } + + .wd-sm-550-f { + width: 550px !important + } + + .wd-sm-550p-f { + width: 550% !important + } + + .mx-wd-sm-550p-f { + max-width: 550% !important + } + + .mn-wd-sm-550p-f { + min-width: 550% !important + } + + .wd-sm-600 { + width: 600px + } + + .wd-sm-600p { + width: 600% + } + + .mx-wd-sm-600p { + max-width: 600% + } + + .mn-wd-sm-600p { + min-width: 600% + } + + .wd-sm-600-f { + width: 600px !important + } + + .wd-sm-600p-f { + width: 600% !important + } + + .mx-wd-sm-600p-f { + max-width: 600% !important + } + + .mn-wd-sm-600p-f { + min-width: 600% !important + } + + .wd-sm-650 { + width: 650px + } + + .wd-sm-650p { + width: 650% + } + + .mx-wd-sm-650p { + max-width: 650% + } + + .mn-wd-sm-650p { + min-width: 650% + } + + .wd-sm-650-f { + width: 650px !important + } + + .wd-sm-650p-f { + width: 650% !important + } + + .mx-wd-sm-650p-f { + max-width: 650% !important + } + + .mn-wd-sm-650p-f { + min-width: 650% !important + } + + .wd-sm-700 { + width: 700px + } + + .wd-sm-700p { + width: 700% + } + + .mx-wd-sm-700p { + max-width: 700% + } + + .mn-wd-sm-700p { + min-width: 700% + } + + .wd-sm-700-f { + width: 700px !important + } + + .wd-sm-700p-f { + width: 700% !important + } + + .mx-wd-sm-700p-f { + max-width: 700% !important + } + + .mn-wd-sm-700p-f { + min-width: 700% !important + } + + .wd-sm-750 { + width: 750px + } + + .wd-sm-750p { + width: 750% + } + + .mx-wd-sm-750p { + max-width: 750% + } + + .mn-wd-sm-750p { + min-width: 750% + } + + .wd-sm-750-f { + width: 750px !important + } + + .wd-sm-750p-f { + width: 750% !important + } + + .mx-wd-sm-750p-f { + max-width: 750% !important + } + + .mn-wd-sm-750p-f { + min-width: 750% !important + } + + .wd-sm-800 { + width: 800px + } + + .wd-sm-800p { + width: 800% + } + + .mx-wd-sm-800p { + max-width: 800% + } + + .mn-wd-sm-800p { + min-width: 800% + } + + .wd-sm-800-f { + width: 800px !important + } + + .wd-sm-800p-f { + width: 800% !important + } + + .mx-wd-sm-800p-f { + max-width: 800% !important + } + + .mn-wd-sm-800p-f { + min-width: 800% !important + } + + .wd-sm-850 { + width: 850px + } + + .wd-sm-850p { + width: 850% + } + + .mx-wd-sm-850p { + max-width: 850% + } + + .mn-wd-sm-850p { + min-width: 850% + } + + .wd-sm-850-f { + width: 850px !important + } + + .wd-sm-850p-f { + width: 850% !important + } + + .mx-wd-sm-850p-f { + max-width: 850% !important + } + + .mn-wd-sm-850p-f { + min-width: 850% !important + } + + .wd-sm-900 { + width: 900px + } + + .wd-sm-900p { + width: 900% + } + + .mx-wd-sm-900p { + max-width: 900% + } + + .mn-wd-sm-900p { + min-width: 900% + } + + .wd-sm-900-f { + width: 900px !important + } + + .wd-sm-900p-f { + width: 900% !important + } + + .mx-wd-sm-900p-f { + max-width: 900% !important + } + + .mn-wd-sm-900p-f { + min-width: 900% !important + } + + .wd-sm-950 { + width: 950px + } + + .wd-sm-950p { + width: 950% + } + + .mx-wd-sm-950p { + max-width: 950% + } + + .mn-wd-sm-950p { + min-width: 950% + } + + .wd-sm-950-f { + width: 950px !important + } + + .wd-sm-950p-f { + width: 950% !important + } + + .mx-wd-sm-950p-f { + max-width: 950% !important + } + + .mn-wd-sm-950p-f { + min-width: 950% !important + } + + .wd-sm-1000 { + width: 1000px + } + + .wd-sm-1000p { + width: 1000% + } + + .mx-wd-sm-1000p { + max-width: 1000% + } + + .mn-wd-sm-1000p { + min-width: 1000% + } + + .wd-sm-1000-f { + width: 1000px !important + } + + .wd-sm-1000p-f { + width: 1000% !important + } + + .mx-wd-sm-1000p-f { + max-width: 1000% !important + } + + .mn-wd-sm-1000p-f { + min-width: 1000% !important + } + + .wd-sm-auto { + width: auto + } + + .wd-sm-auto-f { + width: auto !important + } +} + +@media (min-width: 768px) { + .wd-md-5 { + width: 5px + } + + .wd-md-5p { + width: 5% + } + + .mx-wd-md-5p { + max-width: 5% + } + + .mn-wd-md-5p { + min-width: 5% + } + + .wd-md-5-f { + width: 5px !important + } + + .wd-md-5p-f { + width: 5% !important + } + + .mx-wd-md-5p-f { + max-width: 5% !important + } + + .mn-wd-md-5p-f { + min-width: 5% !important + } + + .wd-md-10 { + width: 10px + } + + .wd-md-10p { + width: 10% + } + + .mx-wd-md-10p { + max-width: 10% + } + + .mn-wd-md-10p { + min-width: 10% + } + + .wd-md-10-f { + width: 10px !important + } + + .wd-md-10p-f { + width: 10% !important + } + + .mx-wd-md-10p-f { + max-width: 10% !important + } + + .mn-wd-md-10p-f { + min-width: 10% !important + } + + .wd-md-15 { + width: 15px + } + + .wd-md-15p { + width: 15% + } + + .mx-wd-md-15p { + max-width: 15% + } + + .mn-wd-md-15p { + min-width: 15% + } + + .wd-md-15-f { + width: 15px !important + } + + .wd-md-15p-f { + width: 15% !important + } + + .mx-wd-md-15p-f { + max-width: 15% !important + } + + .mn-wd-md-15p-f { + min-width: 15% !important + } + + .wd-md-20 { + width: 20px + } + + .wd-md-20p { + width: 20% + } + + .mx-wd-md-20p { + max-width: 20% + } + + .mn-wd-md-20p { + min-width: 20% + } + + .wd-md-20-f { + width: 20px !important + } + + .wd-md-20p-f { + width: 20% !important + } + + .mx-wd-md-20p-f { + max-width: 20% !important + } + + .mn-wd-md-20p-f { + min-width: 20% !important + } + + .wd-md-25 { + width: 25px + } + + .wd-md-25p { + width: 25% + } + + .mx-wd-md-25p { + max-width: 25% + } + + .mn-wd-md-25p { + min-width: 25% + } + + .wd-md-25-f { + width: 25px !important + } + + .wd-md-25p-f { + width: 25% !important + } + + .mx-wd-md-25p-f { + max-width: 25% !important + } + + .mn-wd-md-25p-f { + min-width: 25% !important + } + + .wd-md-30 { + width: 30px + } + + .wd-md-30p { + width: 30% + } + + .mx-wd-md-30p { + max-width: 30% + } + + .mn-wd-md-30p { + min-width: 30% + } + + .wd-md-30-f { + width: 30px !important + } + + .wd-md-30p-f { + width: 30% !important + } + + .mx-wd-md-30p-f { + max-width: 30% !important + } + + .mn-wd-md-30p-f { + min-width: 30% !important + } + + .wd-md-35 { + width: 35px + } + + .wd-md-35p { + width: 35% + } + + .mx-wd-md-35p { + max-width: 35% + } + + .mn-wd-md-35p { + min-width: 35% + } + + .wd-md-35-f { + width: 35px !important + } + + .wd-md-35p-f { + width: 35% !important + } + + .mx-wd-md-35p-f { + max-width: 35% !important + } + + .mn-wd-md-35p-f { + min-width: 35% !important + } + + .wd-md-40 { + width: 40px + } + + .wd-md-40p { + width: 40% + } + + .mx-wd-md-40p { + max-width: 40% + } + + .mn-wd-md-40p { + min-width: 40% + } + + .wd-md-40-f { + width: 40px !important + } + + .wd-md-40p-f { + width: 40% !important + } + + .mx-wd-md-40p-f { + max-width: 40% !important + } + + .mn-wd-md-40p-f { + min-width: 40% !important + } + + .wd-md-45 { + width: 45px + } + + .wd-md-45p { + width: 45% + } + + .mx-wd-md-45p { + max-width: 45% + } + + .mn-wd-md-45p { + min-width: 45% + } + + .wd-md-45-f { + width: 45px !important + } + + .wd-md-45p-f { + width: 45% !important + } + + .mx-wd-md-45p-f { + max-width: 45% !important + } + + .mn-wd-md-45p-f { + min-width: 45% !important + } + + .wd-md-50 { + width: 50px + } + + .wd-md-50p { + width: 50% + } + + .mx-wd-md-50p { + max-width: 50% + } + + .mn-wd-md-50p { + min-width: 50% + } + + .wd-md-50-f { + width: 50px !important + } + + .wd-md-50p-f { + width: 50% !important + } + + .mx-wd-md-50p-f { + max-width: 50% !important + } + + .mn-wd-md-50p-f { + min-width: 50% !important + } + + .wd-md-55 { + width: 55px + } + + .wd-md-55p { + width: 55% + } + + .mx-wd-md-55p { + max-width: 55% + } + + .mn-wd-md-55p { + min-width: 55% + } + + .wd-md-55-f { + width: 55px !important + } + + .wd-md-55p-f { + width: 55% !important + } + + .mx-wd-md-55p-f { + max-width: 55% !important + } + + .mn-wd-md-55p-f { + min-width: 55% !important + } + + .wd-md-60 { + width: 60px + } + + .wd-md-60p { + width: 60% + } + + .mx-wd-md-60p { + max-width: 60% + } + + .mn-wd-md-60p { + min-width: 60% + } + + .wd-md-60-f { + width: 60px !important + } + + .wd-md-60p-f { + width: 60% !important + } + + .mx-wd-md-60p-f { + max-width: 60% !important + } + + .mn-wd-md-60p-f { + min-width: 60% !important + } + + .wd-md-65 { + width: 65px + } + + .wd-md-65p { + width: 65% + } + + .mx-wd-md-65p { + max-width: 65% + } + + .mn-wd-md-65p { + min-width: 65% + } + + .wd-md-65-f { + width: 65px !important + } + + .wd-md-65p-f { + width: 65% !important + } + + .mx-wd-md-65p-f { + max-width: 65% !important + } + + .mn-wd-md-65p-f { + min-width: 65% !important + } + + .wd-md-70 { + width: 70px + } + + .wd-md-70p { + width: 70% + } + + .mx-wd-md-70p { + max-width: 70% + } + + .mn-wd-md-70p { + min-width: 70% + } + + .wd-md-70-f { + width: 70px !important + } + + .wd-md-70p-f { + width: 70% !important + } + + .mx-wd-md-70p-f { + max-width: 70% !important + } + + .mn-wd-md-70p-f { + min-width: 70% !important + } + + .wd-md-75 { + width: 75px + } + + .wd-md-75p { + width: 75% + } + + .mx-wd-md-75p { + max-width: 75% + } + + .mn-wd-md-75p { + min-width: 75% + } + + .wd-md-75-f { + width: 75px !important + } + + .wd-md-75p-f { + width: 75% !important + } + + .mx-wd-md-75p-f { + max-width: 75% !important + } + + .mn-wd-md-75p-f { + min-width: 75% !important + } + + .wd-md-80 { + width: 80px + } + + .wd-md-80p { + width: 80% + } + + .mx-wd-md-80p { + max-width: 80% + } + + .mn-wd-md-80p { + min-width: 80% + } + + .wd-md-80-f { + width: 80px !important + } + + .wd-md-80p-f { + width: 80% !important + } + + .mx-wd-md-80p-f { + max-width: 80% !important + } + + .mn-wd-md-80p-f { + min-width: 80% !important + } + + .wd-md-85 { + width: 85px + } + + .wd-md-85p { + width: 85% + } + + .mx-wd-md-85p { + max-width: 85% + } + + .mn-wd-md-85p { + min-width: 85% + } + + .wd-md-85-f { + width: 85px !important + } + + .wd-md-85p-f { + width: 85% !important + } + + .mx-wd-md-85p-f { + max-width: 85% !important + } + + .mn-wd-md-85p-f { + min-width: 85% !important + } + + .wd-md-90 { + width: 90px + } + + .wd-md-90p { + width: 90% + } + + .mx-wd-md-90p { + max-width: 90% + } + + .mn-wd-md-90p { + min-width: 90% + } + + .wd-md-90-f { + width: 90px !important + } + + .wd-md-90p-f { + width: 90% !important + } + + .mx-wd-md-90p-f { + max-width: 90% !important + } + + .mn-wd-md-90p-f { + min-width: 90% !important + } + + .wd-md-95 { + width: 95px + } + + .wd-md-95p { + width: 95% + } + + .mx-wd-md-95p { + max-width: 95% + } + + .mn-wd-md-95p { + min-width: 95% + } + + .wd-md-95-f { + width: 95px !important + } + + .wd-md-95p-f { + width: 95% !important + } + + .mx-wd-md-95p-f { + max-width: 95% !important + } + + .mn-wd-md-95p-f { + min-width: 95% !important + } + + .wd-md-100 { + width: 100px + } + + .wd-md-100p { + width: 100% + } + + .mx-wd-md-100p { + max-width: 100% + } + + .mn-wd-md-100p { + min-width: 100% + } + + .wd-md-100-f { + width: 100px !important + } + + .wd-md-100p-f { + width: 100% !important + } + + .mx-wd-md-100p-f { + max-width: 100% !important + } + + .mn-wd-md-100p-f { + min-width: 100% !important + } + + .wd-md-150 { + width: 150px + } + + .wd-md-150p { + width: 150% + } + + .mx-wd-md-150p { + max-width: 150% + } + + .mn-wd-md-150p { + min-width: 150% + } + + .wd-md-150-f { + width: 150px !important + } + + .wd-md-150p-f { + width: 150% !important + } + + .mx-wd-md-150p-f { + max-width: 150% !important + } + + .mn-wd-md-150p-f { + min-width: 150% !important + } + + .wd-md-200 { + width: 200px + } + + .wd-md-200p { + width: 200% + } + + .mx-wd-md-200p { + max-width: 200% + } + + .mn-wd-md-200p { + min-width: 200% + } + + .wd-md-200-f { + width: 200px !important + } + + .wd-md-200p-f { + width: 200% !important + } + + .mx-wd-md-200p-f { + max-width: 200% !important + } + + .mn-wd-md-200p-f { + min-width: 200% !important + } + + .wd-md-250 { + width: 250px + } + + .wd-md-250p { + width: 250% + } + + .mx-wd-md-250p { + max-width: 250% + } + + .mn-wd-md-250p { + min-width: 250% + } + + .wd-md-250-f { + width: 250px !important + } + + .wd-md-250p-f { + width: 250% !important + } + + .mx-wd-md-250p-f { + max-width: 250% !important + } + + .mn-wd-md-250p-f { + min-width: 250% !important + } + + .wd-md-300 { + width: 300px + } + + .wd-md-300p { + width: 300% + } + + .mx-wd-md-300p { + max-width: 300% + } + + .mn-wd-md-300p { + min-width: 300% + } + + .wd-md-300-f { + width: 300px !important + } + + .wd-md-300p-f { + width: 300% !important + } + + .mx-wd-md-300p-f { + max-width: 300% !important + } + + .mn-wd-md-300p-f { + min-width: 300% !important + } + + .wd-md-350 { + width: 350px + } + + .wd-md-350p { + width: 350% + } + + .mx-wd-md-350p { + max-width: 350% + } + + .mn-wd-md-350p { + min-width: 350% + } + + .wd-md-350-f { + width: 350px !important + } + + .wd-md-350p-f { + width: 350% !important + } + + .mx-wd-md-350p-f { + max-width: 350% !important + } + + .mn-wd-md-350p-f { + min-width: 350% !important + } + + .wd-md-400 { + width: 400px + } + + .wd-md-400p { + width: 400% + } + + .mx-wd-md-400p { + max-width: 400% + } + + .mn-wd-md-400p { + min-width: 400% + } + + .wd-md-400-f { + width: 400px !important + } + + .wd-md-400p-f { + width: 400% !important + } + + .mx-wd-md-400p-f { + max-width: 400% !important + } + + .mn-wd-md-400p-f { + min-width: 400% !important + } + + .wd-md-450 { + width: 450px + } + + .wd-md-450p { + width: 450% + } + + .mx-wd-md-450p { + max-width: 450% + } + + .mn-wd-md-450p { + min-width: 450% + } + + .wd-md-450-f { + width: 450px !important + } + + .wd-md-450p-f { + width: 450% !important + } + + .mx-wd-md-450p-f { + max-width: 450% !important + } + + .mn-wd-md-450p-f { + min-width: 450% !important + } + + .wd-md-500 { + width: 500px + } + + .wd-md-500p { + width: 500% + } + + .mx-wd-md-500p { + max-width: 500% + } + + .mn-wd-md-500p { + min-width: 500% + } + + .wd-md-500-f { + width: 500px !important + } + + .wd-md-500p-f { + width: 500% !important + } + + .mx-wd-md-500p-f { + max-width: 500% !important + } + + .mn-wd-md-500p-f { + min-width: 500% !important + } + + .wd-md-550 { + width: 550px + } + + .wd-md-550p { + width: 550% + } + + .mx-wd-md-550p { + max-width: 550% + } + + .mn-wd-md-550p { + min-width: 550% + } + + .wd-md-550-f { + width: 550px !important + } + + .wd-md-550p-f { + width: 550% !important + } + + .mx-wd-md-550p-f { + max-width: 550% !important + } + + .mn-wd-md-550p-f { + min-width: 550% !important + } + + .wd-md-600 { + width: 600px + } + + .wd-md-600p { + width: 600% + } + + .mx-wd-md-600p { + max-width: 600% + } + + .mn-wd-md-600p { + min-width: 600% + } + + .wd-md-600-f { + width: 600px !important + } + + .wd-md-600p-f { + width: 600% !important + } + + .mx-wd-md-600p-f { + max-width: 600% !important + } + + .mn-wd-md-600p-f { + min-width: 600% !important + } + + .wd-md-650 { + width: 650px + } + + .wd-md-650p { + width: 650% + } + + .mx-wd-md-650p { + max-width: 650% + } + + .mn-wd-md-650p { + min-width: 650% + } + + .wd-md-650-f { + width: 650px !important + } + + .wd-md-650p-f { + width: 650% !important + } + + .mx-wd-md-650p-f { + max-width: 650% !important + } + + .mn-wd-md-650p-f { + min-width: 650% !important + } + + .wd-md-700 { + width: 700px + } + + .wd-md-700p { + width: 700% + } + + .mx-wd-md-700p { + max-width: 700% + } + + .mn-wd-md-700p { + min-width: 700% + } + + .wd-md-700-f { + width: 700px !important + } + + .wd-md-700p-f { + width: 700% !important + } + + .mx-wd-md-700p-f { + max-width: 700% !important + } + + .mn-wd-md-700p-f { + min-width: 700% !important + } + + .wd-md-750 { + width: 750px + } + + .wd-md-750p { + width: 750% + } + + .mx-wd-md-750p { + max-width: 750% + } + + .mn-wd-md-750p { + min-width: 750% + } + + .wd-md-750-f { + width: 750px !important + } + + .wd-md-750p-f { + width: 750% !important + } + + .mx-wd-md-750p-f { + max-width: 750% !important + } + + .mn-wd-md-750p-f { + min-width: 750% !important + } + + .wd-md-800 { + width: 800px + } + + .wd-md-800p { + width: 800% + } + + .mx-wd-md-800p { + max-width: 800% + } + + .mn-wd-md-800p { + min-width: 800% + } + + .wd-md-800-f { + width: 800px !important + } + + .wd-md-800p-f { + width: 800% !important + } + + .mx-wd-md-800p-f { + max-width: 800% !important + } + + .mn-wd-md-800p-f { + min-width: 800% !important + } + + .wd-md-850 { + width: 850px + } + + .wd-md-850p { + width: 850% + } + + .mx-wd-md-850p { + max-width: 850% + } + + .mn-wd-md-850p { + min-width: 850% + } + + .wd-md-850-f { + width: 850px !important + } + + .wd-md-850p-f { + width: 850% !important + } + + .mx-wd-md-850p-f { + max-width: 850% !important + } + + .mn-wd-md-850p-f { + min-width: 850% !important + } + + .wd-md-900 { + width: 900px + } + + .wd-md-900p { + width: 900% + } + + .mx-wd-md-900p { + max-width: 900% + } + + .mn-wd-md-900p { + min-width: 900% + } + + .wd-md-900-f { + width: 900px !important + } + + .wd-md-900p-f { + width: 900% !important + } + + .mx-wd-md-900p-f { + max-width: 900% !important + } + + .mn-wd-md-900p-f { + min-width: 900% !important + } + + .wd-md-950 { + width: 950px + } + + .wd-md-950p { + width: 950% + } + + .mx-wd-md-950p { + max-width: 950% + } + + .mn-wd-md-950p { + min-width: 950% + } + + .wd-md-950-f { + width: 950px !important + } + + .wd-md-950p-f { + width: 950% !important + } + + .mx-wd-md-950p-f { + max-width: 950% !important + } + + .mn-wd-md-950p-f { + min-width: 950% !important + } + + .wd-md-1000 { + width: 1000px + } + + .wd-md-1000p { + width: 1000% + } + + .mx-wd-md-1000p { + max-width: 1000% + } + + .mn-wd-md-1000p { + min-width: 1000% + } + + .wd-md-1000-f { + width: 1000px !important + } + + .wd-md-1000p-f { + width: 1000% !important + } + + .mx-wd-md-1000p-f { + max-width: 1000% !important + } + + .mn-wd-md-1000p-f { + min-width: 1000% !important + } + + .wd-md-auto { + width: auto + } + + .wd-md-auto-f { + width: auto !important + } + + .wd-md-120 { + width: 120px + } +} + +@media (min-width: 992px) { + .wd-lg-5 { + width: 5px + } + + .wd-lg-5p { + width: 5% + } + + .mx-wd-lg-5p { + max-width: 5% + } + + .mn-wd-lg-5p { + min-width: 5% + } + + .wd-lg-5-f { + width: 5px !important + } + + .wd-lg-5p-f { + width: 5% !important + } + + .mx-wd-lg-5p-f { + max-width: 5% !important + } + + .mn-wd-lg-5p-f { + min-width: 5% !important + } + + .wd-lg-10 { + width: 10px + } + + .wd-lg-10p { + width: 10% + } + + .mx-wd-lg-10p { + max-width: 10% + } + + .mn-wd-lg-10p { + min-width: 10% + } + + .wd-lg-10-f { + width: 10px !important + } + + .wd-lg-10p-f { + width: 10% !important + } + + .mx-wd-lg-10p-f { + max-width: 10% !important + } + + .mn-wd-lg-10p-f { + min-width: 10% !important + } + + .wd-lg-15 { + width: 15px + } + + .wd-lg-15p { + width: 15% + } + + .mx-wd-lg-15p { + max-width: 15% + } + + .mn-wd-lg-15p { + min-width: 15% + } + + .wd-lg-15-f { + width: 15px !important + } + + .wd-lg-15p-f { + width: 15% !important + } + + .mx-wd-lg-15p-f { + max-width: 15% !important + } + + .mn-wd-lg-15p-f { + min-width: 15% !important + } + + .wd-lg-20 { + width: 20px + } + + .wd-lg-20p { + width: 20% + } + + .mx-wd-lg-20p { + max-width: 20% + } + + .mn-wd-lg-20p { + min-width: 20% + } + + .wd-lg-20-f { + width: 20px !important + } + + .wd-lg-20p-f { + width: 20% !important + } + + .mx-wd-lg-20p-f { + max-width: 20% !important + } + + .mn-wd-lg-20p-f { + min-width: 20% !important + } + + .wd-lg-25 { + width: 25px + } + + .wd-lg-25p { + width: 25% + } + + .mx-wd-lg-25p { + max-width: 25% + } + + .mn-wd-lg-25p { + min-width: 25% + } + + .wd-lg-25-f { + width: 25px !important + } + + .wd-lg-25p-f { + width: 25% !important + } + + .mx-wd-lg-25p-f { + max-width: 25% !important + } + + .mn-wd-lg-25p-f { + min-width: 25% !important + } + + .wd-lg-30 { + width: 30px + } + + .wd-lg-30p { + width: 30% + } + + .mx-wd-lg-30p { + max-width: 30% + } + + .mn-wd-lg-30p { + min-width: 30% + } + + .wd-lg-30-f { + width: 30px !important + } + + .wd-lg-30p-f { + width: 30% !important + } + + .mx-wd-lg-30p-f { + max-width: 30% !important + } + + .mn-wd-lg-30p-f { + min-width: 30% !important + } + + .wd-lg-35 { + width: 35px + } + + .wd-lg-35p { + width: 35% + } + + .mx-wd-lg-35p { + max-width: 35% + } + + .mn-wd-lg-35p { + min-width: 35% + } + + .wd-lg-35-f { + width: 35px !important + } + + .wd-lg-35p-f { + width: 35% !important + } + + .mx-wd-lg-35p-f { + max-width: 35% !important + } + + .mn-wd-lg-35p-f { + min-width: 35% !important + } + + .wd-lg-40 { + width: 40px + } + + .wd-lg-40p { + width: 40% + } + + .mx-wd-lg-40p { + max-width: 40% + } + + .mn-wd-lg-40p { + min-width: 40% + } + + .wd-lg-40-f { + width: 40px !important + } + + .wd-lg-40p-f { + width: 40% !important + } + + .mx-wd-lg-40p-f { + max-width: 40% !important + } + + .mn-wd-lg-40p-f { + min-width: 40% !important + } + + .wd-lg-45 { + width: 45px + } + + .wd-lg-45p { + width: 45% + } + + .mx-wd-lg-45p { + max-width: 45% + } + + .mn-wd-lg-45p { + min-width: 45% + } + + .wd-lg-45-f { + width: 45px !important + } + + .wd-lg-45p-f { + width: 45% !important + } + + .mx-wd-lg-45p-f { + max-width: 45% !important + } + + .mn-wd-lg-45p-f { + min-width: 45% !important + } + + .wd-lg-50 { + width: 50px + } + + .wd-lg-50p { + width: 50% + } + + .mx-wd-lg-50p { + max-width: 50% + } + + .mn-wd-lg-50p { + min-width: 50% + } + + .wd-lg-50-f { + width: 50px !important + } + + .wd-lg-50p-f { + width: 50% !important + } + + .mx-wd-lg-50p-f { + max-width: 50% !important + } + + .mn-wd-lg-50p-f { + min-width: 50% !important + } + + .wd-lg-55 { + width: 55px + } + + .wd-lg-55p { + width: 55% + } + + .mx-wd-lg-55p { + max-width: 55% + } + + .mn-wd-lg-55p { + min-width: 55% + } + + .wd-lg-55-f { + width: 55px !important + } + + .wd-lg-55p-f { + width: 55% !important + } + + .mx-wd-lg-55p-f { + max-width: 55% !important + } + + .mn-wd-lg-55p-f { + min-width: 55% !important + } + + .wd-lg-60 { + width: 60px + } + + .wd-lg-60p { + width: 60% + } + + .mx-wd-lg-60p { + max-width: 60% + } + + .mn-wd-lg-60p { + min-width: 60% + } + + .wd-lg-60-f { + width: 60px !important + } + + .wd-lg-60p-f { + width: 60% !important + } + + .mx-wd-lg-60p-f { + max-width: 60% !important + } + + .mn-wd-lg-60p-f { + min-width: 60% !important + } + + .wd-lg-65 { + width: 65px + } + + .wd-lg-65p { + width: 65% + } + + .mx-wd-lg-65p { + max-width: 65% + } + + .mn-wd-lg-65p { + min-width: 65% + } + + .wd-lg-65-f { + width: 65px !important + } + + .wd-lg-65p-f { + width: 65% !important + } + + .mx-wd-lg-65p-f { + max-width: 65% !important + } + + .mn-wd-lg-65p-f { + min-width: 65% !important + } + + .wd-lg-70 { + width: 70px + } + + .wd-lg-70p { + width: 70% + } + + .mx-wd-lg-70p { + max-width: 70% + } + + .mn-wd-lg-70p { + min-width: 70% + } + + .wd-lg-70-f { + width: 70px !important + } + + .wd-lg-70p-f { + width: 70% !important + } + + .mx-wd-lg-70p-f { + max-width: 70% !important + } + + .mn-wd-lg-70p-f { + min-width: 70% !important + } + + .wd-lg-75 { + width: 75px + } + + .wd-lg-75p { + width: 75% + } + + .mx-wd-lg-75p { + max-width: 75% + } + + .mn-wd-lg-75p { + min-width: 75% + } + + .wd-lg-75-f { + width: 75px !important + } + + .wd-lg-75p-f { + width: 75% !important + } + + .mx-wd-lg-75p-f { + max-width: 75% !important + } + + .mn-wd-lg-75p-f { + min-width: 75% !important + } + + .wd-lg-80 { + width: 80px + } + + .wd-lg-80p { + width: 80% + } + + .mx-wd-lg-80p { + max-width: 80% + } + + .mn-wd-lg-80p { + min-width: 80% + } + + .wd-lg-80-f { + width: 80px !important + } + + .wd-lg-80p-f { + width: 80% !important + } + + .mx-wd-lg-80p-f { + max-width: 80% !important + } + + .mn-wd-lg-80p-f { + min-width: 80% !important + } + + .wd-lg-85 { + width: 85px + } + + .wd-lg-85p { + width: 85% + } + + .mx-wd-lg-85p { + max-width: 85% + } + + .mn-wd-lg-85p { + min-width: 85% + } + + .wd-lg-85-f { + width: 85px !important + } + + .wd-lg-85p-f { + width: 85% !important + } + + .mx-wd-lg-85p-f { + max-width: 85% !important + } + + .mn-wd-lg-85p-f { + min-width: 85% !important + } + + .wd-lg-90 { + width: 90px + } + + .wd-lg-90p { + width: 90% + } + + .mx-wd-lg-90p { + max-width: 90% + } + + .mn-wd-lg-90p { + min-width: 90% + } + + .wd-lg-90-f { + width: 90px !important + } + + .wd-lg-90p-f { + width: 90% !important + } + + .mx-wd-lg-90p-f { + max-width: 90% !important + } + + .mn-wd-lg-90p-f { + min-width: 90% !important + } + + .wd-lg-95 { + width: 95px + } + + .wd-lg-95p { + width: 95% + } + + .mx-wd-lg-95p { + max-width: 95% + } + + .mn-wd-lg-95p { + min-width: 95% + } + + .wd-lg-95-f { + width: 95px !important + } + + .wd-lg-95p-f { + width: 95% !important + } + + .mx-wd-lg-95p-f { + max-width: 95% !important + } + + .mn-wd-lg-95p-f { + min-width: 95% !important + } + + .wd-lg-100 { + width: 100px + } + + .wd-lg-100p { + width: 100% + } + + .mx-wd-lg-100p { + max-width: 100% + } + + .mn-wd-lg-100p { + min-width: 100% + } + + .wd-lg-100-f { + width: 100px !important + } + + .wd-lg-100p-f { + width: 100% !important + } + + .mx-wd-lg-100p-f { + max-width: 100% !important + } + + .mn-wd-lg-100p-f { + min-width: 100% !important + } + + .wd-lg-150 { + width: 150px + } + + .wd-lg-150p { + width: 150% + } + + .mx-wd-lg-150p { + max-width: 150% + } + + .mn-wd-lg-150p { + min-width: 150% + } + + .wd-lg-150-f { + width: 150px !important + } + + .wd-lg-150p-f { + width: 150% !important + } + + .mx-wd-lg-150p-f { + max-width: 150% !important + } + + .mn-wd-lg-150p-f { + min-width: 150% !important + } + + .wd-lg-200 { + width: 200px + } + + .wd-lg-200p { + width: 200% + } + + .mx-wd-lg-200p { + max-width: 200% + } + + .mn-wd-lg-200p { + min-width: 200% + } + + .wd-lg-200-f { + width: 200px !important + } + + .wd-lg-200p-f { + width: 200% !important + } + + .mx-wd-lg-200p-f { + max-width: 200% !important + } + + .mn-wd-lg-200p-f { + min-width: 200% !important + } + + .wd-lg-250 { + width: 250px + } + + .wd-lg-250p { + width: 250% + } + + .mx-wd-lg-250p { + max-width: 250% + } + + .mn-wd-lg-250p { + min-width: 250% + } + + .wd-lg-250-f { + width: 250px !important + } + + .wd-lg-250p-f { + width: 250% !important + } + + .mx-wd-lg-250p-f { + max-width: 250% !important + } + + .mn-wd-lg-250p-f { + min-width: 250% !important + } + + .wd-lg-300 { + width: 300px + } + + .wd-lg-300p { + width: 300% + } + + .mx-wd-lg-300p { + max-width: 300% + } + + .mn-wd-lg-300p { + min-width: 300% + } + + .wd-lg-300-f { + width: 300px !important + } + + .wd-lg-300p-f { + width: 300% !important + } + + .mx-wd-lg-300p-f { + max-width: 300% !important + } + + .mn-wd-lg-300p-f { + min-width: 300% !important + } + + .wd-lg-350 { + width: 350px + } + + .wd-lg-350p { + width: 350% + } + + .mx-wd-lg-350p { + max-width: 350% + } + + .mn-wd-lg-350p { + min-width: 350% + } + + .wd-lg-350-f { + width: 350px !important + } + + .wd-lg-350p-f { + width: 350% !important + } + + .mx-wd-lg-350p-f { + max-width: 350% !important + } + + .mn-wd-lg-350p-f { + min-width: 350% !important + } + + .wd-lg-400 { + width: 400px + } + + .wd-lg-400p { + width: 400% + } + + .mx-wd-lg-400p { + max-width: 400% + } + + .mn-wd-lg-400p { + min-width: 400% + } + + .wd-lg-400-f { + width: 400px !important + } + + .wd-lg-400p-f { + width: 400% !important + } + + .mx-wd-lg-400p-f { + max-width: 400% !important + } + + .mn-wd-lg-400p-f { + min-width: 400% !important + } + + .wd-lg-450 { + width: 450px + } + + .wd-lg-450p { + width: 450% + } + + .mx-wd-lg-450p { + max-width: 450% + } + + .mn-wd-lg-450p { + min-width: 450% + } + + .wd-lg-450-f { + width: 450px !important + } + + .wd-lg-450p-f { + width: 450% !important + } + + .mx-wd-lg-450p-f { + max-width: 450% !important + } + + .mn-wd-lg-450p-f { + min-width: 450% !important + } + + .wd-lg-500 { + width: 500px + } + + .wd-lg-500p { + width: 500% + } + + .mx-wd-lg-500p { + max-width: 500% + } + + .mn-wd-lg-500p { + min-width: 500% + } + + .wd-lg-500-f { + width: 500px !important + } + + .wd-lg-500p-f { + width: 500% !important + } + + .mx-wd-lg-500p-f { + max-width: 500% !important + } + + .mn-wd-lg-500p-f { + min-width: 500% !important + } + + .wd-lg-550 { + width: 550px + } + + .wd-lg-550p { + width: 550% + } + + .mx-wd-lg-550p { + max-width: 550% + } + + .mn-wd-lg-550p { + min-width: 550% + } + + .wd-lg-550-f { + width: 550px !important + } + + .wd-lg-550p-f { + width: 550% !important + } + + .mx-wd-lg-550p-f { + max-width: 550% !important + } + + .mn-wd-lg-550p-f { + min-width: 550% !important + } + + .wd-lg-600 { + width: 600px + } + + .wd-lg-600p { + width: 600% + } + + .mx-wd-lg-600p { + max-width: 600% + } + + .mn-wd-lg-600p { + min-width: 600% + } + + .wd-lg-600-f { + width: 600px !important + } + + .wd-lg-600p-f { + width: 600% !important + } + + .mx-wd-lg-600p-f { + max-width: 600% !important + } + + .mn-wd-lg-600p-f { + min-width: 600% !important + } + + .wd-lg-650 { + width: 650px + } + + .wd-lg-650p { + width: 650% + } + + .mx-wd-lg-650p { + max-width: 650% + } + + .mn-wd-lg-650p { + min-width: 650% + } + + .wd-lg-650-f { + width: 650px !important + } + + .wd-lg-650p-f { + width: 650% !important + } + + .mx-wd-lg-650p-f { + max-width: 650% !important + } + + .mn-wd-lg-650p-f { + min-width: 650% !important + } + + .wd-lg-700 { + width: 700px + } + + .wd-lg-700p { + width: 700% + } + + .mx-wd-lg-700p { + max-width: 700% + } + + .mn-wd-lg-700p { + min-width: 700% + } + + .wd-lg-700-f { + width: 700px !important + } + + .wd-lg-700p-f { + width: 700% !important + } + + .mx-wd-lg-700p-f { + max-width: 700% !important + } + + .mn-wd-lg-700p-f { + min-width: 700% !important + } + + .wd-lg-750 { + width: 750px + } + + .wd-lg-750p { + width: 750% + } + + .mx-wd-lg-750p { + max-width: 750% + } + + .mn-wd-lg-750p { + min-width: 750% + } + + .wd-lg-750-f { + width: 750px !important + } + + .wd-lg-750p-f { + width: 750% !important + } + + .mx-wd-lg-750p-f { + max-width: 750% !important + } + + .mn-wd-lg-750p-f { + min-width: 750% !important + } + + .wd-lg-800 { + width: 800px + } + + .wd-lg-800p { + width: 800% + } + + .mx-wd-lg-800p { + max-width: 800% + } + + .mn-wd-lg-800p { + min-width: 800% + } + + .wd-lg-800-f { + width: 800px !important + } + + .wd-lg-800p-f { + width: 800% !important + } + + .mx-wd-lg-800p-f { + max-width: 800% !important + } + + .mn-wd-lg-800p-f { + min-width: 800% !important + } + + .wd-lg-850 { + width: 850px + } + + .wd-lg-850p { + width: 850% + } + + .mx-wd-lg-850p { + max-width: 850% + } + + .mn-wd-lg-850p { + min-width: 850% + } + + .wd-lg-850-f { + width: 850px !important + } + + .wd-lg-850p-f { + width: 850% !important + } + + .mx-wd-lg-850p-f { + max-width: 850% !important + } + + .mn-wd-lg-850p-f { + min-width: 850% !important + } + + .wd-lg-900 { + width: 900px + } + + .wd-lg-900p { + width: 900% + } + + .mx-wd-lg-900p { + max-width: 900% + } + + .mn-wd-lg-900p { + min-width: 900% + } + + .wd-lg-900-f { + width: 900px !important + } + + .wd-lg-900p-f { + width: 900% !important + } + + .mx-wd-lg-900p-f { + max-width: 900% !important + } + + .mn-wd-lg-900p-f { + min-width: 900% !important + } + + .wd-lg-950 { + width: 950px + } + + .wd-lg-950p { + width: 950% + } + + .mx-wd-lg-950p { + max-width: 950% + } + + .mn-wd-lg-950p { + min-width: 950% + } + + .wd-lg-950-f { + width: 950px !important + } + + .wd-lg-950p-f { + width: 950% !important + } + + .mx-wd-lg-950p-f { + max-width: 950% !important + } + + .mn-wd-lg-950p-f { + min-width: 950% !important + } + + .wd-lg-1000 { + width: 1000px + } + + .wd-lg-1000p { + width: 1000% + } + + .mx-wd-lg-1000p { + max-width: 1000% + } + + .mn-wd-lg-1000p { + min-width: 1000% + } + + .wd-lg-1000-f { + width: 1000px !important + } + + .wd-lg-1000p-f { + width: 1000% !important + } + + .mx-wd-lg-1000p-f { + max-width: 1000% !important + } + + .mn-wd-lg-1000p-f { + min-width: 1000% !important + } + + .wd-lg-auto { + width: auto + } + + .wd-lg-auto-f { + width: auto !important + } +} + +@media (min-width: 1200px) { + .wd-xl-5 { + width: 5px + } + + .wd-xl-5p { + width: 5% + } + + .mx-wd-xl-5p { + max-width: 5% + } + + .mn-wd-xl-5p { + min-width: 5% + } + + .wd-xl-5-f { + width: 5px !important + } + + .wd-xl-5p-f { + width: 5% !important + } + + .mx-wd-xl-5p-f { + max-width: 5% !important + } + + .mn-wd-xl-5p-f { + min-width: 5% !important + } + + .wd-xl-10 { + width: 10px + } + + .wd-xl-10p { + width: 10% + } + + .mx-wd-xl-10p { + max-width: 10% + } + + .mn-wd-xl-10p { + min-width: 10% + } + + .wd-xl-10-f { + width: 10px !important + } + + .wd-xl-10p-f { + width: 10% !important + } + + .mx-wd-xl-10p-f { + max-width: 10% !important + } + + .mn-wd-xl-10p-f { + min-width: 10% !important + } + + .wd-xl-15 { + width: 15px + } + + .wd-xl-15p { + width: 15% + } + + .mx-wd-xl-15p { + max-width: 15% + } + + .mn-wd-xl-15p { + min-width: 15% + } + + .wd-xl-15-f { + width: 15px !important + } + + .wd-xl-15p-f { + width: 15% !important + } + + .mx-wd-xl-15p-f { + max-width: 15% !important + } + + .mn-wd-xl-15p-f { + min-width: 15% !important + } + + .wd-xl-20 { + width: 20px + } + + .wd-xl-20p { + width: 20% + } + + .mx-wd-xl-20p { + max-width: 20% + } + + .mn-wd-xl-20p { + min-width: 20% + } + + .wd-xl-20-f { + width: 20px !important + } + + .wd-xl-20p-f { + width: 20% !important + } + + .mx-wd-xl-20p-f { + max-width: 20% !important + } + + .mn-wd-xl-20p-f { + min-width: 20% !important + } + + .wd-xl-25 { + width: 25px + } + + .wd-xl-25p { + width: 25% + } + + .mx-wd-xl-25p { + max-width: 25% + } + + .mn-wd-xl-25p { + min-width: 25% + } + + .wd-xl-25-f { + width: 25px !important + } + + .wd-xl-25p-f { + width: 25% !important + } + + .mx-wd-xl-25p-f { + max-width: 25% !important + } + + .mn-wd-xl-25p-f { + min-width: 25% !important + } + + .wd-xl-30 { + width: 30px + } + + .wd-xl-30p { + width: 30% + } + + .mx-wd-xl-30p { + max-width: 30% + } + + .mn-wd-xl-30p { + min-width: 30% + } + + .wd-xl-30-f { + width: 30px !important + } + + .wd-xl-30p-f { + width: 30% !important + } + + .mx-wd-xl-30p-f { + max-width: 30% !important + } + + .mn-wd-xl-30p-f { + min-width: 30% !important + } + + .wd-xl-35 { + width: 35px + } + + .wd-xl-35p { + width: 35% + } + + .mx-wd-xl-35p { + max-width: 35% + } + + .mn-wd-xl-35p { + min-width: 35% + } + + .wd-xl-35-f { + width: 35px !important + } + + .wd-xl-35p-f { + width: 35% !important + } + + .mx-wd-xl-35p-f { + max-width: 35% !important + } + + .mn-wd-xl-35p-f { + min-width: 35% !important + } + + .wd-xl-40 { + width: 40px + } + + .wd-xl-40p { + width: 40% + } + + .mx-wd-xl-40p { + max-width: 40% + } + + .mn-wd-xl-40p { + min-width: 40% + } + + .wd-xl-40-f { + width: 40px !important + } + + .wd-xl-40p-f { + width: 40% !important + } + + .mx-wd-xl-40p-f { + max-width: 40% !important + } + + .mn-wd-xl-40p-f { + min-width: 40% !important + } + + .wd-xl-45 { + width: 45px + } + + .wd-xl-45p { + width: 45% + } + + .mx-wd-xl-45p { + max-width: 45% + } + + .mn-wd-xl-45p { + min-width: 45% + } + + .wd-xl-45-f { + width: 45px !important + } + + .wd-xl-45p-f { + width: 45% !important + } + + .mx-wd-xl-45p-f { + max-width: 45% !important + } + + .mn-wd-xl-45p-f { + min-width: 45% !important + } + + .wd-xl-50 { + width: 50px + } + + .wd-xl-50p { + width: 50% + } + + .mx-wd-xl-50p { + max-width: 50% + } + + .mn-wd-xl-50p { + min-width: 50% + } + + .wd-xl-50-f { + width: 50px !important + } + + .wd-xl-50p-f { + width: 50% !important + } + + .mx-wd-xl-50p-f { + max-width: 50% !important + } + + .mn-wd-xl-50p-f { + min-width: 50% !important + } + + .wd-xl-55 { + width: 55px + } + + .wd-xl-55p { + width: 55% + } + + .mx-wd-xl-55p { + max-width: 55% + } + + .mn-wd-xl-55p { + min-width: 55% + } + + .wd-xl-55-f { + width: 55px !important + } + + .wd-xl-55p-f { + width: 55% !important + } + + .mx-wd-xl-55p-f { + max-width: 55% !important + } + + .mn-wd-xl-55p-f { + min-width: 55% !important + } + + .wd-xl-60 { + width: 60px + } + + .wd-xl-60p { + width: 60% + } + + .mx-wd-xl-60p { + max-width: 60% + } + + .mn-wd-xl-60p { + min-width: 60% + } + + .wd-xl-60-f { + width: 60px !important + } + + .wd-xl-60p-f { + width: 60% !important + } + + .mx-wd-xl-60p-f { + max-width: 60% !important + } + + .mn-wd-xl-60p-f { + min-width: 60% !important + } + + .wd-xl-65 { + width: 65px + } + + .wd-xl-65p { + width: 65% + } + + .mx-wd-xl-65p { + max-width: 65% + } + + .mn-wd-xl-65p { + min-width: 65% + } + + .wd-xl-65-f { + width: 65px !important + } + + .wd-xl-65p-f { + width: 65% !important + } + + .mx-wd-xl-65p-f { + max-width: 65% !important + } + + .mn-wd-xl-65p-f { + min-width: 65% !important + } + + .wd-xl-70 { + width: 70px + } + + .wd-xl-70p { + width: 70% + } + + .mx-wd-xl-70p { + max-width: 70% + } + + .mn-wd-xl-70p { + min-width: 70% + } + + .wd-xl-70-f { + width: 70px !important + } + + .wd-xl-70p-f { + width: 70% !important + } + + .mx-wd-xl-70p-f { + max-width: 70% !important + } + + .mn-wd-xl-70p-f { + min-width: 70% !important + } + + .wd-xl-75 { + width: 75px + } + + .wd-xl-75p { + width: 75% + } + + .mx-wd-xl-75p { + max-width: 75% + } + + .mn-wd-xl-75p { + min-width: 75% + } + + .wd-xl-75-f { + width: 75px !important + } + + .wd-xl-75p-f { + width: 75% !important + } + + .mx-wd-xl-75p-f { + max-width: 75% !important + } + + .mn-wd-xl-75p-f { + min-width: 75% !important + } + + .wd-xl-80 { + width: 80px + } + + .wd-xl-80p { + width: 80% + } + + .mx-wd-xl-80p { + max-width: 80% + } + + .mn-wd-xl-80p { + min-width: 80% + } + + .wd-xl-80-f { + width: 80px !important + } + + .wd-xl-80p-f { + width: 80% !important + } + + .mx-wd-xl-80p-f { + max-width: 80% !important + } + + .mn-wd-xl-80p-f { + min-width: 80% !important + } + + .wd-xl-85 { + width: 85px + } + + .wd-xl-85p { + width: 85% + } + + .mx-wd-xl-85p { + max-width: 85% + } + + .mn-wd-xl-85p { + min-width: 85% + } + + .wd-xl-85-f { + width: 85px !important + } + + .wd-xl-85p-f { + width: 85% !important + } + + .mx-wd-xl-85p-f { + max-width: 85% !important + } + + .mn-wd-xl-85p-f { + min-width: 85% !important + } + + .wd-xl-90 { + width: 90px + } + + .wd-xl-90p { + width: 90% + } + + .mx-wd-xl-90p { + max-width: 90% + } + + .mn-wd-xl-90p { + min-width: 90% + } + + .wd-xl-90-f { + width: 90px !important + } + + .wd-xl-90p-f { + width: 90% !important + } + + .mx-wd-xl-90p-f { + max-width: 90% !important + } + + .mn-wd-xl-90p-f { + min-width: 90% !important + } + + .wd-xl-95 { + width: 95px + } + + .wd-xl-95p { + width: 95% + } + + .mx-wd-xl-95p { + max-width: 95% + } + + .mn-wd-xl-95p { + min-width: 95% + } + + .wd-xl-95-f { + width: 95px !important + } + + .wd-xl-95p-f { + width: 95% !important + } + + .mx-wd-xl-95p-f { + max-width: 95% !important + } + + .mn-wd-xl-95p-f { + min-width: 95% !important + } + + .wd-xl-100 { + width: 100px + } + + .wd-xl-100p { + width: 100% + } + + .mx-wd-xl-100p { + max-width: 100% + } + + .mn-wd-xl-100p { + min-width: 100% + } + + .wd-xl-100-f { + width: 100px !important + } + + .wd-xl-100p-f { + width: 100% !important + } + + .mx-wd-xl-100p-f { + max-width: 100% !important + } + + .mn-wd-xl-100p-f { + min-width: 100% !important + } + + .wd-xl-150 { + width: 150px + } + + .wd-xl-150p { + width: 150% + } + + .mx-wd-xl-150p { + max-width: 150% + } + + .mn-wd-xl-150p { + min-width: 150% + } + + .wd-xl-150-f { + width: 150px !important + } + + .wd-xl-150p-f { + width: 150% !important + } + + .mx-wd-xl-150p-f { + max-width: 150% !important + } + + .mn-wd-xl-150p-f { + min-width: 150% !important + } + + .wd-xl-200 { + width: 200px + } + + .wd-xl-200p { + width: 200% + } + + .mx-wd-xl-200p { + max-width: 200% + } + + .mn-wd-xl-200p { + min-width: 200% + } + + .wd-xl-200-f { + width: 200px !important + } + + .wd-xl-200p-f { + width: 200% !important + } + + .mx-wd-xl-200p-f { + max-width: 200% !important + } + + .mn-wd-xl-200p-f { + min-width: 200% !important + } + + .wd-xl-250 { + width: 250px + } + + .wd-xl-250p { + width: 250% + } + + .mx-wd-xl-250p { + max-width: 250% + } + + .mn-wd-xl-250p { + min-width: 250% + } + + .wd-xl-250-f { + width: 250px !important + } + + .wd-xl-250p-f { + width: 250% !important + } + + .mx-wd-xl-250p-f { + max-width: 250% !important + } + + .mn-wd-xl-250p-f { + min-width: 250% !important + } + + .wd-xl-300 { + width: 300px + } + + .wd-xl-300p { + width: 300% + } + + .mx-wd-xl-300p { + max-width: 300% + } + + .mn-wd-xl-300p { + min-width: 300% + } + + .wd-xl-300-f { + width: 300px !important + } + + .wd-xl-300p-f { + width: 300% !important + } + + .mx-wd-xl-300p-f { + max-width: 300% !important + } + + .mn-wd-xl-300p-f { + min-width: 300% !important + } + + .wd-xl-350 { + width: 350px + } + + .wd-xl-350p { + width: 350% + } + + .mx-wd-xl-350p { + max-width: 350% + } + + .mn-wd-xl-350p { + min-width: 350% + } + + .wd-xl-350-f { + width: 350px !important + } + + .wd-xl-350p-f { + width: 350% !important + } + + .mx-wd-xl-350p-f { + max-width: 350% !important + } + + .mn-wd-xl-350p-f { + min-width: 350% !important + } + + .wd-xl-400 { + width: 400px + } + + .wd-xl-400p { + width: 400% + } + + .mx-wd-xl-400p { + max-width: 400% + } + + .mn-wd-xl-400p { + min-width: 400% + } + + .wd-xl-400-f { + width: 400px !important + } + + .wd-xl-400p-f { + width: 400% !important + } + + .mx-wd-xl-400p-f { + max-width: 400% !important + } + + .mn-wd-xl-400p-f { + min-width: 400% !important + } + + .wd-xl-450 { + width: 450px + } + + .wd-xl-450p { + width: 450% + } + + .mx-wd-xl-450p { + max-width: 450% + } + + .mn-wd-xl-450p { + min-width: 450% + } + + .wd-xl-450-f { + width: 450px !important + } + + .wd-xl-450p-f { + width: 450% !important + } + + .mx-wd-xl-450p-f { + max-width: 450% !important + } + + .mn-wd-xl-450p-f { + min-width: 450% !important + } + + .wd-xl-500 { + width: 500px + } + + .wd-xl-500p { + width: 500% + } + + .mx-wd-xl-500p { + max-width: 500% + } + + .mn-wd-xl-500p { + min-width: 500% + } + + .wd-xl-500-f { + width: 500px !important + } + + .wd-xl-500p-f { + width: 500% !important + } + + .mx-wd-xl-500p-f { + max-width: 500% !important + } + + .mn-wd-xl-500p-f { + min-width: 500% !important + } + + .wd-xl-550 { + width: 550px + } + + .wd-xl-550p { + width: 550% + } + + .mx-wd-xl-550p { + max-width: 550% + } + + .mn-wd-xl-550p { + min-width: 550% + } + + .wd-xl-550-f { + width: 550px !important + } + + .wd-xl-550p-f { + width: 550% !important + } + + .mx-wd-xl-550p-f { + max-width: 550% !important + } + + .mn-wd-xl-550p-f { + min-width: 550% !important + } + + .wd-xl-600 { + width: 600px + } + + .wd-xl-600p { + width: 600% + } + + .mx-wd-xl-600p { + max-width: 600% + } + + .mn-wd-xl-600p { + min-width: 600% + } + + .wd-xl-600-f { + width: 600px !important + } + + .wd-xl-600p-f { + width: 600% !important + } + + .mx-wd-xl-600p-f { + max-width: 600% !important + } + + .mn-wd-xl-600p-f { + min-width: 600% !important + } + + .wd-xl-650 { + width: 650px + } + + .wd-xl-650p { + width: 650% + } + + .mx-wd-xl-650p { + max-width: 650% + } + + .mn-wd-xl-650p { + min-width: 650% + } + + .wd-xl-650-f { + width: 650px !important + } + + .wd-xl-650p-f { + width: 650% !important + } + + .mx-wd-xl-650p-f { + max-width: 650% !important + } + + .mn-wd-xl-650p-f { + min-width: 650% !important + } + + .wd-xl-700 { + width: 700px + } + + .wd-xl-700p { + width: 700% + } + + .mx-wd-xl-700p { + max-width: 700% + } + + .mn-wd-xl-700p { + min-width: 700% + } + + .wd-xl-700-f { + width: 700px !important + } + + .wd-xl-700p-f { + width: 700% !important + } + + .mx-wd-xl-700p-f { + max-width: 700% !important + } + + .mn-wd-xl-700p-f { + min-width: 700% !important + } + + .wd-xl-750 { + width: 750px + } + + .wd-xl-750p { + width: 750% + } + + .mx-wd-xl-750p { + max-width: 750% + } + + .mn-wd-xl-750p { + min-width: 750% + } + + .wd-xl-750-f { + width: 750px !important + } + + .wd-xl-750p-f { + width: 750% !important + } + + .mx-wd-xl-750p-f { + max-width: 750% !important + } + + .mn-wd-xl-750p-f { + min-width: 750% !important + } + + .wd-xl-800 { + width: 800px + } + + .wd-xl-800p { + width: 800% + } + + .mx-wd-xl-800p { + max-width: 800% + } + + .mn-wd-xl-800p { + min-width: 800% + } + + .wd-xl-800-f { + width: 800px !important + } + + .wd-xl-800p-f { + width: 800% !important + } + + .mx-wd-xl-800p-f { + max-width: 800% !important + } + + .mn-wd-xl-800p-f { + min-width: 800% !important + } + + .wd-xl-850 { + width: 850px + } + + .wd-xl-850p { + width: 850% + } + + .mx-wd-xl-850p { + max-width: 850% + } + + .mn-wd-xl-850p { + min-width: 850% + } + + .wd-xl-850-f { + width: 850px !important + } + + .wd-xl-850p-f { + width: 850% !important + } + + .mx-wd-xl-850p-f { + max-width: 850% !important + } + + .mn-wd-xl-850p-f { + min-width: 850% !important + } + + .wd-xl-900 { + width: 900px + } + + .wd-xl-900p { + width: 900% + } + + .mx-wd-xl-900p { + max-width: 900% + } + + .mn-wd-xl-900p { + min-width: 900% + } + + .wd-xl-900-f { + width: 900px !important + } + + .wd-xl-900p-f { + width: 900% !important + } + + .mx-wd-xl-900p-f { + max-width: 900% !important + } + + .mn-wd-xl-900p-f { + min-width: 900% !important + } + + .wd-xl-950 { + width: 950px + } + + .wd-xl-950p { + width: 950% + } + + .mx-wd-xl-950p { + max-width: 950% + } + + .mn-wd-xl-950p { + min-width: 950% + } + + .wd-xl-950-f { + width: 950px !important + } + + .wd-xl-950p-f { + width: 950% !important + } + + .mx-wd-xl-950p-f { + max-width: 950% !important + } + + .mn-wd-xl-950p-f { + min-width: 950% !important + } + + .wd-xl-1000 { + width: 1000px + } + + .wd-xl-1000p { + width: 1000% + } + + .mx-wd-xl-1000p { + max-width: 1000% + } + + .mn-wd-xl-1000p { + min-width: 1000% + } + + .wd-xl-1000-f { + width: 1000px !important + } + + .wd-xl-1000p-f { + width: 1000% !important + } + + .mx-wd-xl-1000p-f { + max-width: 1000% !important + } + + .mn-wd-xl-1000p-f { + min-width: 1000% !important + } + + .wd-xl-auto { + width: auto; + width: auto !important + } +} + +@media (min-width: 1400px) { + .wd-xxl-5 { + width: 5px + } + + .wd-xxl-5p { + width: 5% + } + + .mx-wd-xxl-5p { + max-width: 5% + } + + .mn-wd-xxl-5p { + min-width: 5% + } + + .wd-xxl-5-f { + width: 5px !important + } + + .wd-xxl-5p-f { + width: 5% !important + } + + .mx-wd-xxl-5p-f { + max-width: 5% !important + } + + .mn-wd-xxl-5p-f { + min-width: 5% !important + } + + .wd-xxl-10 { + width: 10px + } + + .wd-xxl-10p { + width: 10% + } + + .mx-wd-xxl-10p { + max-width: 10% + } + + .mn-wd-xxl-10p { + min-width: 10% + } + + .wd-xxl-10-f { + width: 10px !important + } + + .wd-xxl-10p-f { + width: 10% !important + } + + .mx-wd-xxl-10p-f { + max-width: 10% !important + } + + .mn-wd-xxl-10p-f { + min-width: 10% !important + } + + .wd-xxl-15 { + width: 15px + } + + .wd-xxl-15p { + width: 15% + } + + .mx-wd-xxl-15p { + max-width: 15% + } + + .mn-wd-xxl-15p { + min-width: 15% + } + + .wd-xxl-15-f { + width: 15px !important + } + + .wd-xxl-15p-f { + width: 15% !important + } + + .mx-wd-xxl-15p-f { + max-width: 15% !important + } + + .mn-wd-xxl-15p-f { + min-width: 15% !important + } + + .wd-xxl-20 { + width: 20px + } + + .wd-xxl-20p { + width: 20% + } + + .mx-wd-xxl-20p { + max-width: 20% + } + + .mn-wd-xxl-20p { + min-width: 20% + } + + .wd-xxl-20-f { + width: 20px !important + } + + .wd-xxl-20p-f { + width: 20% !important + } + + .mx-wd-xxl-20p-f { + max-width: 20% !important + } + + .mn-wd-xxl-20p-f { + min-width: 20% !important + } + + .wd-xxl-25 { + width: 25px + } + + .wd-xxl-25p { + width: 25% + } + + .mx-wd-xxl-25p { + max-width: 25% + } + + .mn-wd-xxl-25p { + min-width: 25% + } + + .wd-xxl-25-f { + width: 25px !important + } + + .wd-xxl-25p-f { + width: 25% !important + } + + .mx-wd-xxl-25p-f { + max-width: 25% !important + } + + .mn-wd-xxl-25p-f { + min-width: 25% !important + } + + .wd-xxl-30 { + width: 30px + } + + .wd-xxl-30p { + width: 30% + } + + .mx-wd-xxl-30p { + max-width: 30% + } + + .mn-wd-xxl-30p { + min-width: 30% + } + + .wd-xxl-30-f { + width: 30px !important + } + + .wd-xxl-30p-f { + width: 30% !important + } + + .mx-wd-xxl-30p-f { + max-width: 30% !important + } + + .mn-wd-xxl-30p-f { + min-width: 30% !important + } + + .wd-xxl-35 { + width: 35px + } + + .wd-xxl-35p { + width: 35% + } + + .mx-wd-xxl-35p { + max-width: 35% + } + + .mn-wd-xxl-35p { + min-width: 35% + } + + .wd-xxl-35-f { + width: 35px !important + } + + .wd-xxl-35p-f { + width: 35% !important + } + + .mx-wd-xxl-35p-f { + max-width: 35% !important + } + + .mn-wd-xxl-35p-f { + min-width: 35% !important + } + + .wd-xxl-40 { + width: 40px + } + + .wd-xxl-40p { + width: 40% + } + + .mx-wd-xxl-40p { + max-width: 40% + } + + .mn-wd-xxl-40p { + min-width: 40% + } + + .wd-xxl-40-f { + width: 40px !important + } + + .wd-xxl-40p-f { + width: 40% !important + } + + .mx-wd-xxl-40p-f { + max-width: 40% !important + } + + .mn-wd-xxl-40p-f { + min-width: 40% !important + } + + .wd-xxl-45 { + width: 45px + } + + .wd-xxl-45p { + width: 45% + } + + .mx-wd-xxl-45p { + max-width: 45% + } + + .mn-wd-xxl-45p { + min-width: 45% + } + + .wd-xxl-45-f { + width: 45px !important + } + + .wd-xxl-45p-f { + width: 45% !important + } + + .mx-wd-xxl-45p-f { + max-width: 45% !important + } + + .mn-wd-xxl-45p-f { + min-width: 45% !important + } + + .wd-xxl-50 { + width: 50px + } + + .wd-xxl-50p { + width: 50% + } + + .mx-wd-xxl-50p { + max-width: 50% + } + + .mn-wd-xxl-50p { + min-width: 50% + } + + .wd-xxl-50-f { + width: 50px !important + } + + .wd-xxl-50p-f { + width: 50% !important + } + + .mx-wd-xxl-50p-f { + max-width: 50% !important + } + + .mn-wd-xxl-50p-f { + min-width: 50% !important + } + + .wd-xxl-55 { + width: 55px + } + + .wd-xxl-55p { + width: 55% + } + + .mx-wd-xxl-55p { + max-width: 55% + } + + .mn-wd-xxl-55p { + min-width: 55% + } + + .wd-xxl-55-f { + width: 55px !important + } + + .wd-xxl-55p-f { + width: 55% !important + } + + .mx-wd-xxl-55p-f { + max-width: 55% !important + } + + .mn-wd-xxl-55p-f { + min-width: 55% !important + } + + .wd-xxl-60 { + width: 60px + } + + .wd-xxl-60p { + width: 60% + } + + .mx-wd-xxl-60p { + max-width: 60% + } + + .mn-wd-xxl-60p { + min-width: 60% + } + + .wd-xxl-60-f { + width: 60px !important + } + + .wd-xxl-60p-f { + width: 60% !important + } + + .mx-wd-xxl-60p-f { + max-width: 60% !important + } + + .mn-wd-xxl-60p-f { + min-width: 60% !important + } + + .wd-xxl-65 { + width: 65px + } + + .wd-xxl-65p { + width: 65% + } + + .mx-wd-xxl-65p { + max-width: 65% + } + + .mn-wd-xxl-65p { + min-width: 65% + } + + .wd-xxl-65-f { + width: 65px !important + } + + .wd-xxl-65p-f { + width: 65% !important + } + + .mx-wd-xxl-65p-f { + max-width: 65% !important + } + + .mn-wd-xxl-65p-f { + min-width: 65% !important + } + + .wd-xxl-70 { + width: 70px + } + + .wd-xxl-70p { + width: 70% + } + + .mx-wd-xxl-70p { + max-width: 70% + } + + .mn-wd-xxl-70p { + min-width: 70% + } + + .wd-xxl-70-f { + width: 70px !important + } + + .wd-xxl-70p-f { + width: 70% !important + } + + .mx-wd-xxl-70p-f { + max-width: 70% !important + } + + .mn-wd-xxl-70p-f { + min-width: 70% !important + } + + .wd-xxl-75 { + width: 75px + } + + .wd-xxl-75p { + width: 75% + } + + .mx-wd-xxl-75p { + max-width: 75% + } + + .mn-wd-xxl-75p { + min-width: 75% + } + + .wd-xxl-75-f { + width: 75px !important + } + + .wd-xxl-75p-f { + width: 75% !important + } + + .mx-wd-xxl-75p-f { + max-width: 75% !important + } + + .mn-wd-xxl-75p-f { + min-width: 75% !important + } + + .wd-xxl-80 { + width: 80px + } + + .wd-xxl-80p { + width: 80% + } + + .mx-wd-xxl-80p { + max-width: 80% + } + + .mn-wd-xxl-80p { + min-width: 80% + } + + .wd-xxl-80-f { + width: 80px !important + } + + .wd-xxl-80p-f { + width: 80% !important + } + + .mx-wd-xxl-80p-f { + max-width: 80% !important + } + + .mn-wd-xxl-80p-f { + min-width: 80% !important + } + + .wd-xxl-85 { + width: 85px + } + + .wd-xxl-85p { + width: 85% + } + + .mx-wd-xxl-85p { + max-width: 85% + } + + .mn-wd-xxl-85p { + min-width: 85% + } + + .wd-xxl-85-f { + width: 85px !important + } + + .wd-xxl-85p-f { + width: 85% !important + } + + .mx-wd-xxl-85p-f { + max-width: 85% !important + } + + .mn-wd-xxl-85p-f { + min-width: 85% !important + } + + .wd-xxl-90 { + width: 90px + } + + .wd-xxl-90p { + width: 90% + } + + .mx-wd-xxl-90p { + max-width: 90% + } + + .mn-wd-xxl-90p { + min-width: 90% + } + + .wd-xxl-90-f { + width: 90px !important + } + + .wd-xxl-90p-f { + width: 90% !important + } + + .mx-wd-xxl-90p-f { + max-width: 90% !important + } + + .mn-wd-xxl-90p-f { + min-width: 90% !important + } + + .wd-xxl-95 { + width: 95px + } + + .wd-xxl-95p { + width: 95% + } + + .mx-wd-xxl-95p { + max-width: 95% + } + + .mn-wd-xxl-95p { + min-width: 95% + } + + .wd-xxl-95-f { + width: 95px !important + } + + .wd-xxl-95p-f { + width: 95% !important + } + + .mx-wd-xxl-95p-f { + max-width: 95% !important + } + + .mn-wd-xxl-95p-f { + min-width: 95% !important + } + + .wd-xxl-100 { + width: 100px + } + + .wd-xxl-100p { + width: 100% + } + + .mx-wd-xxl-100p { + max-width: 100% + } + + .mn-wd-xxl-100p { + min-width: 100% + } + + .wd-xxl-100-f { + width: 100px !important + } + + .wd-xxl-100p-f { + width: 100% !important + } + + .mx-wd-xxl-100p-f { + max-width: 100% !important + } + + .mn-wd-xxl-100p-f { + min-width: 100% !important + } + + .wd-xxl-150 { + width: 150px + } + + .wd-xxl-150p { + width: 150% + } + + .mx-wd-xxl-150p { + max-width: 150% + } + + .mn-wd-xxl-150p { + min-width: 150% + } + + .wd-xxl-150-f { + width: 150px !important + } + + .wd-xxl-150p-f { + width: 150% !important + } + + .mx-wd-xxl-150p-f { + max-width: 150% !important + } + + .mn-wd-xxl-150p-f { + min-width: 150% !important + } + + .wd-xxl-200 { + width: 200px + } + + .wd-xxl-200p { + width: 200% + } + + .mx-wd-xxl-200p { + max-width: 200% + } + + .mn-wd-xxl-200p { + min-width: 200% + } + + .wd-xxl-200-f { + width: 200px !important + } + + .wd-xxl-200p-f { + width: 200% !important + } + + .mx-wd-xxl-200p-f { + max-width: 200% !important + } + + .mn-wd-xxl-200p-f { + min-width: 200% !important + } + + .wd-xxl-250 { + width: 250px + } + + .wd-xxl-250p { + width: 250% + } + + .mx-wd-xxl-250p { + max-width: 250% + } + + .mn-wd-xxl-250p { + min-width: 250% + } + + .wd-xxl-250-f { + width: 250px !important + } + + .wd-xxl-250p-f { + width: 250% !important + } + + .mx-wd-xxl-250p-f { + max-width: 250% !important + } + + .mn-wd-xxl-250p-f { + min-width: 250% !important + } + + .wd-xxl-300 { + width: 300px + } + + .wd-xxl-300p { + width: 300% + } + + .mx-wd-xxl-300p { + max-width: 300% + } + + .mn-wd-xxl-300p { + min-width: 300% + } + + .wd-xxl-300-f { + width: 300px !important + } + + .wd-xxl-300p-f { + width: 300% !important + } + + .mx-wd-xxl-300p-f { + max-width: 300% !important + } + + .mn-wd-xxl-300p-f { + min-width: 300% !important + } + + .wd-xxl-350 { + width: 350px + } + + .wd-xxl-350p { + width: 350% + } + + .mx-wd-xxl-350p { + max-width: 350% + } + + .mn-wd-xxl-350p { + min-width: 350% + } + + .wd-xxl-350-f { + width: 350px !important + } + + .wd-xxl-350p-f { + width: 350% !important + } + + .mx-wd-xxl-350p-f { + max-width: 350% !important + } + + .mn-wd-xxl-350p-f { + min-width: 350% !important + } + + .wd-xxl-400 { + width: 400px + } + + .wd-xxl-400p { + width: 400% + } + + .mx-wd-xxl-400p { + max-width: 400% + } + + .mn-wd-xxl-400p { + min-width: 400% + } + + .wd-xxl-400-f { + width: 400px !important + } + + .wd-xxl-400p-f { + width: 400% !important + } + + .mx-wd-xxl-400p-f { + max-width: 400% !important + } + + .mn-wd-xxl-400p-f { + min-width: 400% !important + } + + .wd-xxl-450 { + width: 450px + } + + .wd-xxl-450p { + width: 450% + } + + .mx-wd-xxl-450p { + max-width: 450% + } + + .mn-wd-xxl-450p { + min-width: 450% + } + + .wd-xxl-450-f { + width: 450px !important + } + + .wd-xxl-450p-f { + width: 450% !important + } + + .mx-wd-xxl-450p-f { + max-width: 450% !important + } + + .mn-wd-xxl-450p-f { + min-width: 450% !important + } + + .wd-xxl-500 { + width: 500px + } + + .wd-xxl-500p { + width: 500% + } + + .mx-wd-xxl-500p { + max-width: 500% + } + + .mn-wd-xxl-500p { + min-width: 500% + } + + .wd-xxl-500-f { + width: 500px !important + } + + .wd-xxl-500p-f { + width: 500% !important + } + + .mx-wd-xxl-500p-f { + max-width: 500% !important + } + + .mn-wd-xxl-500p-f { + min-width: 500% !important + } + + .wd-xxl-550 { + width: 550px + } + + .wd-xxl-550p { + width: 550% + } + + .mx-wd-xxl-550p { + max-width: 550% + } + + .mn-wd-xxl-550p { + min-width: 550% + } + + .wd-xxl-550-f { + width: 550px !important + } + + .wd-xxl-550p-f { + width: 550% !important + } + + .mx-wd-xxl-550p-f { + max-width: 550% !important + } + + .mn-wd-xxl-550p-f { + min-width: 550% !important + } + + .wd-xxl-600 { + width: 600px + } + + .wd-xxl-600p { + width: 600% + } + + .mx-wd-xxl-600p { + max-width: 600% + } + + .mn-wd-xxl-600p { + min-width: 600% + } + + .wd-xxl-600-f { + width: 600px !important + } + + .wd-xxl-600p-f { + width: 600% !important + } + + .mx-wd-xxl-600p-f { + max-width: 600% !important + } + + .mn-wd-xxl-600p-f { + min-width: 600% !important + } + + .wd-xxl-650 { + width: 650px + } + + .wd-xxl-650p { + width: 650% + } + + .mx-wd-xxl-650p { + max-width: 650% + } + + .mn-wd-xxl-650p { + min-width: 650% + } + + .wd-xxl-650-f { + width: 650px !important + } + + .wd-xxl-650p-f { + width: 650% !important + } + + .mx-wd-xxl-650p-f { + max-width: 650% !important + } + + .mn-wd-xxl-650p-f { + min-width: 650% !important + } + + .wd-xxl-700 { + width: 700px + } + + .wd-xxl-700p { + width: 700% + } + + .mx-wd-xxl-700p { + max-width: 700% + } + + .mn-wd-xxl-700p { + min-width: 700% + } + + .wd-xxl-700-f { + width: 700px !important + } + + .wd-xxl-700p-f { + width: 700% !important + } + + .mx-wd-xxl-700p-f { + max-width: 700% !important + } + + .mn-wd-xxl-700p-f { + min-width: 700% !important + } + + .wd-xxl-750 { + width: 750px + } + + .wd-xxl-750p { + width: 750% + } + + .mx-wd-xxl-750p { + max-width: 750% + } + + .mn-wd-xxl-750p { + min-width: 750% + } + + .wd-xxl-750-f { + width: 750px !important + } + + .wd-xxl-750p-f { + width: 750% !important + } + + .mx-wd-xxl-750p-f { + max-width: 750% !important + } + + .mn-wd-xxl-750p-f { + min-width: 750% !important + } + + .wd-xxl-800 { + width: 800px + } + + .wd-xxl-800p { + width: 800% + } + + .mx-wd-xxl-800p { + max-width: 800% + } + + .mn-wd-xxl-800p { + min-width: 800% + } + + .wd-xxl-800-f { + width: 800px !important + } + + .wd-xxl-800p-f { + width: 800% !important + } + + .mx-wd-xxl-800p-f { + max-width: 800% !important + } + + .mn-wd-xxl-800p-f { + min-width: 800% !important + } + + .wd-xxl-850 { + width: 850px + } + + .wd-xxl-850p { + width: 850% + } + + .mx-wd-xxl-850p { + max-width: 850% + } + + .mn-wd-xxl-850p { + min-width: 850% + } + + .wd-xxl-850-f { + width: 850px !important + } + + .wd-xxl-850p-f { + width: 850% !important + } + + .mx-wd-xxl-850p-f { + max-width: 850% !important + } + + .mn-wd-xxl-850p-f { + min-width: 850% !important + } + + .wd-xxl-900 { + width: 900px + } + + .wd-xxl-900p { + width: 900% + } + + .mx-wd-xxl-900p { + max-width: 900% + } + + .mn-wd-xxl-900p { + min-width: 900% + } + + .wd-xxl-900-f { + width: 900px !important + } + + .wd-xxl-900p-f { + width: 900% !important + } + + .mx-wd-xxl-900p-f { + max-width: 900% !important + } + + .mn-wd-xxl-900p-f { + min-width: 900% !important + } + + .wd-xxl-950 { + width: 950px + } + + .wd-xxl-950p { + width: 950% + } + + .mx-wd-xxl-950p { + max-width: 950% + } + + .mn-wd-xxl-950p { + min-width: 950% + } + + .wd-xxl-950-f { + width: 950px !important + } + + .wd-xxl-950p-f { + width: 950% !important + } + + .mx-wd-xxl-950p-f { + max-width: 950% !important + } + + .mn-wd-xxl-950p-f { + min-width: 950% !important + } + + .wd-xxl-1000 { + width: 1000px + } + + .wd-xxl-1000p { + width: 1000% + } + + .mx-wd-xxl-1000p { + max-width: 1000% + } + + .mn-wd-xxl-1000p { + min-width: 1000% + } + + .wd-xxl-1000-f { + width: 1000px !important + } + + .wd-xxl-1000p-f { + width: 1000% !important + } + + .mx-wd-xxl-1000p-f { + max-width: 1000% !important + } + + .mn-wd-xxl-1000p-f { + min-width: 1000% !important + } + + .wd-xxl-auto { + width: auto; + width: auto !important + } +} + +.bg-facebook { + background: social-color("facebook") +} + +.bg-twitter { + background: social-color("twitter") +} + +.bg-google { + background: social-color("google") +} + +.bg-youtube { + background: social-color("youtube") +} + +.bg-vimeo { + background: social-color("vimeo") +} + +.bg-dribbble { + background: social-color("dribbble") +} + +.bg-github { + background: social-color("github") +} + +.bg-instagram { + background: social-color("instagram") +} + +.bg-pinterest { + background: social-color("pinterest") +} + +.bg-flickr { + background: social-color("flickr") +} + +.bg-bitbucket { + background: social-color("bitbucket") +} + +.bg-linkedin { + background: social-color("linkedin") +} + +body { + margin: 0; + padding: 0 +} + +.btn, .btn-group.open .dropdown-toggle, .btn:active, .btn:focus, .btn:hover, .btn:visited, .swal2-popup .swal2-actions button, .wizard > .actions a, .wizard > .actions a:active, .wizard > .actions a:hover, a, a:active, a:checked, a:focus, a:hover, a:visited, body, button, button:active, button:hover, button:visited, div, div.fc .fc-button-primary, div.tox .tox-button, input, input:active, input:focus, input:hover, input:visited, select, select:active, select:focus, select:visited, textarea, textarea:active, textarea:focus, textarea:visited { + box-shadow: none +} + +.form-check-input, select { + -webkit-appearance: none; + -moz-appearance: none +} + +input:-webkit-autofill, input:-webkit-autofill:active, input:-webkit-autofill:focus, input:-webkit-autofill:hover { + -webkit-text-fill-color: #000; + -webkit-box-shadow: inset 0 0 0 30px #fff +} + +:-moz-full-screen, :-webkit-full-screen, :fullscreen :-ms-full-screen { + overflow: auto +} + +pre { + background-color: color(gray-lighter); + font-size: 14px; + padding: 15px +} + +code { + border-radius: 4px; + font-family: Roboto, Helvetica, sans-serif; + font-size: .875rem; + font-weight: 400; + padding: 5px +} + +.grid-margin { + margin-bottom: 1.5rem +} + +@media (min-width: 576px) { + .grid-margin-sm-0 { + margin-bottom: 0 + } +} + +@media (min-width: 768px) { + .grid-margin-md-0 { + margin-bottom: 0 + } +} + +@media (min-width: 992px) { + .grid-margin-lg-0 { + margin-bottom: 0 + } +} + +@media (min-width: 1200px) { + .grid-margin-xl-0 { + margin-bottom: 0 + } +} + +.stretch-card { + align-items: stretch; + display: flex; + justify-content: stretch +} + +.stretch-card > .card { + min-width: 100%; + width: 100% +} + +.img-lg { + height: 92px; + width: 92px +} + +.img-md { + height: 92px; + width: 75px +} + +.img-sm { + height: 43px; + width: 43px +} + +.img-xs { + height: 36px; + width: 36px +} + +.img-ss { + height: 26px; + width: 26px +} + +.fw-boldest { + font-weight: 900 +} + +.tx-10 { + font-size: 10px +} + +.tx-11 { + font-size: 11px +} + +.tx-12 { + font-size: 12px +} + +.tx-13 { + font-size: 13px +} + +.tx-14 { + font-size: 14px +} + +.tx-16 { + font-size: 16px +} + +.tx-80 { + font-size: 80px +} + +svg.icon-xs { + height: 12px; + width: 12px +} + +svg.icon-sm { + height: 14px; + width: 14px +} + +svg.icon-md { + height: 16px; + width: 16px +} + +svg.icon-lg { + height: 20px; + width: 20px +} + +svg.icon-xl { + height: 26px; + width: 26px +} + +svg.icon-xxl { + height: 40px; + width: 40px +} + +.icon-xs { + font-size: 14px +} + +.icon-sm { + font-size: 16px +} + +.icon-md { + font-size: 18px +} + +.icon-lg { + font-size: 20px +} + +.icon-xl { + font-size: 24px +} + +.icon-xxl { + font-size: 30px +} + +.cursor-pointer { + cursor: pointer +} + +.cursor-default { + cursor: default +} + +.pt-1px { + padding-top: 1px +} + +.pt-2px { + padding-top: 2px +} + +.pt-3px { + padding-top: 3px +} + +.pb-1px { + padding-bottom: 1px +} + +.pb-2px { + padding-bottom: 2px +} + +.pb-3px { + padding-bottom: 3px +} + +.mt-1px { + margin-top: 1px +} + +.mt-2px { + margin-top: 2px +} + +.mt-3px { + margin-top: 3px +} + +.mb-1px { + margin-bottom: 1px +} + +.mb-2px { + margin-bottom: 2px +} + +.mb-3px { + margin-bottom: 3px +} + +.ht-5 { + height: 5px +} + +.ht-10 { + height: 10px +} + +.ht-15 { + height: 15px +} + +.ht-20 { + height: 20px +} + +.ht-30 { + height: 30px +} + +.ht-40 { + height: 40px +} + +.ht-50 { + height: 50px +} + +.ht-60 { + height: 60px +} + +.ht-70 { + height: 70px +} + +.ht-80 { + height: 80px +} + +.ht-90 { + height: 90px +} + +.ht-100 { + height: 100px +} + +body { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale +} + +.text-facebook { + color: #3b5998 +} + +.text-twitter { + color: #1da1f2 +} + +.text-google { + color: #dc4e41 +} + +.text-youtube { + color: red +} + +.text-vimeo { + color: #1ab7ea +} + +.text-dribbble { + color: #ea4c89 +} + +.text-github { + color: #181717 +} + +.text-instagram { + color: #e4405f +} + +.text-pinterest { + color: #bd081c +} + +.text-flickr { + color: #0063dc +} + +.text-bitbucket { + color: #0052cc +} + +.text-linkedin { + color: #0077b5 +} + +.main-content { + color: #000; + font-size: 16px +} + +.main-content > .page-title { + font-weight: 400; + margin-bottom: 1rem +} + +.main-content > .h4, .main-content > h4 { + margin-bottom: .875rem; + margin-top: 1.5rem +} + +.main-content > .h4:before, .main-content > h4:before { + content: ""; + display: block; + height: 5.4rem; + margin-top: -6rem +} + +.main-content > hr { + margin-bottom: 40px; + margin-top: 40px +} + +.main-content .example { + background-color: #fff; + border: 4px solid #e9ecef; + font-size: .875rem; + letter-spacing: normal; + padding: 10px; + position: relative +} + +@media (min-width: 576px) { + .main-content .example { + padding: 25px + } +} + +.main-content .highlight { + background-color: #fff; + padding: 15px; + position: relative +} + +.main-content .highlight pre { + background: transparent; + font-family: Roboto, Helvetica, sans-serif; + font-size: .875rem; + line-height: 1.4; + margin: 0; + padding: 15px +} + +.main-content .highlight pre code { + color: #000; + font-family: Roboto, Helvetica, sans-serif; + padding: 0; + -moz-tab-size: 8; + -o-tab-size: 8; + tab-size: 8; + text-shadow: none +} + +.main-content .highlight pre code .token.entity, .main-content .highlight pre code .token.operator, .main-content .highlight pre code .token.string, .main-content .highlight pre code .token.url { + background: none +} + +.main-content .highlight .btn-clipboard { + background: rgba(101, 113, 255, .2); + font-size: 12px; + padding: 1px 6px; + position: absolute; + right: 6px; + top: 6px +} + +.main-content .highlight .btn-clipboard:hover { + background: rgba(101, 113, 255, .3); + border-color: transparent; + transition: background .3s ease-in-out +} + +.example .btn-toolbar + .btn-toolbar { + margin-top: .5rem +} + +.example .modal.static { + display: block; + position: static +} + +.example div.navbar, .example nav.navbar { + border-bottom: 0; + box-shadow: none; + height: auto; + left: auto; + padding: .5rem 1rem; + position: relative; + width: 100%; + z-index: 9 +} + +.example div.navbar .navbar-brand, .example nav.navbar .navbar-brand { + font-size: 1.25rem +} + +.example .progress + .progress { + margin-top: 10px +} + +.example .perfect-scrollbar-example { + background: #fff; + max-height: 250px; + position: relative +} + +.example .scrollspy-example { + height: 200px; + margin-top: .5rem; + overflow: auto; + position: relative +} + +.example .scrollspy-example-2 { + height: 350px; + overflow: auto; + position: relative +} + +.example nav .breadcrumb { + margin-bottom: .75rem +} + +.example nav:last-child .breadcrumb { + margin-bottom: 0 +} + +.page-breadcrumb { + margin-bottom: 15px +} + +.page-breadcrumb .breadcrumb { + background: #f9fafb; + padding: 0 +} + +.noble-ui-logo { + color: #000865; + font-size: 25px; + font-weight: 700 +} + +.noble-ui-logo span { + color: #6571ff; + font-weight: 300 +} + +.noble-ui-logo:hover { + color: #000865 +} + +.noble-ui-logo.logo-light { + color: #000 +} + +.buy-now-wrapper { + bottom: 30px; + position: fixed; + right: 35px; + z-index: 99999 +} + +.rtl .buy-now-wrapper { + left: 35px; + right: auto +} + +.buy-now-wrapper .btn svg, .buy-now-wrapper .swal2-popup .swal2-actions button svg, .buy-now-wrapper .wizard > .actions a svg, .buy-now-wrapper div.fc .fc-button-primary svg, .buy-now-wrapper div.tox .tox-button svg, .swal2-popup .swal2-actions .buy-now-wrapper button svg, .wizard > .actions .buy-now-wrapper a svg, div.fc .buy-now-wrapper .fc-button-primary svg, div.tox .buy-now-wrapper .tox-button svg { + height: 19px !important; + width: 19px !important +} + +.loader-wrapper { + align-items: center; + background: #f9fafb; + display: flex; + height: 100vh; + justify-content: center; + left: 0; + position: fixed; + top: 0; + width: 100vw; + z-index: 9999 +} + +.loaded .loader-wrapper { + opacity: 0; + transition: all .8s ease-out; + visibility: hidden +} + +.loader-wrapper .loader { + animation: loading 1.4s linear infinite; + background: #6571ff; + background: linear-gradient(90deg, #6571ff 10%, transparent 42%); + border-radius: 50%; + font-size: 10px; + height: 50px; + margin: 50px auto; + text-indent: -9999em; + transform: translateZ(0); + width: 50px +} + +.loader-wrapper .loader.loader:before { + background: #6571ff; + border-radius: 100% 0 0 0; + content: ""; + height: 50%; + left: 0; + position: absolute; + top: 0; + width: 50% +} + +.loader-wrapper .loader.loader:after { + background: #f9fafb; + border-radius: 50%; + bottom: 0; + content: ""; + height: 75%; + left: 0; + margin: auto; + position: absolute; + right: 0; + top: 0; + width: 75% +} + +@keyframes loading { + 0% { + transform: rotate(0deg) + } + to { + transform: rotate(1turn) + } +} + +.page-wrapper.full-page .page-content { + max-width: 100%; + min-height: 100vh +} + +@media (max-width: 991px) { + .page-wrapper { + margin-top: 60px + } +} + +.page-wrapper .page-content { + --bs-gutter-x: 1.5rem; + --bs-gutter-y: 0; + flex-grow: 1; + margin-left: auto; + margin-right: auto; + min-height: calc(100vh - 110px); + padding: 2rem 0; + padding-left: calc(var(--bs-gutter-x) * .5); + padding-right: calc(var(--bs-gutter-x) * .5); + width: 100% +} + +.page-wrapper .page-content .content-nav-wrapper { + border-left: 1px solid #e9ecef; + display: none; + height: calc(100vh - 6rem); + overflow-y: auto; + padding: 0; + position: sticky; + top: 80px +} + +@media (min-width: 1200px) { + .page-wrapper .page-content .content-nav-wrapper { + display: block + } +} + +.page-wrapper .page-content .content-nav-wrapper .content-nav { + padding: 0 25px +} + +.page-wrapper .page-content .content-nav-wrapper .content-nav .nav-item .nav-link { + align-items: center; + color: #7987a1; + display: flex; + font-size: .875rem; + height: 30px; + padding: 0; + white-space: nowrap +} + +.horizontal-menu .navbar { + align-items: stretch; + background: #fff; + border-bottom: 1px solid #e9ecef; + display: flex; + height: 60px; + padding: 0; + position: relative; + transition: width .1s ease, left .1s ease; + width: 100%; + z-index: 978 +} + +@media (max-width: 991px) { + .horizontal-menu .navbar { + left: 0; + width: 100% + } + + .horizontal-menu .navbar .navbar-content { + width: 100% + } +} + +.horizontal-menu .navbar .navbar-content { + align-items: center; + display: flex; + height: 100%; + width: 100% +} + +@media (max-width: 991px) { + .horizontal-menu .navbar .navbar-content { + width: 100% + } +} + +.horizontal-menu .navbar .navbar-content .navbar-brand { + color: #000865; + font-size: 25px; + font-weight: 700; + opacity: 1; + transition: opacity .5s ease; + visibility: visible +} + +.horizontal-menu .navbar .navbar-content .navbar-brand span { + color: #6571ff; + font-weight: 300 +} + +.horizontal-menu .navbar .navbar-content .search-form { + margin-left: 20px; + margin-right: 60px; + width: 100% +} + +.horizontal-menu .navbar .navbar-content .search-form .input-group .input-group-text { + background: #fff; + border: 0; + color: #7987a1; + padding: 0 +} + +.horizontal-menu .navbar .navbar-content .search-form .input-group .input-group-text svg { + cursor: pointer; + height: 20px; + width: 20px +} + +.horizontal-menu .navbar .navbar-content .search-form .input-group .form-control, .horizontal-menu .navbar .navbar-content .search-form .input-group .select2-container--default .select2-search--dropdown .select2-search__field, .horizontal-menu .navbar .navbar-content .search-form .input-group .typeahead.tt-hint, .horizontal-menu .navbar .navbar-content .search-form .input-group .typeahead.tt-input, .select2-container--default .select2-search--dropdown .horizontal-menu .navbar .navbar-content .search-form .input-group .select2-search__field { + border: 0; + margin-top: 3px +} + +.horizontal-menu .navbar .navbar-content .search-form .input-group .form-control::-moz-placeholder, .horizontal-menu .navbar .navbar-content .search-form .input-group .select2-container--default .select2-search--dropdown .select2-search__field::-moz-placeholder, .horizontal-menu .navbar .navbar-content .search-form .input-group .typeahead.tt-hint::-moz-placeholder, .horizontal-menu .navbar .navbar-content .search-form .input-group .typeahead.tt-input::-moz-placeholder, .select2-container--default .select2-search--dropdown .horizontal-menu .navbar .navbar-content .search-form .input-group .select2-search__field::-moz-placeholder { + color: #7987a1 +} + +.horizontal-menu .navbar .navbar-content .search-form .input-group .form-control::placeholder, .horizontal-menu .navbar .navbar-content .search-form .input-group .select2-container--default .select2-search--dropdown .select2-search__field::placeholder, .horizontal-menu .navbar .navbar-content .search-form .input-group .typeahead.tt-hint::placeholder, .horizontal-menu .navbar .navbar-content .search-form .input-group .typeahead.tt-input::placeholder, .select2-container--default .select2-search--dropdown .horizontal-menu .navbar .navbar-content .search-form .input-group .select2-search__field::placeholder { + color: #7987a1 +} + +.horizontal-menu .navbar .navbar-content .navbar-nav { + display: flex; + flex-direction: row; + margin-left: auto +} + +.horizontal-menu .navbar .navbar-content .navbar-nav .nav-item { + align-items: center; + display: flex; + margin-left: 5px; + margin-right: 5px; + min-width: 30px; + position: relative +} + +@media (max-width: 767px) { + .horizontal-menu .navbar .navbar-content .navbar-nav .nav-item { + min-width: 21px + } +} + +.horizontal-menu .navbar .navbar-content .navbar-nav .nav-item .nav-link { + color: #000; + margin-left: auto; + margin-right: auto; + padding: 0; + position: relative +} + +.horizontal-menu .navbar .navbar-content .navbar-nav .nav-item .nav-link:hover, .horizontal-menu .navbar .navbar-content .navbar-nav .nav-item .nav-link[aria-expanded=true] { + color: #6571ff +} + +.horizontal-menu .navbar .navbar-content .navbar-nav .nav-item .nav-link:after { + display: none +} + +.horizontal-menu .navbar .navbar-content .navbar-nav .nav-item .nav-link svg { + height: 20px; + width: 20px +} + +.horizontal-menu .navbar .navbar-content .navbar-nav .nav-item .nav-link .indicator { + position: absolute; + right: 2px; + top: 0 +} + +.horizontal-menu .navbar .navbar-content .navbar-nav .nav-item .nav-link .indicator .circle { + background: #6571ff; + border-radius: 50%; + height: 7px; + width: 7px +} + +.horizontal-menu .navbar .navbar-content .navbar-nav .nav-item .nav-link .indicator .circle:before { + background-color: #6571ff; + border-radius: 50%; + content: ""; + display: table; + position: absolute +} + +@media (max-width: 767px) { + .horizontal-menu .navbar .navbar-content .navbar-nav .nav-item.dropdown { + position: static + } +} + +.horizontal-menu .navbar .navbar-content .navbar-nav .nav-item.dropdown .dropdown-menu, .horizontal-menu .navbar .navbar-content .navbar-nav .nav-item.dropdown .tt-menu { + font-size: .875rem; + left: auto; + position: absolute; + right: -20px; + width: -moz-max-content; + width: max-content +} + +.horizontal-menu .navbar .navbar-content .navbar-nav .nav-item.dropdown .dropdown-menu:before, .horizontal-menu .navbar .navbar-content .navbar-nav .nav-item.dropdown .tt-menu:before { + background: #fff; + border-left: 1px solid #f2f4f9; + border-top: 1px solid #f2f4f9; + content: ""; + height: 13px; + position: absolute; + right: 28px; + top: -7px; + transform: rotate(45deg); + width: 13px +} + +@media (max-width: 767px) { + .horizontal-menu .navbar .navbar-content .navbar-nav .nav-item.dropdown .dropdown-menu, .horizontal-menu .navbar .navbar-content .navbar-nav .nav-item.dropdown .tt-menu { + right: 20px; + width: calc(100% - 40px) + } + + .horizontal-menu .navbar .navbar-content .navbar-nav .nav-item.dropdown .dropdown-menu:before, .horizontal-menu .navbar .navbar-content .navbar-nav .nav-item.dropdown .tt-menu:before { + display: none + } +} + +.horizontal-menu .navbar .navbar-content .navbar-toggler:focus { + box-shadow: none +} + +.horizontal-menu .navbar .navbar-content .navbar-toggler svg { + color: #7987a1; + height: 20px; + width: 20px +} + +.horizontal-menu .bottom-navbar { + align-items: center; + background: #fff; + box-shadow: 3px 0 10px 0 rgba(183, 192, 206, .2); + -webkit-box-shadow: 3px 0 10px 0 rgba(183, 192, 206, .2); + -moz-box-shadow: 3px 0 10px 0 rgba(183, 192, 206, .2); + display: flex; + position: relative; + transition-duration: 3s; + transition-property: position, left, right, top, z-index; + width: 100% +} + +@media (max-width: 991.98px) { + .horizontal-menu .bottom-navbar { + display: none + } + + .horizontal-menu .bottom-navbar.header-toggled { + display: block + } +} + +@media (max-width: 767.98px) { + .horizontal-menu .bottom-navbar.header-toggled { + max-height: calc(100vh - 60px); + overflow: auto + } +} + +.horizontal-menu .bottom-navbar .page-navigation { + justify-content: space-between; + position: relative; + transition-duration: .2s; + transition-property: background, box-shadow; + width: 100%; + z-index: 99 +} + +@media (max-width: 767.98px) { + .horizontal-menu .bottom-navbar .page-navigation { + border: none + } +} + +.horizontal-menu .bottom-navbar .page-navigation > .nav-item { + line-height: 1; + text-align: left +} + +@media (max-width: 767.98px) { + .horizontal-menu .bottom-navbar .page-navigation > .nav-item { + border-right: none; + display: block; + width: 100% + } +} + +@media (min-width: 992px) { + .horizontal-menu .bottom-navbar .page-navigation > .nav-item:first-child > .nav-link { + padding-left: 0 + } +} + +.horizontal-menu .bottom-navbar .page-navigation > .nav-item:last-child { + border-right: none +} + +@media (min-width: 992px) { + .horizontal-menu .bottom-navbar .page-navigation > .nav-item:last-child > .nav-link { + padding-right: 0 + } +} + +.horizontal-menu .bottom-navbar .page-navigation > .nav-item .category-heading { + color: #000; + font-size: .875rem; + font-weight: 500; + margin-bottom: 0; + padding: 1rem 0 .3rem; + text-align: left +} + +.horizontal-menu .bottom-navbar .page-navigation > .nav-item > .nav-link { + color: #000; + font-weight: 400; + line-height: 1; + padding: 22px 10px +} + +.horizontal-menu .bottom-navbar .page-navigation > .nav-item > .nav-link .menu-title { + font-size: 14px +} + +.horizontal-menu .bottom-navbar .page-navigation > .nav-item > .nav-link .link-icon { + fill: rgba(233, 236, 239, .21); + color: inherit; + font-weight: 400; + height: 18px; + margin-right: 10px; + width: 18px +} + +.horizontal-menu .bottom-navbar .page-navigation > .nav-item > .nav-link .link-arrow { + moz-transform-origin: center; + display: inline-block; + margin-left: 5px; + transform: rotate(0deg); + transform-origin: center; + transition-duration: .2s +} + +.horizontal-menu .bottom-navbar .page-navigation > .nav-item > .nav-link .link-arrow:before { + content: "\e845"; + display: block; + font-family: feather; + font-size: 12px; + font-style: normal; + line-height: 10px +} + +.horizontal-menu .bottom-navbar .page-navigation > .nav-item:hover .submenu { + display: block +} + +.horizontal-menu .bottom-navbar .page-navigation > .nav-item:hover > .nav-link { + background: transparent +} + +.horizontal-menu .bottom-navbar .page-navigation > .nav-item:hover > .nav-link .link-arrow, .horizontal-menu .bottom-navbar .page-navigation > .nav-item:hover > .nav-link .link-icon, .horizontal-menu .bottom-navbar .page-navigation > .nav-item:hover > .nav-link .menu-title { + color: #6571ff; + transition: color .3s ease +} + +.horizontal-menu .bottom-navbar .page-navigation > .nav-item:hover > .nav-link .link-arrow { + moz-transform-origin: center; + transform: rotate(-180deg); + transform-origin: center; + transition-duration: .2s +} + +@media (max-width: 767.98px) { + .horizontal-menu .bottom-navbar .page-navigation > .nav-item .submenu { + display: block + } + + .horizontal-menu .bottom-navbar .page-navigation > .nav-item > .nav-link { + background: transparent + } + + .horizontal-menu .bottom-navbar .page-navigation > .nav-item > .nav-link .link-arrow { + moz-transform-origin: center; + transform: rotate(-180deg); + transform-origin: center; + transition-duration: .2s + } +} + +.horizontal-menu .bottom-navbar .page-navigation > .nav-item.active > .nav-link { + position: relative +} + +.horizontal-menu .bottom-navbar .page-navigation > .nav-item.active > .nav-link:before { + bottom: -2px; + content: ""; + height: 5px; + left: 0; + position: absolute; + width: 100% +} + +@media (max-width: 991px) { + .horizontal-menu .bottom-navbar .page-navigation > .nav-item.active > .nav-link:before { + bottom: 0; + height: 100%; + left: -15px; + top: 0; + width: 5px + } +} + +.horizontal-menu .bottom-navbar .page-navigation > .nav-item.active > .nav-link .link-arrow, .horizontal-menu .bottom-navbar .page-navigation > .nav-item.active > .nav-link .link-icon, .horizontal-menu .bottom-navbar .page-navigation > .nav-item.active > .nav-link .menu-title { + color: #6571ff +} + +.horizontal-menu .bottom-navbar .page-navigation > .nav-item .submenu { + border: 1px solid #e9ecef; + display: none +} + +.horizontal-menu .bottom-navbar .page-navigation > .nav-item .submenu ul { + list-style-type: none; + padding-left: 0 +} + +.horizontal-menu .bottom-navbar .page-navigation > .nav-item .submenu ul li { + display: block; + line-height: 20px +} + +.horizontal-menu .bottom-navbar .page-navigation > .nav-item .submenu ul li a { + color: #000; + display: block; + margin: 4px 0; + padding: 3px 10px; + text-align: left; + text-decoration: none; + white-space: nowrap +} + +.horizontal-menu .bottom-navbar .page-navigation > .nav-item .submenu ul li a:hover { + color: #6571ff; + transition: color .1s linear +} + +.horizontal-menu .bottom-navbar .page-navigation > .nav-item .submenu ul li a:hover:before { + background: #6571ff +} + +.horizontal-menu .bottom-navbar .page-navigation > .nav-item .submenu ul li a.active, .horizontal-menu .bottom-navbar .page-navigation > .nav-item .submenu ul li.active a { + color: #6571ff +} + +.horizontal-menu .bottom-navbar .page-navigation > .nav-item .submenu ul li.active a:before { + background: #6571ff +} + +.horizontal-menu .bottom-navbar .page-navigation > .nav-item:not(.mega-menu) { + position: relative +} + +.horizontal-menu .bottom-navbar .page-navigation > .nav-item:not(.mega-menu) .submenu { + left: 0; + min-width: 180px; + width: -moz-max-content; + width: max-content; + width: -o-max-content; + width: -ms-max-content +} + +@media (min-width: 768px) { + .horizontal-menu .bottom-navbar .page-navigation > .nav-item:not(.mega-menu) .submenu { + background: #fff; + border-radius: .25rem; + border-top: none; + box-shadow: 1px 0 20px rgba(0, 0, 0, .08); + -webkit-box-shadow: 1px 0 20px rgba(0, 0, 0, .08); + position: absolute; + top: 61px; + z-index: 999 + } + + .horizontal-menu .bottom-navbar .page-navigation > .nav-item:not(.mega-menu) .submenu li a { + padding-left: 20px; + position: relative + } + + .horizontal-menu .bottom-navbar .page-navigation > .nav-item:not(.mega-menu) .submenu li a:before { + background: #7987a1; + border-radius: 100%; + content: ""; + height: 4px; + left: 0; + position: absolute; + top: 12px; + width: 4px + } +} + +@media (max-width: 767.98px) { + .horizontal-menu .bottom-navbar .page-navigation > .nav-item:not(.mega-menu) .submenu { + box-shadow: none; + position: relative; + top: 0; + width: 100% + } +} + +.horizontal-menu .bottom-navbar .page-navigation > .nav-item:not(.mega-menu) .submenu ul { + padding: 15px 30px; + width: auto +} + +@media (max-width: 767.98px) { + .horizontal-menu .bottom-navbar .page-navigation > .nav-item:not(.mega-menu) .submenu ul { + padding: 0 35px + } +} + +.horizontal-menu .bottom-navbar .page-navigation > .nav-item.mega-menu .submenu { + left: 0; + padding: 15px 25px; + right: 0; + width: 100% +} + +@media (min-width: 768px) { + .horizontal-menu .bottom-navbar .page-navigation > .nav-item.mega-menu .submenu { + background: #fff; + border-radius: 4px; + border-top: none; + box-shadow: 1px 0 20px rgba(0, 0, 0, .08); + -webkit-box-shadow: 1px 0 20px rgba(0, 0, 0, .08); + position: absolute; + top: 61px; + z-index: 999 + } + + .horizontal-menu .bottom-navbar .page-navigation > .nav-item.mega-menu .submenu li a { + padding-left: 20px; + position: relative + } + + .horizontal-menu .bottom-navbar .page-navigation > .nav-item.mega-menu .submenu li a:before { + background: #7987a1; + border-radius: 100%; + content: ""; + height: 4px; + left: 0; + position: absolute; + top: 12px; + width: 4px + } +} + +@media (max-width: 767.98px) { + .horizontal-menu .bottom-navbar .page-navigation > .nav-item.mega-menu .submenu { + box-shadow: none; + position: relative; + top: 0 + } +} + +.horizontal-menu .bottom-navbar .page-navigation > .nav-item.mega-menu .submenu .col-group-wrapper { + padding: 0 1rem +} + +@media (max-width: 767.98px) { + .horizontal-menu .bottom-navbar .page-navigation > .nav-item.mega-menu .submenu { + padding: 0 32px + } + + .horizontal-menu .bottom-navbar .page-navigation > .nav-item.mega-menu .submenu .col-group-wrapper { + margin-left: 0; + margin-right: 0; + padding: 0 + } + + .horizontal-menu .bottom-navbar .page-navigation > .nav-item.mega-menu .submenu .col-group-wrapper .col-group { + margin-bottom: 20px; + padding-left: 0; + padding-right: 0 + } + + .horizontal-menu .bottom-navbar .page-navigation > .nav-item.mega-menu .submenu .col-group-wrapper .col-group .category-heading:after { + display: none + } +} + +.horizontal-menu.fixed-on-scroll + .page-wrapper { + padding-top: 60px +} + +.horizontal-menu.fixed-on-scroll .bottom-navbar { + border-bottom: 1px solid #e9ecef +} + +@media (max-width: 991px) { + .horizontal-menu { + left: 0; + position: fixed; + right: 0; + top: 0; + z-index: 1030 + } +} + +.navbar-dark .horizontal-menu .navbar { + background: #0c1427; + border-bottom-color: rgba(233, 236, 239, .1) +} + +.navbar-dark .horizontal-menu .navbar .navbar-brand { + color: #e9ecef +} + +.navbar-dark .horizontal-menu .navbar .search-form .input-group .input-group-text { + background: transparent; + color: #7987a1 +} + +.navbar-dark .horizontal-menu .navbar .search-form .input-group input { + background-color: transparent; + color: #7987a1 +} + +.navbar-dark .horizontal-menu .navbar .navbar-nav .nav-item .nav-link { + color: #7987a1 +} + +.navbar-dark .horizontal-menu .bottom-navbar { + background: #0c1427 +} + +.navbar-dark .horizontal-menu .bottom-navbar .page-navigation > .nav-item > .nav-link { + color: #7987a1 +} + +.navbar-dark .horizontal-menu .bottom-navbar .page-navigation > .nav-item > .nav-link .link-icon { + fill: none +} + +a.badge:hover { + color: #fff +} + +.alert-primary { + background-color: rgba(101, 113, 255, .1); + border-color: rgba(101, 113, 255, .2); + color: #4c59ff +} + +.alert-primary .alert-link { + color: #4c59ff +} + +.alert-primary svg { + height: 19px; + margin-right: .5rem; + width: 19px +} + +.alert-primary i { + font-size: 19px; + margin-right: .5rem +} + +.alert-fill-primary { + --bs-alert-color: #fff; + --bs-alert-bg: #6571ff; + --bs-alert-border-color: #6571ff +} + +.alert-fill-primary .alert-link { + color: #ccc +} + +.alert-fill-primary.alert-fill-light { + color: #7987a1 +} + +.alert-secondary { + background-color: rgba(121, 135, 161, .1); + border-color: rgba(121, 135, 161, .2); + color: #6a7a96 +} + +.alert-secondary .alert-link { + color: #6a7a96 +} + +.alert-secondary svg { + height: 19px; + margin-right: .5rem; + width: 19px +} + +.alert-secondary i { + font-size: 19px; + margin-right: .5rem +} + +.alert-fill-secondary { + --bs-alert-color: #fff; + --bs-alert-bg: #7987a1; + --bs-alert-border-color: #7987a1 +} + +.alert-fill-secondary .alert-link { + color: #ccc +} + +.alert-fill-secondary.alert-fill-light { + color: #7987a1 +} + +.alert-success { + background-color: rgba(5, 163, 74, .1); + border-color: rgba(5, 163, 74, .2); + color: #048a3f +} + +.alert-success .alert-link { + color: #048a3f +} + +.alert-success svg { + height: 19px; + margin-right: .5rem; + width: 19px +} + +.alert-success i { + font-size: 19px; + margin-right: .5rem +} + +.alert-fill-success { + --bs-alert-color: #fff; + --bs-alert-bg: #05a34a; + --bs-alert-border-color: #05a34a +} + +.alert-fill-success .alert-link { + color: #ccc +} + +.alert-fill-success.alert-fill-light { + color: #7987a1 +} + +.alert-info { + background-color: rgba(102, 209, 209, .1); + border-color: rgba(102, 209, 209, .2) +} + +.alert-info, .alert-info .alert-link { + color: #52cbcb +} + +.alert-info svg { + height: 19px; + margin-right: .5rem; + width: 19px +} + +.alert-info i { + font-size: 19px; + margin-right: .5rem +} + +.alert-fill-info { + --bs-alert-color: #fff; + --bs-alert-bg: #66d1d1; + --bs-alert-border-color: #66d1d1 +} + +.alert-fill-info .alert-link { + color: #ccc +} + +.alert-fill-info.alert-fill-light { + color: #7987a1 +} + +.alert-warning { + background-color: rgba(251, 188, 6, .1); + border-color: rgba(251, 188, 6, .2); + color: #e4aa04 +} + +.alert-warning .alert-link { + color: #e4aa04 +} + +.alert-warning svg { + height: 19px; + margin-right: .5rem; + width: 19px +} + +.alert-warning i { + font-size: 19px; + margin-right: .5rem +} + +.alert-fill-warning { + --bs-alert-color: #fff; + --bs-alert-bg: #fbbc06; + --bs-alert-border-color: #fbbc06 +} + +.alert-fill-warning .alert-link { + color: #ccc +} + +.alert-fill-warning.alert-fill-light { + color: #7987a1 +} + +.alert-danger { + background-color: rgba(255, 51, 102, .1); + border-color: rgba(255, 51, 102, .2); + color: #ff1a53 +} + +.alert-danger .alert-link { + color: #ff1a53 +} + +.alert-danger svg { + height: 19px; + margin-right: .5rem; + width: 19px +} + +.alert-danger i { + font-size: 19px; + margin-right: .5rem +} + +.alert-fill-danger { + --bs-alert-color: #fff; + --bs-alert-bg: #f36; + --bs-alert-border-color: #f36 +} + +.alert-fill-danger .alert-link { + color: #ccc +} + +.alert-fill-danger.alert-fill-light { + color: #7987a1 +} + +.alert-light { + background-color: rgba(233, 236, 239, .1); + border-color: rgba(233, 236, 239, .2) +} + +.alert-light, .alert-light .alert-link { + color: #dadfe4 +} + +.alert-light svg { + height: 19px; + margin-right: .5rem; + width: 19px +} + +.alert-light i { + font-size: 19px; + margin-right: .5rem +} + +.alert-fill-light { + --bs-alert-color: #fff; + --bs-alert-bg: #e9ecef; + --bs-alert-border-color: #e9ecef +} + +.alert-fill-light .alert-link { + color: #ccc +} + +.alert-fill-light.alert-fill-light { + color: #7987a1 +} + +.alert-dark { + background-color: rgba(6, 12, 23, .1); + border-color: rgba(6, 12, 23, .2) +} + +.alert-dark, .alert-dark .alert-link { + color: #010103 +} + +.alert-dark svg { + height: 19px; + margin-right: .5rem; + width: 19px +} + +.alert-dark i { + font-size: 19px; + margin-right: .5rem +} + +.alert-fill-dark { + --bs-alert-color: #fff; + --bs-alert-bg: #060c17; + --bs-alert-border-color: #060c17 +} + +.alert-fill-dark .alert-link { + color: #ccc +} + +.alert-fill-dark.alert-fill-light { + color: #7987a1 +} + +.breadcrumb.breadcrumb-line .breadcrumb-item + .breadcrumb-item:before { + content: "-" !important +} + +.breadcrumb.breadcrumb-dot .breadcrumb-item + .breadcrumb-item:before { + content: "•" !important +} + +.breadcrumb.breadcrumb-arrow .breadcrumb-item + .breadcrumb-item:before { + content: ">" !important +} + +.btn i, .swal2-popup .swal2-actions button i, .wizard > .actions a i, .wizard > .actions a:active i, .wizard > .actions a:hover i, div.fc .fc-button-primary i, div.tox .tox-button i { + font-size: 1rem +} + +.btn.btn-rounded, .swal2-popup .swal2-actions button.btn-rounded, .wizard > .actions a.btn-rounded, div.fc .btn-rounded.fc-button-primary, div.tox .btn-rounded.tox-button { + border-radius: 50px +} + +.btn.btn-xs, .swal2-popup .swal2-actions button.btn-xs, .wizard > .actions a.btn-xs, div.fc .btn-xs.fc-button-primary, div.tox .btn-xs.tox-button { + font-size: .75rem; + padding: .313rem .8rem +} + +.btn.btn-icon, .swal2-popup .swal2-actions button.btn-icon, .wizard > .actions a.btn-icon, div.fc .btn-icon.fc-button-primary, div.tox .btn-icon.tox-button { + align-items: center; + display: inline-flex; + height: 38px; + justify-content: center; + padding: 0; + width: 38px +} + +.btn.btn-icon svg, .swal2-popup .swal2-actions button.btn-icon svg, .wizard > .actions a.btn-icon svg, div.fc .btn-icon.fc-button-primary svg, div.tox .btn-icon.tox-button svg { + height: 18px +} + +.btn.btn-icon.btn-xs, .swal2-popup .swal2-actions button.btn-icon.btn-xs, .wizard > .actions a.btn-icon.btn-xs, div.fc .btn-icon.btn-xs.fc-button-primary, div.tox .btn-icon.btn-xs.tox-button { + height: 30px; + width: 30px +} + +.btn.btn-icon.btn-xs svg, .swal2-popup .swal2-actions button.btn-icon.btn-xs svg, .wizard > .actions a.btn-icon.btn-xs svg, div.fc .btn-icon.btn-xs.fc-button-primary svg, div.tox .btn-icon.btn-xs.tox-button svg { + height: 14px +} + +.btn-group-sm > .btn.btn-icon, .btn.btn-icon.btn-sm, .swal2-popup .swal2-actions .btn-group-sm > button.btn-icon, .swal2-popup .swal2-actions button.btn-icon.btn-sm, .wizard > .actions .btn-group-sm > a.btn-icon, .wizard > .actions a.btn-icon.btn-sm, div.fc .btn-icon.fc-button-primary, div.tox .btn-group-sm > .btn-icon.tox-button, div.tox .btn-icon.btn-sm.tox-button { + height: 36px; + width: 36px +} + +.btn-group-sm > .btn.btn-icon svg, .btn.btn-icon.btn-sm svg, .swal2-popup .swal2-actions .btn-group-sm > button.btn-icon svg, .swal2-popup .swal2-actions button.btn-icon.btn-sm svg, .wizard > .actions .btn-group-sm > a.btn-icon svg, .wizard > .actions a.btn-icon.btn-sm svg, div.fc .btn-icon.fc-button-primary svg, div.tox .btn-group-sm > .btn-icon.tox-button svg, div.tox .btn-icon.btn-sm.tox-button svg { + height: 15px +} + +.btn-group-lg > .btn.btn-icon, .btn.btn-icon.btn-lg, .swal2-popup .swal2-actions .btn-group-lg > button.btn-icon, .swal2-popup .swal2-actions button.btn-icon.btn-lg, .wizard > .actions .btn-group-lg > a.btn-icon, .wizard > .actions a.btn-icon.btn-lg, div.fc .btn-group-lg > .btn-icon.fc-button-primary, div.fc .btn-icon.btn-lg.fc-button-primary, div.tox .btn-group-lg > .btn-icon.tox-button, div.tox .btn-icon.btn-lg.tox-button { + height: 42px; + width: 42px +} + +.btn-group-lg > .btn.btn-icon svg, .btn.btn-icon.btn-lg svg, .swal2-popup .swal2-actions .btn-group-lg > button.btn-icon svg, .swal2-popup .swal2-actions button.btn-icon.btn-lg svg, .wizard > .actions .btn-group-lg > a.btn-icon svg, .wizard > .actions a.btn-icon.btn-lg svg, div.fc .btn-group-lg > .btn-icon.fc-button-primary svg, div.fc .btn-icon.btn-lg.fc-button-primary svg, div.tox .btn-group-lg > .btn-icon.tox-button svg, div.tox .btn-icon.btn-lg.tox-button svg { + height: 18px +} + +.btn.btn-icon-text .btn-icon-prepend, .swal2-popup .swal2-actions button.btn-icon-text .btn-icon-prepend, .wizard > .actions a.btn-icon-text .btn-icon-prepend, div.fc .btn-icon-text.fc-button-primary .btn-icon-prepend, div.tox .btn-icon-text.tox-button .btn-icon-prepend { + margin-right: .5rem +} + +.btn.btn-icon-text .btn-icon-append, .swal2-popup .swal2-actions button.btn-icon-text .btn-icon-append, .wizard > .actions a.btn-icon-text .btn-icon-append, div.fc .btn-icon-text.fc-button-primary .btn-icon-append, div.tox .btn-icon-text.tox-button .btn-icon-append { + margin-left: .5rem +} + +.btn.btn-icon-text .btn-icon-append, .btn.btn-icon-text .btn-icon-prepend, .swal2-popup .swal2-actions button.btn-icon-text .btn-icon-append, .swal2-popup .swal2-actions button.btn-icon-text .btn-icon-prepend, .wizard > .actions a.btn-icon-text .btn-icon-append, .wizard > .actions a.btn-icon-text .btn-icon-prepend, div.fc .btn-icon-text.fc-button-primary .btn-icon-append, div.fc .btn-icon-text.fc-button-primary .btn-icon-prepend, div.tox .btn-icon-text.tox-button .btn-icon-append, div.tox .btn-icon-text.tox-button .btn-icon-prepend { + height: 18px; + width: 18px +} + +.btn.btn-icon-text.btn-xs .btn-icon-append, .btn.btn-icon-text.btn-xs .btn-icon-prepend, .swal2-popup .swal2-actions button.btn-icon-text.btn-xs .btn-icon-append, .swal2-popup .swal2-actions button.btn-icon-text.btn-xs .btn-icon-prepend, .wizard > .actions a.btn-icon-text.btn-xs .btn-icon-append, .wizard > .actions a.btn-icon-text.btn-xs .btn-icon-prepend, div.fc .btn-icon-text.btn-xs.fc-button-primary .btn-icon-append, div.fc .btn-icon-text.btn-xs.fc-button-primary .btn-icon-prepend, div.tox .btn-icon-text.btn-xs.tox-button .btn-icon-append, div.tox .btn-icon-text.btn-xs.tox-button .btn-icon-prepend { + height: 14px; + width: 14px +} + +.btn-group-sm > .btn.btn-icon-text .btn-icon-append, .btn-group-sm > .btn.btn-icon-text .btn-icon-prepend, .btn.btn-icon-text.btn-sm .btn-icon-append, .btn.btn-icon-text.btn-sm .btn-icon-prepend, .swal2-popup .swal2-actions .btn-group-sm > button.btn-icon-text .btn-icon-append, .swal2-popup .swal2-actions .btn-group-sm > button.btn-icon-text .btn-icon-prepend, .swal2-popup .swal2-actions button.btn-icon-text.btn-sm .btn-icon-append, .swal2-popup .swal2-actions button.btn-icon-text.btn-sm .btn-icon-prepend, .wizard > .actions .btn-group-sm > a.btn-icon-text .btn-icon-append, .wizard > .actions .btn-group-sm > a.btn-icon-text .btn-icon-prepend, .wizard > .actions a.btn-icon-text.btn-sm .btn-icon-append, .wizard > .actions a.btn-icon-text.btn-sm .btn-icon-prepend, div.fc .btn-icon-text.fc-button-primary .btn-icon-append, div.fc .btn-icon-text.fc-button-primary .btn-icon-prepend, div.tox .btn-group-sm > .btn-icon-text.tox-button .btn-icon-append, div.tox .btn-group-sm > .btn-icon-text.tox-button .btn-icon-prepend, div.tox .btn-icon-text.btn-sm.tox-button .btn-icon-append, div.tox .btn-icon-text.btn-sm.tox-button .btn-icon-prepend { + height: 15px; + width: 15px +} + +.btn-group-lg > .btn.btn-icon-text .btn-icon-append, .btn-group-lg > .btn.btn-icon-text .btn-icon-prepend, .btn.btn-icon-text.btn-lg .btn-icon-append, .btn.btn-icon-text.btn-lg .btn-icon-prepend, .swal2-popup .swal2-actions .btn-group-lg > button.btn-icon-text .btn-icon-append, .swal2-popup .swal2-actions .btn-group-lg > button.btn-icon-text .btn-icon-prepend, .swal2-popup .swal2-actions button.btn-icon-text.btn-lg .btn-icon-append, .swal2-popup .swal2-actions button.btn-icon-text.btn-lg .btn-icon-prepend, .wizard > .actions .btn-group-lg > a.btn-icon-text .btn-icon-append, .wizard > .actions .btn-group-lg > a.btn-icon-text .btn-icon-prepend, .wizard > .actions a.btn-icon-text.btn-lg .btn-icon-append, .wizard > .actions a.btn-icon-text.btn-lg .btn-icon-prepend, div.fc .btn-group-lg > .btn-icon-text.fc-button-primary .btn-icon-append, div.fc .btn-group-lg > .btn-icon-text.fc-button-primary .btn-icon-prepend, div.fc .btn-icon-text.btn-lg.fc-button-primary .btn-icon-append, div.fc .btn-icon-text.btn-lg.fc-button-primary .btn-icon-prepend, div.tox .btn-group-lg > .btn-icon-text.tox-button .btn-icon-append, div.tox .btn-group-lg > .btn-icon-text.tox-button .btn-icon-prepend, div.tox .btn-icon-text.btn-lg.tox-button .btn-icon-append, div.tox .btn-icon-text.btn-lg.tox-button .btn-icon-prepend { + height: 18px; + width: 18px +} + +.btn-facebook { + background: #3b5998; + color: #fff +} + +.btn-facebook:focus, .btn-facebook:hover { + background: #2d4373; + color: #fff +} + +.btn-facebook.btn-social-icon-text { + background: #4c70ba; + padding: 0 1.5rem 0 0 +} + +.btn-facebook.btn-social-icon-text i { + background: #3b5998; + display: inline-block; + margin-right: 1.5rem; + padding: .75rem +} + +.btn-outline-facebook { + border: 1px solid #3b5998; + color: #3b5998 +} + +.btn-outline-facebook:hover { + background: #3b5998; + color: #fff +} + +.btn-twitter { + background: #1da1f2; + color: #fff +} + +.btn-twitter:focus, .btn-twitter:hover { + background: #0c85d0; + color: #fff +} + +.btn-twitter.btn-social-icon-text { + background: #4db5f5; + padding: 0 1.5rem 0 0 +} + +.btn-twitter.btn-social-icon-text i { + background: #1da1f2; + display: inline-block; + margin-right: 1.5rem; + padding: .75rem +} + +.btn-outline-twitter { + border: 1px solid #1da1f2; + color: #1da1f2 +} + +.btn-outline-twitter:hover { + background: #1da1f2; + color: #fff +} + +.btn-google { + background: #dc4e41; + color: #fff +} + +.btn-google:focus, .btn-google:hover { + background: #c63224; + color: #fff +} + +.btn-google.btn-social-icon-text { + background: #e4766c; + padding: 0 1.5rem 0 0 +} + +.btn-google.btn-social-icon-text i { + background: #dc4e41; + display: inline-block; + margin-right: 1.5rem; + padding: .75rem +} + +.btn-outline-google { + border: 1px solid #dc4e41; + color: #dc4e41 +} + +.btn-outline-google:hover { + background: #dc4e41; + color: #fff +} + +.btn-youtube { + background: red; + color: #fff +} + +.btn-youtube:focus, .btn-youtube:hover { + background: #c00; + color: #fff +} + +.btn-youtube.btn-social-icon-text { + background: #f33; + padding: 0 1.5rem 0 0 +} + +.btn-youtube.btn-social-icon-text i { + background: red; + display: inline-block; + margin-right: 1.5rem; + padding: .75rem +} + +.btn-outline-youtube { + border: 1px solid red; + color: red +} + +.btn-outline-youtube:hover { + background: red; + color: #fff +} + +.btn-vimeo { + background: #1ab7ea; + color: #fff +} + +.btn-vimeo:focus, .btn-vimeo:hover { + background: #1295bf; + color: #fff +} + +.btn-vimeo.btn-social-icon-text { + background: #49c6ee; + padding: 0 1.5rem 0 0 +} + +.btn-vimeo.btn-social-icon-text i { + background: #1ab7ea; + display: inline-block; + margin-right: 1.5rem; + padding: .75rem +} + +.btn-outline-vimeo { + border: 1px solid #1ab7ea; + color: #1ab7ea +} + +.btn-outline-vimeo:hover { + background: #1ab7ea; + color: #fff +} + +.btn-dribbble { + background: #ea4c89; + color: #fff +} + +.btn-dribbble:focus, .btn-dribbble:hover { + background: #e51e6b; + color: #fff +} + +.btn-dribbble.btn-social-icon-text { + background: #ef7aa7; + padding: 0 1.5rem 0 0 +} + +.btn-dribbble.btn-social-icon-text i { + background: #ea4c89; + display: inline-block; + margin-right: 1.5rem; + padding: .75rem +} + +.btn-outline-dribbble { + border: 1px solid #ea4c89; + color: #ea4c89 +} + +.btn-outline-dribbble:hover { + background: #ea4c89; + color: #fff +} + +.btn-github { + background: #181717; + color: #fff +} + +.btn-github:focus, .btn-github:hover { + background: #000; + color: #fff +} + +.btn-github.btn-social-icon-text { + background: #323030; + padding: 0 1.5rem 0 0 +} + +.btn-github.btn-social-icon-text i { + background: #181717; + display: inline-block; + margin-right: 1.5rem; + padding: .75rem +} + +.btn-outline-github { + border: 1px solid #181717; + color: #181717 +} + +.btn-outline-github:hover { + background: #181717; + color: #fff +} + +.btn-instagram { + background: #e4405f; + color: #fff +} + +.btn-instagram:focus, .btn-instagram:hover { + background: #d31e40; + color: #fff +} + +.btn-instagram.btn-social-icon-text { + background: #ea6d84; + padding: 0 1.5rem 0 0 +} + +.btn-instagram.btn-social-icon-text i { + background: #e4405f; + display: inline-block; + margin-right: 1.5rem; + padding: .75rem +} + +.btn-outline-instagram { + border: 1px solid #e4405f; + color: #e4405f +} + +.btn-outline-instagram:hover { + background: #e4405f; + color: #fff +} + +.btn-pinterest { + background: #bd081c; + color: #fff +} + +.btn-pinterest:focus, .btn-pinterest:hover { + background: #8c0615; + color: #fff +} + +.btn-pinterest.btn-social-icon-text { + background: #ee0a23; + padding: 0 1.5rem 0 0 +} + +.btn-pinterest.btn-social-icon-text i { + background: #bd081c; + display: inline-block; + margin-right: 1.5rem; + padding: .75rem +} + +.btn-outline-pinterest { + border: 1px solid #bd081c; + color: #bd081c +} + +.btn-outline-pinterest:hover { + background: #bd081c; + color: #fff +} + +.btn-flickr { + background: #0063dc; + color: #fff +} + +.btn-flickr:focus, .btn-flickr:hover { + background: #004ca9; + color: #fff +} + +.btn-flickr.btn-social-icon-text { + background: #107cff; + padding: 0 1.5rem 0 0 +} + +.btn-flickr.btn-social-icon-text i { + background: #0063dc; + display: inline-block; + margin-right: 1.5rem; + padding: .75rem +} + +.btn-outline-flickr { + border: 1px solid #0063dc; + color: #0063dc +} + +.btn-outline-flickr:hover { + background: #0063dc; + color: #fff +} + +.btn-bitbucket { + background: #0052cc; + color: #fff +} + +.btn-bitbucket:focus, .btn-bitbucket:hover { + background: #003e99; + color: #fff +} + +.btn-bitbucket.btn-social-icon-text { + background: #0067ff; + padding: 0 1.5rem 0 0 +} + +.btn-bitbucket.btn-social-icon-text i { + background: #0052cc; + display: inline-block; + margin-right: 1.5rem; + padding: .75rem +} + +.btn-outline-bitbucket { + border: 1px solid #0052cc; + color: #0052cc +} + +.btn-outline-bitbucket:hover { + background: #0052cc; + color: #fff +} + +.btn-linkedin { + background: #0077b5; + color: #fff +} + +.btn-linkedin:focus, .btn-linkedin:hover { + background: #005582; + color: #fff +} + +.btn-linkedin.btn-social-icon-text { + background: #0099e8; + padding: 0 1.5rem 0 0 +} + +.btn-linkedin.btn-social-icon-text i { + background: #0077b5; + display: inline-block; + margin-right: 1.5rem; + padding: .75rem +} + +.btn-outline-linkedin { + border: 1px solid #0077b5; + color: #0077b5 +} + +.btn-outline-linkedin:hover { + background: #0077b5; + color: #fff +} + +.btn-inverse-primary { + background-color: rgba(101, 113, 255, .2); + background-image: none; + border-color: rgba(101, 113, 255, 0) +} + +.btn-inverse-primary:not(.btn-inverse-light) { + color: #6571ff +} + +.btn-inverse-primary.active, .btn-inverse-primary:active, .btn-inverse-primary:hover, .show > .btn-inverse-primary.dropdown-toggle { + background-color: rgba(101, 113, 255, .3); + border-color: rgba(101, 113, 255, 0) +} + +.btn-inverse-primary.focus, .btn-inverse-primary:focus { + box-shadow: 0 0 0 3px rgba(101, 113, 255, .5) +} + +.btn-inverse-primary.disabled, .btn-inverse-primary:disabled { + background-color: transparent; + color: #6571ff +} + +.btn-inverse-secondary { + background-color: rgba(121, 135, 161, .2); + background-image: none; + border-color: rgba(121, 135, 161, 0) +} + +.btn-inverse-secondary:not(.btn-inverse-light) { + color: #7987a1 +} + +.btn-inverse-secondary.active, .btn-inverse-secondary:active, .btn-inverse-secondary:hover, .show > .btn-inverse-secondary.dropdown-toggle { + background-color: rgba(121, 135, 161, .3); + border-color: rgba(121, 135, 161, 0) +} + +.btn-inverse-secondary.focus, .btn-inverse-secondary:focus { + box-shadow: 0 0 0 3px rgba(121, 135, 161, .5) +} + +.btn-inverse-secondary.disabled, .btn-inverse-secondary:disabled { + background-color: transparent; + color: #7987a1 +} + +.btn-inverse-success { + background-color: rgba(5, 163, 74, .2); + background-image: none; + border-color: rgba(5, 163, 74, 0) +} + +.btn-inverse-success:not(.btn-inverse-light) { + color: #05a34a +} + +.btn-inverse-success.active, .btn-inverse-success:active, .btn-inverse-success:hover, .show > .btn-inverse-success.dropdown-toggle { + background-color: rgba(5, 163, 74, .3); + border-color: rgba(5, 163, 74, 0) +} + +.btn-inverse-success.focus, .btn-inverse-success:focus { + box-shadow: 0 0 0 3px rgba(5, 163, 74, .5) +} + +.btn-inverse-success.disabled, .btn-inverse-success:disabled { + background-color: transparent; + color: #05a34a +} + +.btn-inverse-info { + background-color: rgba(102, 209, 209, .2); + background-image: none; + border-color: rgba(102, 209, 209, 0) +} + +.btn-inverse-info:not(.btn-inverse-light) { + color: #66d1d1 +} + +.btn-inverse-info.active, .btn-inverse-info:active, .btn-inverse-info:hover, .show > .btn-inverse-info.dropdown-toggle { + background-color: rgba(102, 209, 209, .3); + border-color: rgba(102, 209, 209, 0) +} + +.btn-inverse-info.focus, .btn-inverse-info:focus { + box-shadow: 0 0 0 3px rgba(102, 209, 209, .5) +} + +.btn-inverse-info.disabled, .btn-inverse-info:disabled { + background-color: transparent; + color: #66d1d1 +} + +.btn-inverse-warning { + background-color: rgba(251, 188, 6, .2); + background-image: none; + border-color: rgba(251, 188, 6, 0) +} + +.btn-inverse-warning:not(.btn-inverse-light) { + color: #fbbc06 +} + +.btn-inverse-warning.active, .btn-inverse-warning:active, .btn-inverse-warning:hover, .show > .btn-inverse-warning.dropdown-toggle { + background-color: rgba(251, 188, 6, .3); + border-color: rgba(251, 188, 6, 0) +} + +.btn-inverse-warning.focus, .btn-inverse-warning:focus { + box-shadow: 0 0 0 3px rgba(251, 188, 6, .5) +} + +.btn-inverse-warning.disabled, .btn-inverse-warning:disabled { + background-color: transparent; + color: #fbbc06 +} + +.btn-inverse-danger { + background-color: rgba(255, 51, 102, .2); + background-image: none; + border-color: rgba(255, 51, 102, 0) +} + +.btn-inverse-danger:not(.btn-inverse-light) { + color: #f36 +} + +.btn-inverse-danger.active, .btn-inverse-danger:active, .btn-inverse-danger:hover, .show > .btn-inverse-danger.dropdown-toggle { + background-color: rgba(255, 51, 102, .3); + border-color: rgba(255, 51, 102, 0) +} + +.btn-inverse-danger.focus, .btn-inverse-danger:focus { + box-shadow: 0 0 0 3px rgba(255, 51, 102, .5) +} + +.btn-inverse-danger.disabled, .btn-inverse-danger:disabled { + background-color: transparent; + color: #f36 +} + +.btn-inverse-light { + background-color: rgba(233, 236, 239, .2); + background-image: none; + border-color: rgba(233, 236, 239, 0) +} + +.btn-inverse-light:not(.btn-inverse-light) { + color: #e9ecef +} + +.btn-inverse-light.active, .btn-inverse-light:active, .btn-inverse-light:hover, .show > .btn-inverse-light.dropdown-toggle { + background-color: rgba(233, 236, 239, .3); + border-color: rgba(233, 236, 239, 0) +} + +.btn-inverse-light.focus, .btn-inverse-light:focus { + box-shadow: 0 0 0 3px rgba(233, 236, 239, .5) +} + +.btn-inverse-light.disabled, .btn-inverse-light:disabled { + background-color: transparent; + color: #e9ecef +} + +.btn-inverse-dark { + background-color: rgba(6, 12, 23, .2); + background-image: none; + border-color: rgba(6, 12, 23, 0) +} + +.btn-inverse-dark:not(.btn-inverse-light) { + color: #060c17 +} + +.btn-inverse-dark.active, .btn-inverse-dark:active, .btn-inverse-dark:hover, .show > .btn-inverse-dark.dropdown-toggle { + background-color: rgba(6, 12, 23, .3); + border-color: rgba(6, 12, 23, 0) +} + +.btn-inverse-dark.focus, .btn-inverse-dark:focus { + box-shadow: 0 0 0 3px rgba(6, 12, 23, .5) +} + +.btn-inverse-dark.disabled, .btn-inverse-dark:disabled { + background-color: transparent; + color: #060c17 +} + +.card { + box-shadow: 0 0 10px 0 rgba(183, 192, 206, .2); + -webkit-box-shadow: 0 0 10px 0 rgba(183, 192, 206, .2); + -moz-box-shadow: 0 0 10px 0 rgba(183, 192, 206, .2); + -ms-box-shadow: 0 0 10px 0 rgba(183, 192, 206, .2) +} + +.card .card-body + .card-body { + padding-top: 1rem +} + +.card .card-title { + font-size: .875rem; + font-weight: 500; + text-transform: uppercase +} + +.card-group { + box-shadow: 0 0 10px 0 rgba(183, 192, 206, .2) +} + +.card-group .card { + box-shadow: none +} + +.btn-group .dropdown-toggle:after, .dropdown .dropdown-toggle:after { + border: 0; + content: "\e842"; + font: normal normal normal 24px/1 feather; + font-size: .875rem; + height: auto; + line-height: .625rem; + vertical-align: middle; + width: auto +} + +.btn-group.dropup .dropdown-toggle:after, .dropdown.dropup .dropdown-toggle:after { + content: "\e845" +} + +.btn-group.dropstart .dropdown-toggle:before, .dropdown.dropstart .dropdown-toggle:before { + border: 0; + content: "\e843"; + font: normal normal normal 24px/1 feather; + font-size: .875rem; + height: auto; + line-height: .625rem; + vertical-align: middle; + width: auto +} + +.btn-group.dropend .dropdown-toggle:after, .dropdown.dropend .dropdown-toggle:after { + content: "\e844" +} + +.dropdown-menu, .tt-menu { + box-shadow: 0 5px 10px 0 rgba(183, 192, 206, .2); + margin-top: 0; + padding: .35rem +} + +.dropdown-item, .tt-menu .tt-suggestion { + border-radius: 2px; + font-size: .812rem; + padding: .25rem .875rem +} + +.dropdown-item i, .dropdown-item svg, .tt-menu .tt-suggestion i, .tt-menu .tt-suggestion svg { + color: #7987a1 +} + +.dropdown-item:not(.dropdown-item:active,.dropdown-item.active):hover, .tt-menu .tt-suggestion:not(.dropdown-item:active,.dropdown-item.active):hover { + background-color: rgba(101, 113, 255, .1) +} + +.dropdown-item:not(.dropdown-item:active,.dropdown-item.active):hover, .dropdown-item:not(.dropdown-item:active,.dropdown-item.active):hover i, .dropdown-item:not(.dropdown-item:active,.dropdown-item.active):hover svg, .tt-menu .tt-suggestion:not(.dropdown-item:active,.dropdown-item.active):hover, .tt-menu .tt-suggestion:not(.dropdown-item:active,.dropdown-item.active):hover i, .tt-menu .tt-suggestion:not(.dropdown-item:active,.dropdown-item.active):hover svg { + color: #6571ff +} + +.dropdown-item.active i, .dropdown-item.active svg, .dropdown-item:active i, .dropdown-item:active svg, .tt-menu .active.tt-suggestion i, .tt-menu .active.tt-suggestion svg, .tt-menu .tt-suggestion:active i, .tt-menu .tt-suggestion:active svg { + color: #fff +} + +.form-control-xs, .form-select-xs { + font-size: .75rem; + padding: .313rem .8rem +} + +.form-control-xs + .input-group-text { + padding-bottom: .313rem; + padding-top: .313rem +} + +.form-check-input { + margin-top: .13em +} + +.input-group-text svg { + height: 18px; + width: 18px +} + +[type=email], [type=number], [type=tel], [type=url] { + direction: ltr +} + +.icons-list { + border-left: 1px solid #e9ecef; + border-top: 1px solid #e9ecef +} + +.icons-list > div { + align-items: center; + background: #f9fafb; + border-bottom: 1px solid #e9ecef; + border-right: 1px solid #e9ecef; + display: flex; + font-weight: 400; + padding: 15px 20px; + transition: all .3s ease-in-out +} + +.icons-list > div i { + display: inline-block; + font-size: 20px; + text-align: left +} + +.icons-list > div i, .icons-list > div svg { + color: #7987a1; + margin-right: 12px; + transition: all .3s ease-in-out +} + +.icons-list > div svg { + width: 20px +} + +.icons-list > div:hover { + cursor: text +} + +.icons-list > div:hover i, .icons-list > div:hover svg { + color: #6571ff; + transform: scale(1.3) +} + +.nav.nav-tabs .nav-item .nav-link { + background-color: #f8f9fa; + border-color: #e9ecef #e9ecef #dee2e6; + color: #000; + cursor: pointer +} + +.nav.nav-tabs .nav-item .nav-link.active { + background: #fff; + border-color: #dee2e6 #dee2e6 #fff; + color: #6571ff +} + +.nav.nav-tabs .nav-item .nav-link.disabled { + background-color: transparent; + border-color: rgba(233, 236, 239, .7) rgba(233, 236, 239, .7) transparent; + color: #7987a1 +} + +.nav.nav-tabs.nav-tabs-vertical { + border-bottom: 0 +} + +.nav.nav-tabs.nav-tabs-vertical .nav-link { + background-color: #f8f9fa; + border: 1px solid #e9ecef; + border-bottom-color: #dee2e6; + border-radius: 0; + color: #000; + width: 100% +} + +.nav.nav-tabs.nav-tabs-vertical .nav-link:first-child { + border-radius: .25rem 0 0 0 +} + +.nav.nav-tabs.nav-tabs-vertical .nav-link:last-child { + border-radius: 0 0 0 .25rem +} + +.nav.nav-tabs.nav-tabs-vertical .nav-link.active { + background-color: #fff; + border-right-color: transparent; + color: #6571ff +} + +.nav.nav-tabs.nav-tabs-line .nav-link { + background-color: transparent; + border: 0 +} + +.nav.nav-tabs.nav-tabs-line .nav-link.active { + border-bottom: 2px solid #6571ff +} + +.tab-content.tab-content-vertical { + height: 100% +} + +.pagination .page-item .page-link svg { + height: 18px; + width: 18px +} + +.pagination.pagination-separated .page-item { + margin-left: 2px; + margin-right: 2px +} + +.pagination.pagination-separated .page-item:first-child { + margin-left: 0 +} + +.pagination.pagination-separated .page-item:last-child { + margin-right: 0 +} + +.pagination.pagination-rounded .page-item { + margin-left: 2px; + margin-right: 2px +} + +.pagination.pagination-rounded .page-item .page-link { + border-radius: 50px +} + +.table { + margin-bottom: 0 +} + +.table > :not(:last-child) > :last-child > * { + border-bottom-color: inherit +} + +.table thead th { + border-top: 0; + color: #7987a1; + font-size: 12px; + font-weight: 500; + text-transform: uppercase +} + +.table thead th i { + margin-left: .325rem +} + +.table td, .table th { + white-space: nowrap +} + +.table td img { + border-radius: 100%; + height: 36px; + width: 36px +} + +.timeline { + background: rgba(101, 113, 255, .2); + border-bottom-right-radius: .25rem; + border-left: 3px solid #6571ff; + border-top-right-radius: .25rem; + list-style: none; + margin: 0 auto; + max-width: 40%; + padding: 50px; + position: relative +} + +@media (max-width: 767px) { + .timeline { + max-width: 98%; + padding: 25px + } +} + +.timeline .event { + border-bottom: 1px dashed #e9ecef; + margin-bottom: 25px; + padding-bottom: 25px; + position: relative +} + +@media (max-width: 767px) { + .timeline .event { + padding-top: 30px + } +} + +.timeline .event .title { + font-size: 1rem; + font-weight: 500; + margin-bottom: 10px +} + +.timeline .event:last-of-type { + border: none; + margin-bottom: 0; + padding-bottom: 0 +} + +.timeline .event:after, .timeline .event:before { + display: block; + position: absolute; + top: 0 +} + +.timeline .event:before { + content: attr(data-date); + font-size: .9em; + font-weight: 500; + left: -207px; + min-width: 120px; + text-align: right +} + +@media (max-width: 767px) { + .timeline .event:before { + left: 0; + text-align: left + } +} + +.timeline .event:after { + background: #fff; + border-radius: 50%; + box-shadow: 0 0 0 3px #6571ff; + content: ""; + height: 9px; + left: -55.8px; + top: 5px; + width: 9px +} + +@media (max-width: 767px) { + .timeline .event:after { + left: -31.8px + } +} + +.chat-wrapper { + height: calc(100vh - 162px) +} + +@media (max-width: 991px) { + .chat-wrapper { + height: 100%; + min-height: 100% + } +} + +@media (min-width: 992px) { + .chat-wrapper .chat-aside { + padding-right: 23px + } +} + +.chat-wrapper .chat-aside .aside-body .tab-content .tab-pane { + max-height: calc(100vh - 385px); + position: relative +} + +.chat-wrapper .chat-aside .aside-body .tab-content .tab-pane .chat-list .chat-item a > div { + padding-bottom: 11px; + padding-top: 11px +} + +@media (max-width: 991px) { + .chat-wrapper .chat-content { + background: #fff; + bottom: -1px; + display: none; + left: 0; + position: absolute; + right: 0; + top: 0 + } + + .chat-wrapper .chat-content.show { + display: block + } +} + +.chat-wrapper .chat-content .chat-header { + padding: 0 10px +} + +.chat-wrapper .chat-content .chat-body { + margin-bottom: 20px; + margin-top: 20px; + max-height: calc(100vh - 340px); + position: relative +} + +@media (max-width: 767px) { + .chat-wrapper .chat-content .chat-body { + max-height: calc(100vh - 315px) + } +} + +@media (max-width: 991px) { + .chat-wrapper .chat-content .chat-body { + max-height: calc(100vh - 342px) + } +} + +.chat-wrapper .chat-content .chat-body .messages { + list-style-type: none; + padding: 0 10px +} + +.chat-wrapper .chat-content .chat-body .messages .message-item { + display: flex; + margin-bottom: 20px; + max-width: 80% +} + +@media (max-width: 767px) { + .chat-wrapper .chat-content .chat-body .messages .message-item { + max-width: 95% + } +} + +.chat-wrapper .chat-content .chat-body .messages .message-item .content .bubble { + margin-bottom: 4px; + padding: 7px 15px; + position: relative; + width: -moz-fit-content; + width: fit-content +} + +.chat-wrapper .chat-content .chat-body .messages .message-item .content span { + color: #7987a1; + font-size: 12px +} + +.chat-wrapper .chat-content .chat-body .messages .message-item.friend img { + margin-right: 15px; + order: 1 +} + +.chat-wrapper .chat-content .chat-body .messages .message-item.friend .content { + order: 2 +} + +.chat-wrapper .chat-content .chat-body .messages .message-item.friend .content .bubble { + background: rgba(101, 113, 255, .1); + border-radius: 0 5px 5px +} + +.chat-wrapper .chat-content .chat-body .messages .message-item.friend .content .bubble:before { + border-color: rgba(101, 113, 255, .1) rgba(101, 113, 255, .1) transparent transparent; + border-style: solid; + border-width: 5px; + content: ""; + height: 0; + left: -10px; + position: absolute; + top: 0; + width: 0 +} + +.chat-wrapper .chat-content .chat-body .messages .message-item.me { + margin-left: auto +} + +.chat-wrapper .chat-content .chat-body .messages .message-item.me img { + margin-left: 15px; + order: 2 +} + +.chat-wrapper .chat-content .chat-body .messages .message-item.me .content { + margin-left: auto; + order: 1 +} + +.chat-wrapper .chat-content .chat-body .messages .message-item.me .content .bubble { + background: rgba(102, 209, 209, .1); + border-radius: 5px 0 5px 5px; + margin-left: auto +} + +.chat-wrapper .chat-content .chat-body .messages .message-item.me .content .bubble:before { + border-color: rgba(102, 209, 209, .1) transparent transparent rgba(102, 209, 209, .1); + border-style: solid; + border-width: 5px; + content: ""; + height: 0; + position: absolute; + right: -10px; + top: 0; + width: 0 +} + +.chat-wrapper .chat-content .chat-body .messages .message-item.me .content span { + display: block; + text-align: right +} + +.chat-wrapper figure { + position: relative +} + +.chat-wrapper figure .status { + background: #7987a1; + border: 2px solid #fff; + border-radius: 50%; + bottom: 0; + height: 11px; + position: absolute; + right: -2px; + width: 11px +} + +.chat-wrapper figure .status.online { + background: #05a34a +} + +.chat-wrapper figure .status.offline { + background: #7987a1 +} + +.auth-page .auth-side-wrapper { + background-size: cover; + height: 100%; + width: 100% +} + +.email-aside-nav.collapse { + display: block +} + +@media (max-width: 991px) { + .email-aside-nav.collapse { + display: none + } + + .email-aside-nav.collapse.show { + display: block + } +} + +.email-aside-nav .nav-item { + border-radius: .2rem +} + +.email-aside-nav .nav-item .nav-link { + color: #000 +} + +.email-aside-nav .nav-item .nav-link svg { + color: #7987a1 +} + +.email-aside-nav .nav-item.active, .email-aside-nav .nav-item:hover { + background: rgba(101, 113, 255, .1) +} + +.email-aside-nav .nav-item.active .nav-link, .email-aside-nav .nav-item.active .nav-link svg, .email-aside-nav .nav-item:hover .nav-link, .email-aside-nav .nav-item:hover .nav-link svg { + color: #6571ff +} + +.email-list-item { + align-items: center; + border-bottom: 1px solid #e9ecef; + cursor: pointer; + display: flex; + padding: 10px 20px +} + +.email-list-item:hover { + background: rgba(101, 113, 255, .08) +} + +.email-list-item:last-child { + margin-bottom: 5px +} + +.email-list-item .email-list-actions { + display: table-cell; + vertical-align: top; + width: 40px +} + +.email-list-item .email-list-actions .form-check { + margin-bottom: 0 +} + +.email-list-item .email-list-actions .favorite { + display: block; + line-height: 15px; + padding-left: 1px +} + +.email-list-item .email-list-actions .favorite span svg { + color: #7987a1; + width: 14px +} + +.email-list-item .email-list-actions .favorite:hover span { + color: #8d8d8d +} + +.email-list-item .email-list-actions .favorite.active span svg { + color: #fbbc06 +} + +.email-list-item .email-list-detail { + align-items: center; + display: flex; + flex-grow: 1; + justify-content: space-between; + width: calc(100% - 40px) +} + +.email-list-item .email-list-detail .content { + overflow: hidden +} + +.email-list-item .email-list-detail .content .from { + color: #000; + display: block; + margin: 0 0 1px +} + +.email-list-item .email-list-detail .content .msg { + color: #7987a1; + font-size: .8rem; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + width: 97% +} + +.email-list-item .email-list-detail .date { + color: #000; + white-space: nowrap +} + +.email-list-item .email-list-detail .date .icon svg { + color: #3d405c; + margin-right: 7px; + width: 14px +} + +.email-list-item.email-list-item--unread { + background-color: rgba(101, 113, 255, .09) +} + +.email-list-item.email-list-item--unread .content .from { + font-weight: 500 +} + +.email-list-item.email-list-item--unread .content .msg { + font-weight: 700 +} + +.ace_editor { + border-radius: .25rem; + font: 14px/normal SFMono-Regular, Menlo, Monaco, Consolas, Liberation Mono, Courier New, monospace; + height: 300px; + margin: auto; + width: 100% +} + +.ace_editor .ace_content { + font-size: .875rem +} + +div.apexcharts-canvas { + direction: ltr +} + +div.apexcharts-canvas .apexcharts-menu { + background: #fff !important; + border-color: #e9ecef; + color: #000 +} + +div.apexcharts-canvas .apexcharts-menu-icon svg, div.apexcharts-canvas .apexcharts-pan-icon svg, div.apexcharts-canvas .apexcharts-reset-icon svg, div.apexcharts-canvas .apexcharts-selection-icon svg, div.apexcharts-canvas .apexcharts-toolbar-custom-icon svg, div.apexcharts-canvas .apexcharts-zoom-icon svg, div.apexcharts-canvas .apexcharts-zoomin-icon svg, div.apexcharts-canvas .apexcharts-zoomout-icon svg { + fill: #7987a1 +} + +div.apexcharts-canvas .apexcharts-legend.apexcharts-align-left .apexcharts-legend-series, div.apexcharts-canvas .apexcharts-legend.apexcharts-align-right .apexcharts-legend-series { + align-items: center; + display: flex +} + +div.apexcharts-canvas .apexcharts-legend-marker { + margin-right: 3px +} + +div.apexcharts-canvas .apexcharts-tooltip { + background: hsla(0, 0%, 100%, .8); + border: 1px solid #f2f4f9; + border-radius: .25rem; + box-shadow: 0 5px 10px 0 rgba(183, 192, 206, .2); + color: #000 +} + +div.apexcharts-canvas .apexcharts-tooltip .apexcharts-tooltip-title { + background-color: #fff; + border-color: #e9ecef +} + +div.apexcharts-canvas .apexcharts-tooltip * { + font-family: Roboto, Helvetica, sans-serif !important +} + +div.apexcharts-canvas .apexcharts-tooltip-series-group.apexcharts-active, div.apexcharts-canvas .apexcharts-tooltip-series-group:last-child { + padding: 0 10px +} + +div.apexcharts-canvas .apexcharts-tooltip-text-goals-value, div.apexcharts-canvas .apexcharts-tooltip-text-y-value, div.apexcharts-canvas .apexcharts-tooltip-text-z-value { + margin-left: 0 +} + +div.apexcharts-canvas .apexcharts-tooltip-title { + margin-bottom: 0 +} + +div.apexcharts-canvas .apexcharts-xaxistooltip, div.apexcharts-canvas .apexcharts-yaxistooltip { + background: #fff; + border-color: #f2f4f9; + color: #000 +} + +div.apexcharts-canvas .apexcharts-xaxistooltip-bottom:before { + border-bottom-color: #f2f4f9 +} + +div.apexcharts-canvas .apexcharts-xaxistooltip-bottom:after { + border-bottom-color: hsla(0, 0%, 100%, .8) +} + +div.apexcharts-canvas .apexcharts-yaxistooltip-left:before, div.apexcharts-canvas .apexcharts-yaxistooltip-right:before { + border-left-color: #f2f4f9 +} + +div.apexcharts-canvas .apexcharts-yaxistooltip-left:after, div.apexcharts-canvas .apexcharts-yaxistooltip-right:after { + border-left-color: hsla(0, 0%, 100%, .8) +} + +@media (max-width: 767px) { + .dataTables_wrapper.dt-bootstrap4 .dataTables_length { + text-align: left + } +} + +.dataTables_wrapper.dt-bootstrap4 .dataTables_length select { + margin-left: 10px; + margin-right: 10px +} + +@media (max-width: 767px) { + .dataTables_wrapper.dt-bootstrap4 .dataTables_filter { + margin-left: -19px; + text-align: left + } +} + +div.table-responsive > div.dataTables_wrapper > div.row > div[class^=col-]:first-child { + padding-left: 0; + padding-right: 12px +} + +div.table-responsive > div.dataTables_wrapper > div.row > div[class^=col-]:last-child { + padding-left: 12px; + padding-right: 0 +} + +.dropify-wrapper { + border: 1px solid #e9ecef; + border-radius: .25rem +} + +.dropify-wrapper .dropify-message span.file-icon { + color: #7987a1; + font-size: .875rem +} + +.dropify-wrapper .dropify-message span.file-icon:before { + content: "\e8e3"; + font-family: feather; + font-size: 24px +} + +.dropzone { + border: 1px solid #e9ecef; + border-radius: .25rem; + max-height: 200px; + overflow: auto; + padding: 0 +} + +@media (min-width: 1400px) { + .dropzone { + min-height: 200px + } +} + +.dropzone.dz-clickable .dz-message { + margin-top: 65px +} + +.dropzone .dz-preview.dz-file-preview .dz-image, .dropzone .dz-preview.dz-image-preview .dz-image { + border-radius: .25rem +} + +.flatpickr-input.typeahead.tt-hint, .flatpickr-input.typeahead.tt-input, .form-control.flatpickr-input, .select2-container--default .select2-search--dropdown .flatpickr-input.select2-search__field { + background-color: #fff +} + +.flatpickr-day.endRange, .flatpickr-day.endRange.inRange, .flatpickr-day.endRange.nextMonthDay, .flatpickr-day.endRange.prevMonthDay, .flatpickr-day.endRange:focus, .flatpickr-day.endRange:hover, .flatpickr-day.selected, .flatpickr-day.selected.inRange, .flatpickr-day.selected.nextMonthDay, .flatpickr-day.selected.prevMonthDay, .flatpickr-day.selected:focus, .flatpickr-day.selected:hover, .flatpickr-day.startRange, .flatpickr-day.startRange.inRange, .flatpickr-day.startRange.nextMonthDay, .flatpickr-day.startRange.prevMonthDay, .flatpickr-day.startRange:focus, .flatpickr-day.startRange:hover { + background: #6571ff; + border-color: #6571ff +} + +.flatpickr-months { + padding: .5rem 1rem 0 +} + +.flatpickr-months .flatpickr-next-month.flatpickr-prev-month, .flatpickr-months .flatpickr-prev-month.flatpickr-prev-month { + left: 11px; + right: auto !important; + top: 8px +} + +.flatpickr-months .flatpickr-next-month.flatpickr-next-month, .flatpickr-months .flatpickr-prev-month.flatpickr-next-month { + left: auto !important; + right: 11px; + top: 8px +} + +.flatpickr-months .flatpickr-next-month:hover svg, .flatpickr-months .flatpickr-prev-month:hover svg { + fill: #6571ff +} + +.flatpickr-months .flatpickr-month { + height: 42px +} + +.flatpickr-current-month .flatpickr-monthDropdown-months { + border-radius: .25rem; + font-size: 1rem; + padding: .3rem .5rem +} + +.flatpickr-weekdays { + padding: 0 10px +} + +.dayContainer { + padding: 0 10px 10px +} + +div.fc { + --fc-button-active-bg-color: #6571ff; + --fc-button-active-border-color: #6571ff; + --fc-border-color: #e9ecef +} + +div.fc .fc-button .fc-icon { + font-size: 1.3em +} + +div.fc .fc-button-primary:focus, div.fc .fc-button-primary:not(:disabled).fc-button-active:focus, div.fc .fc-button-primary:not(:disabled):active:focus { + box-shadow: none +} + +div.fc .fc-button-primary:disabled { + border-color: #6571ff +} + +@media (max-width: 767px) { + div.fc .fc-toolbar { + flex-direction: column + } + + div.fc .fc-toolbar .fc-toolbar-chunk { + margin-bottom: 12px + } +} + +div.fc .fc-col-header-cell-cushion, div.fc .fc-daygrid-day-number { + color: #000 +} + +div.fc .fc-daygrid-event { + padding: 4px +} + +div.fc .fc-daygrid-day.fc-day-today, div.fc .fc-list-event:hover td { + background-color: rgba(101, 113, 255, .2) +} + +div.fc .fc-list-day-side-text, div.fc .fc-list-day-text { + color: #000 +} + +.fc-timegrid-event-harness-inset .fc-timegrid-event, .fc-timegrid-event.fc-event-mirror, .fc-timegrid-more-link { + box-shadow: none +} + +.fc-theme-standard .fc-popover { + background-color: #fff; + border-color: #f2f4f9; + box-shadow: 0 5px 10px 0 rgba(183, 192, 206, .2) +} + +.fc-theme-standard .fc-popover .fc-popover-header { + background-color: #7987a1 +} + +.fc-theme-standard .fc-list-day-cushion { + --fc-neutral-bg-color: #f9fafb +} + +.fc-h-event.fc-daygrid-block-event { + background: rgba(101, 113, 255, .2); + border: 0; + border-left: 3px solid #6571ff; + border-radius: 2px; + color: #000; + font-weight: 500; + margin-bottom: 10px; + padding: 8px +} + +.fc-event.fc-h-event { + --fc-event-text-color: #000; + border-left-width: 3px; + font-weight: 700 +} + +.flot-chart-wrapper .flot-chart { + height: 400px; + max-width: none; + position: relative; + width: 100% +} + +@media (max-width: 767px) { + .flot-chart-wrapper { + height: 200px; + min-height: 200px + } + + .flot-chart-wrapper .flot-chart { + height: 100% + } +} + +.flot-text .flot-x-axis .flot-tick-label, .flot-text .flot-x-axis > div, .flot-text .flot-y-axis .flot-tick-label, .flot-text .flot-y-axis > div { + color: #000 +} + +.peity-custom svg { + margin-right: 10px +} + +.ps__thumb-x { + background-color: #d9d9d9; + height: 4px +} + +.ps__rail-x.ps--clicking .ps__thumb-x, .ps__rail-x:focus > .ps__thumb-x, .ps__rail-x:hover > .ps__thumb-x { + background-color: #b3b3b3; + height: 6px +} + +.ps__rail-x { + height: 10px +} + +.ps__thumb-y { + background-color: #d9d9d9; + left: auto !important; + right: 2px !important; + width: 4px +} + +.ps__rail-y.ps--clicking .ps__thumb-y, .ps__rail-y:focus > .ps__thumb-y, .ps__rail-y:hover > .ps__thumb-y { + background-color: #b3b3b3; + width: 6px +} + +.ps__rail-y { + left: auto !important; + right: 0 !important; + width: 10px +} + +.ps .ps__rail-x.ps--clicking, .ps .ps__rail-x:focus, .ps .ps__rail-x:hover, .ps .ps__rail-y.ps--clicking, .ps .ps__rail-y:focus, .ps .ps__rail-y:hover { + background-color: #e9ecef +} + +.swal2-popup { + font-size: .875rem +} + +.swal2-popup .swal2-title { + color: #000; + font-size: 25px; + font-weight: 500; + line-height: 1; + margin-bottom: 0 +} + +.swal2-popup .swal2-html-container { + color: #7987a1; + font-size: .875rem; + font-weight: 400; + margin-top: 11px; + text-decoration: none +} + +.swal2-popup .swal2-actions button svg { + height: 16px; + width: 16px +} + +.swal2-popup .swal2-close { + font-size: 22px +} + +.swal2-popup .swal2-close:focus { + box-shadow: none +} + +.swal2-popup .swal2-timer-progress-bar { + background: #7987a1 +} + +.select2-container--default .select2-selection--multiple, .select2-container--default .select2-selection--single { + border: 1px solid #e9ecef; + border-radius: .25rem +} + +.select2-container--focus.select2-container--default .select2-selection--multiple, .select2-container--focus.select2-container--default .select2-selection--single, .select2-dropdown { + border: 1px solid #ced4da +} + +.select2-dropdown { + border-radius: .25rem +} + +.select2-container--default .select2-results__option--highlighted[aria-selected] { + background-color: #6571ff +} + +.select2-container .select2-selection--multiple, .select2-container .select2-selection--single { + height: auto +} + +.select2-container--default .select2-selection--single .select2-selection__rendered { + line-height: 1.5; + padding: .469rem .8rem +} + +.select2-container--default .select2-selection--single .select2-selection__arrow { + height: 100% +} + +.select2-container--default .select2-selection--single .select2-selection__arrow b { + left: 0 +} + +.select2-container--default .select2-selection--multiple { + min-height: 38px +} + +.select2-container--default .select2-selection--multiple .select2-selection__rendered { + padding: 0 6px +} + +.select2-container--default .select2-selection--multiple .select2-selection__choice { + background-color: #6571ff; + border-color: #6571ff; + border-radius: .15rem; + color: #fff; + margin-top: 5px; + padding: 1px 8px +} + +.select2-container--default .select2-selection--multiple .select2-selection__choice__remove { + color: #fff; + opacity: .5 +} + +.select2-container .select2-search--inline { + margin-top: 3px +} + +.EasyMDEContainer .CodeMirror { + background: #fff; + border: 1px solid #e9ecef; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + color: #000 +} + +.editor-toolbar { + border: 1px solid #e9ecef; + border-bottom: 0; + border-radius: .25rem .25rem 0 0 +} + +.editor-toolbar, .editor-toolbar:hover { + opacity: 1 +} + +.editor-toolbar button { + color: rgba(0, 0, 0, .7) !important +} + +.editor-toolbar button:hover { + background: #e9ecef; + border: none +} + +.editor-toolbar i.separator { + border-left: 1px solid #e9ecef; + border-right: 1px solid #e9ecef +} + +.EasyMDEContainer .CodeMirror-fullscreen, .editor-preview-side, .editor-toolbar.fullscreen { + z-index: 999 +} + +.editor-preview-side { + border-color: #e9ecef +} + +.editor-toolbar button.active, .editor-toolbar button:hover { + background: #e9ecef; + border-color: transparent +} + +.editor-statusbar { + border: 1px solid #e9ecef; + border-bottom-left-radius: .25rem; + border-bottom-right-radius: .25rem; + border-top-color: transparent; + padding: 0 10px +} + +div.tagsinput { + border-color: #e9ecef; + border-radius: .25rem; + padding: 6px 6px 1px +} + +div.tagsinput span.tag { + background: #6571ff; + border: 0; + border-radius: .15rem; + color: #fff; + float: left; + font-family: inherit; + margin-bottom: 4px; + margin-left: 5px; + margin-right: 0; + padding: 3px 7px +} + +div.tagsinput span.tag a { + color: #fff; + font-size: 13px; + font-weight: 500; + opacity: .5 +} + +div.tagsinput #tags_addTag { + float: left; + margin-left: 5px +} + +div.tagsinput input { + border-radius: .25rem; + margin: 0; + padding: 1px +} + +.tox.tox-tinymce { + border: 1px solid #e9ecef; + border-radius: .25rem +} + +.tox.tox-tinymce .tox-menubar, .tox.tox-tinymce .tox-toolbar, .tox.tox-tinymce .tox-toolbar-overlord, .tox.tox-tinymce .tox-toolbar__overflow, .tox.tox-tinymce .tox-toolbar__primary { + background-color: #fff; + background-image: none; + border-bottom: 1px solid #e9ecef +} + +.tox.tox-tinymce .tox-toolbar-overlord { + border-bottom: none +} + +.tox.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header { + box-shadow: none; + padding: 0 +} + +.tox.tox-tinymce .tox-edit-area__iframe { + background-color: #fff +} + +.tox.tox-tinymce.tox:not([dir=rtl]) .tox-toolbar__group:not(:last-of-type) { + border-left-color: #e9ecef; + border-right-color: #e9ecef +} + +.tox.tox-tinymce .tox-statusbar { + background-color: #fff; + border-color: #e9ecef; + color: #7987a1 +} + +.tox.tox-tinymce .tox-statusbar a, .tox.tox-tinymce .tox-statusbar__path-item, .tox.tox-tinymce .tox-statusbar__wordcount { + color: #7987a1 +} + +.tox.tox-tinymce .tox-mbtn { + color: #000 +} + +.tox.tox-tinymce .tox-tbtn { + color: rgba(0, 0, 0, .7) +} + +.tox.tox-tinymce .tox-tbtn:hover { + background: #e9ecef; + color: #000 +} + +.tox.tox-tinymce .tox-tbtn:hover svg { + fill: #000 +} + +.tox.tox-tinymce .tox-tbtn:focus:not(.tox-tbtn--disabled) { + color: #000 +} + +.tox.tox-tinymce .tox-mbtn--active, .tox.tox-tinymce .tox-mbtn:focus:not(:disabled), .tox.tox-tinymce .tox-mbtn:hover:not(:disabled):not(.tox-mbtn--active) { + background: #e9ecef; + color: #000 +} + +.tox.tox-tinymce .tox-tbtn svg { + fill: rgba(0, 0, 0, .7) +} + +.tox.tox-tinymce .tox-tbtn--disabled svg, .tox.tox-tinymce .tox-tbtn--disabled:hover svg, .tox.tox-tinymce .tox-tbtn:disabled svg, .tox.tox-tinymce .tox-tbtn:disabled:hover svg { + fill: #e9ecef +} + +.tox.tox-tinymce .tox-split-button:hover { + box-shadow: inset 0 0 0 1px #e9ecef +} + +.tox.tox-tinymce .tox-split-button:focus, .tox.tox-tinymce .tox-tbtn--enabled, .tox.tox-tinymce .tox-tbtn--enabled:hover, .tox.tox-tinymce .tox-tbtn:focus { + background: #e9ecef +} + +div.tox .tox-menu { + background-color: #fff; + border-color: #f2f4f9 +} + +div.tox .tox-collection__item { + color: #000 +} + +div.tox .tox-collection--list .tox-collection__item--enabled { + background-color: #6571ff; + color: #fff +} + +div.tox .tox-collection--list .tox-collection__group { + border-color: #e9ecef +} + +div.tox .tox-collection--list .tox-collection__item--active, div.tox .tox-collection--toolbar .tox-collection__item--active { + background-color: #e9ecef +} + +div.tox .tox-collection--list .tox-collection__item--active:not(.tox-collection__item--state-disabled), div.tox .tox-collection--toolbar .tox-collection__item--active:not(.tox-collection__item--state-disabled) { + color: #000 +} + +div.tox .tox-dialog-wrap__backdrop { + background-color: rgba(0, 0, 0, .75) +} + +div.tox .tox-dialog, div.tox .tox-dialog__footer, div.tox .tox-dialog__header { + background-color: #fff; + border-color: #e9ecef; + color: #000 +} + +div.tox .tox-button--secondary:hover:not(:disabled) { + background-color: #7987a1; + border-color: #7987a1; + color: #fff +} + +div.tox .tox-button--naked:hover:not(:disabled) { + background-color: transparent; + border-color: transparent +} + +div.tox .tox-button--naked.tox-button--icon:hover:not(:disabled) { + color: #333 +} + +div.tox .tox-listboxfield .tox-listbox--select, div.tox .tox-textarea, div.tox .tox-textfield, div.tox .tox-toolbar-textfield { + background-color: #fff; + border-color: #e9ecef; + color: #000 +} + +div.tox .tox-listboxfield .tox-listbox--select:focus, div.tox .tox-textarea:focus, div.tox .tox-textfield:focus { + background-color: #fff; + border-color: #ced4da +} + +div.tox .tox-dialog__table tbody tr { + border-color: #e9ecef +} + +div.tox .tox-dialog__body { + color: #000 +} + +.typeahead.tt-hint, .typeahead.tt-input { + background-color: #fff !important; + direction: ltr +} + +.tt-menu .tt-suggestion { + cursor: pointer +} + +.tabcontrol ul, .wizard ul { + display: flex +} + +@media (max-width: 676px) { + .tabcontrol ul, .wizard ul { + flex-wrap: wrap + } +} + +.wizard > .steps > ul > li { + display: flex; + flex-grow: 1; + width: auto +} + +.wizard > .steps .disabled a, .wizard > .steps .disabled a:active, .wizard > .steps .disabled a:hover { + background-color: #e9ecef; + border: 1px solid transparent; + color: #000 +} + +.wizard > .steps .current a, .wizard > .steps .current a:active, .wizard > .steps .current a:hover { + background-color: #6571ff; + border: 1px solid transparent +} + +.wizard > .steps a, .wizard > .steps a:active, .wizard > .steps a:hover { + border-radius: .25rem; + padding: .469rem .8rem; + width: 100% +} + +.wizard > .steps .done a, .wizard > .steps .done a:active, .wizard > .steps .done a:hover { + background-color: rgba(101, 113, 255, .2); + border: 1px solid #6571ff; + color: #6571ff +} + +.wizard > .steps ul li a, .wizard > .steps ul li a:active, .wizard > .steps ul li a:hover { + margin: 0 .5em .5em 0 +} + +.wizard > .steps ul li:last-child a, .wizard > .steps ul li:last-child a:active, .wizard > .steps ul li:last-child a:hover { + margin: 0 0 .5em +} + +.wizard > .steps .number { + font-size: inherit +} + +.wizard > .content { + background: #fff; + border: 1px solid #e9ecef; + margin: .5em 0; + min-height: 23em; + overflow: auto +} + +@media (max-width: 767px) { + .wizard > .content > .body { + height: 90%; + padding: 5%; + width: 90% + } +} + +.wizard > .actions { + text-align: right +} + +.wizard.vertical > .steps, .wizard > .actions > ul > li, .wizard > .steps > ul > li { + float: left +} + +.wizard > .actions .disabled a, .wizard > .actions .disabled a:active, .wizard > .actions .disabled a:hover { + background: #e9ecef; + border-color: #e9ecef; + color: #adb5bd; + cursor: not-allowed +} + +.wizard > .actions .disabled a:focus { + box-shadow: none; + color: #adb5bd +} + +.wizard > .actions > ul li { + margin-left: .7em; + margin-right: 0 +} + +.wizard.vertical > .steps ul { + flex-direction: column +} + +.wizard.vertical > .content { + margin: 0 0 .5em 2%; + width: 68% +} + +.wizard.vertical > .steps a, .wizard.vertical > .steps a:active, .wizard.vertical > .steps a:hover { + margin: 0 0 .5em +} + +.wizard.vertical > .actions { + margin: 0; + width: 100% +} + +.wizard.vertical > .actions > ul > li { + margin: 0 0 0 .7em +} + +/*# sourceMappingURL=app.css.map*/ diff --git a/www/css/stile.css b/www/css/stile.css new file mode 100644 index 0000000..a556a25 --- /dev/null +++ b/www/css/stile.css @@ -0,0 +1,226 @@ +*{ + font-family: 'Roboto'; + font-weight: 400; + font-style: normal; +} +.cvet_fona{ + background-color: #006953; +} +.visota-kartozrki{ + min-height: 12rem; + margin-bottom: 0.4rem; +} +.card-title{ + padding: 0.5rem 0 0 0.8rem; + margin: 0; + font-weight: 800; + font-size: 1.7rem !important; + color: white; + font-family: "Futura PT Extra"; +opacity: 100%; +} + +.card-podzagolovok{ + padding: 0 0 0.5rem 0.8rem; + margin: 0; + font-weight: 600; + font-size: 1.2rem !important; + color: #00ff00; + font-family: "Futura PT Demi"; +} +.card-zagolovok{ + background-image:url("../img/gray.svg"); + + margin-top: 6rem; +} +.card-bord{ + border: 0; +} +body, html { + height: 100%; + margin: 0; + padding: 0; +} +.top-logo { + width: 70%; + padding: 0 30px 0 5px; +} +.icons_niz{ + width: 3rem; +} +.foot{ + padding: 0.7rem 0.5rem; +} +.fon-img-1{ + background-image: url("../img/fon-1.gif"); +} +.promejutok{ + min-height: 0.5rem; +} +.card-body{ + padding: 0; +} + +.nal{ + background-image: url("../img/fon-1.gif"); + background-repeat: repeat; + background-size: auto 150%; +} + +#nalychevo{ + background-image: url("../img/fon-1.gif"); + background-repeat: repeat; + background-size: auto 120%; +} + +#south-camchatskiy{ + background-image: url("../img/fon-2.png"); + background-repeat: repeat; + background-size: auto 120%; +} + +#bistrinskiy{ + background-image: url("../img/fon-3.png"); + background-repeat: repeat; + background-size: auto 120%; +} + +#kluchevskoy{ + background-image: url("../img/fon-4.png"); + background-repeat: repeat; + background-size: auto 120%; +} + +#viluchenskiy{ + background-image: url("../img/fon-5.png"); + background-repeat: repeat; + background-size: auto 120%; +} + +#koly-river{ + background-image: url("../img/fon-6.png"); + background-repeat: repeat; + background-size: auto 120%; +} + +.wrapper { + display: flex; + flex-direction: column; + min-height: 100%; +} +main { + flex: 1; + overflow-y: auto; +} +header, footer { + width: 100%; + flex-shrink: 0; +} + +.shadow-up { + box-shadow: 0 -.5rem 1rem rgba(0, 0, 0, .15); +} + +.scrollable-nav { + display: flex; + flex-wrap: nowrap; + overflow-x: auto; + overflow-y: hidden; + -webkit-overflow-scrolling: touch; + white-space: nowrap; +} + +.scrollable-nav::-webkit-scrollbar { + display: none; +} + +.scrollable-nav button { + flex-shrink: 0; +} + +.scrollable-nav div { + flex-shrink: 0; +} + +.card-fixed { + width: 250px; + height: 100px; +} + +.text-container { + max-width: 80%; + max-height: 80%; + overflow: hidden; +} + +.text-ellipsis { + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; + text-overflow: ellipsis; +} + +.card_pod{ + padding: 0.3rem; + margin-bottom: 0.3rem; +} +.podzagolovok{ + color: #006a53; + font-family: 'Futura PT Demi'; + font-weight: 600; + font-size: 1.6rem; + padding: 0; +} +.paragraph_card{ + margin: 0; + padding: 0; + color: #4c4f54; + font-family: 'Futura PT Demi'; + font-weight: 300; + font-size: 1.3rem; + text-align: justify; +} + +.bk_stat{ + background-color: white; +} +.paragraph_marsh{ + margin: 0; + padding-top: 0.4rem; + color: #4c4f54; + font-family: 'Roboto'; + font-weight: 400; + font-size: 1.2rem; + text-align: justify; + line-height: 1; +} +.podzagolovok-mars{ + color: #006a53; + font-family: 'Roboto'; + font-weight: 500; + font-size: 1.3rem; + padding: 0; +} +.zagolovok-mars{ + color: #006a53; + color: #006a53; + font-family: 'Roboto'; + font-weight: 500; + font-size: 1.6rem; + padding: 0.5rem 0; + text-align: center; +} +.osn-zagolovok-mars{ + color: #006a53; + font-family: 'Futura PT Demi'; + font-weight: 600; + font-size: 1.5rem; + padding: 0; + text-align: center; + text-transform: uppercase; +} +.marshrut{ + margin: 0.3rem 0; + padding: 0.6rem; +} \ No newline at end of file diff --git a/www/fonts/FuturaPT-Bold.eot b/www/fonts/FuturaPT-Bold.eot new file mode 100644 index 0000000..5360f51 Binary files /dev/null and b/www/fonts/FuturaPT-Bold.eot differ diff --git a/www/fonts/FuturaPT-Bold.ttf b/www/fonts/FuturaPT-Bold.ttf new file mode 100644 index 0000000..036b079 Binary files /dev/null and b/www/fonts/FuturaPT-Bold.ttf differ diff --git a/www/fonts/FuturaPT-Bold.woff b/www/fonts/FuturaPT-Bold.woff new file mode 100644 index 0000000..00a3d6d Binary files /dev/null and b/www/fonts/FuturaPT-Bold.woff differ diff --git a/www/fonts/FuturaPT-Bold.woff2 b/www/fonts/FuturaPT-Bold.woff2 new file mode 100644 index 0000000..f765038 Binary files /dev/null and b/www/fonts/FuturaPT-Bold.woff2 differ diff --git a/www/fonts/FuturaPT-BoldObl.eot b/www/fonts/FuturaPT-BoldObl.eot new file mode 100644 index 0000000..904ac80 Binary files /dev/null and b/www/fonts/FuturaPT-BoldObl.eot differ diff --git a/www/fonts/FuturaPT-BoldObl.ttf b/www/fonts/FuturaPT-BoldObl.ttf new file mode 100644 index 0000000..e48ec6d Binary files /dev/null and b/www/fonts/FuturaPT-BoldObl.ttf differ diff --git a/www/fonts/FuturaPT-BoldObl.woff b/www/fonts/FuturaPT-BoldObl.woff new file mode 100644 index 0000000..5dbac47 Binary files /dev/null and b/www/fonts/FuturaPT-BoldObl.woff differ diff --git a/www/fonts/FuturaPT-BoldObl.woff2 b/www/fonts/FuturaPT-BoldObl.woff2 new file mode 100644 index 0000000..a6e59bc Binary files /dev/null and b/www/fonts/FuturaPT-BoldObl.woff2 differ diff --git a/www/fonts/FuturaPT-Book.eot b/www/fonts/FuturaPT-Book.eot new file mode 100644 index 0000000..fc0f598 Binary files /dev/null and b/www/fonts/FuturaPT-Book.eot differ diff --git a/www/fonts/FuturaPT-Book.ttf b/www/fonts/FuturaPT-Book.ttf new file mode 100644 index 0000000..b422f18 Binary files /dev/null and b/www/fonts/FuturaPT-Book.ttf differ diff --git a/www/fonts/FuturaPT-Book.woff b/www/fonts/FuturaPT-Book.woff new file mode 100644 index 0000000..06e634d Binary files /dev/null and b/www/fonts/FuturaPT-Book.woff differ diff --git a/www/fonts/FuturaPT-Book.woff2 b/www/fonts/FuturaPT-Book.woff2 new file mode 100644 index 0000000..76d61d2 Binary files /dev/null and b/www/fonts/FuturaPT-Book.woff2 differ diff --git a/www/fonts/FuturaPT-BookObl.eot b/www/fonts/FuturaPT-BookObl.eot new file mode 100644 index 0000000..b36b814 Binary files /dev/null and b/www/fonts/FuturaPT-BookObl.eot differ diff --git a/www/fonts/FuturaPT-BookObl.ttf b/www/fonts/FuturaPT-BookObl.ttf new file mode 100644 index 0000000..6fc3c17 Binary files /dev/null and b/www/fonts/FuturaPT-BookObl.ttf differ diff --git a/www/fonts/FuturaPT-BookObl.woff b/www/fonts/FuturaPT-BookObl.woff new file mode 100644 index 0000000..76b72ea Binary files /dev/null and b/www/fonts/FuturaPT-BookObl.woff differ diff --git a/www/fonts/FuturaPT-BookObl.woff2 b/www/fonts/FuturaPT-BookObl.woff2 new file mode 100644 index 0000000..a20af4d Binary files /dev/null and b/www/fonts/FuturaPT-BookObl.woff2 differ diff --git a/www/fonts/FuturaPT-Demi.eot b/www/fonts/FuturaPT-Demi.eot new file mode 100644 index 0000000..4686f88 Binary files /dev/null and b/www/fonts/FuturaPT-Demi.eot differ diff --git a/www/fonts/FuturaPT-Demi.ttf b/www/fonts/FuturaPT-Demi.ttf new file mode 100644 index 0000000..33250ae Binary files /dev/null and b/www/fonts/FuturaPT-Demi.ttf differ diff --git a/www/fonts/FuturaPT-Demi.woff b/www/fonts/FuturaPT-Demi.woff new file mode 100644 index 0000000..dfc81d1 Binary files /dev/null and b/www/fonts/FuturaPT-Demi.woff differ diff --git a/www/fonts/FuturaPT-Demi.woff2 b/www/fonts/FuturaPT-Demi.woff2 new file mode 100644 index 0000000..332df60 Binary files /dev/null and b/www/fonts/FuturaPT-Demi.woff2 differ diff --git a/www/fonts/FuturaPT-DemiObl.eot b/www/fonts/FuturaPT-DemiObl.eot new file mode 100644 index 0000000..082db78 Binary files /dev/null and b/www/fonts/FuturaPT-DemiObl.eot differ diff --git a/www/fonts/FuturaPT-DemiObl.ttf b/www/fonts/FuturaPT-DemiObl.ttf new file mode 100644 index 0000000..ea9f133 Binary files /dev/null and b/www/fonts/FuturaPT-DemiObl.ttf differ diff --git a/www/fonts/FuturaPT-DemiObl.woff b/www/fonts/FuturaPT-DemiObl.woff new file mode 100644 index 0000000..d0e61f0 Binary files /dev/null and b/www/fonts/FuturaPT-DemiObl.woff differ diff --git a/www/fonts/FuturaPT-DemiObl.woff2 b/www/fonts/FuturaPT-DemiObl.woff2 new file mode 100644 index 0000000..2559d93 Binary files /dev/null and b/www/fonts/FuturaPT-DemiObl.woff2 differ diff --git a/www/fonts/FuturaPT-ExtraBold.eot b/www/fonts/FuturaPT-ExtraBold.eot new file mode 100644 index 0000000..4ad2fa7 Binary files /dev/null and b/www/fonts/FuturaPT-ExtraBold.eot differ diff --git a/www/fonts/FuturaPT-ExtraBold.ttf b/www/fonts/FuturaPT-ExtraBold.ttf new file mode 100644 index 0000000..9d7a31d Binary files /dev/null and b/www/fonts/FuturaPT-ExtraBold.ttf differ diff --git a/www/fonts/FuturaPT-ExtraBold.woff b/www/fonts/FuturaPT-ExtraBold.woff new file mode 100644 index 0000000..c5e1306 Binary files /dev/null and b/www/fonts/FuturaPT-ExtraBold.woff differ diff --git a/www/fonts/FuturaPT-ExtraBold.woff2 b/www/fonts/FuturaPT-ExtraBold.woff2 new file mode 100644 index 0000000..d574b15 Binary files /dev/null and b/www/fonts/FuturaPT-ExtraBold.woff2 differ diff --git a/www/fonts/FuturaPT-ExtraBoldObl.eot b/www/fonts/FuturaPT-ExtraBoldObl.eot new file mode 100644 index 0000000..e91f31a Binary files /dev/null and b/www/fonts/FuturaPT-ExtraBoldObl.eot differ diff --git a/www/fonts/FuturaPT-ExtraBoldObl.ttf b/www/fonts/FuturaPT-ExtraBoldObl.ttf new file mode 100644 index 0000000..5c03b85 Binary files /dev/null and b/www/fonts/FuturaPT-ExtraBoldObl.ttf differ diff --git a/www/fonts/FuturaPT-ExtraBoldObl.woff b/www/fonts/FuturaPT-ExtraBoldObl.woff new file mode 100644 index 0000000..598d145 Binary files /dev/null and b/www/fonts/FuturaPT-ExtraBoldObl.woff differ diff --git a/www/fonts/FuturaPT-ExtraBoldObl.woff2 b/www/fonts/FuturaPT-ExtraBoldObl.woff2 new file mode 100644 index 0000000..5ed87b9 Binary files /dev/null and b/www/fonts/FuturaPT-ExtraBoldObl.woff2 differ diff --git a/www/fonts/FuturaPT-Heavy.eot b/www/fonts/FuturaPT-Heavy.eot new file mode 100644 index 0000000..8ccd621 Binary files /dev/null and b/www/fonts/FuturaPT-Heavy.eot differ diff --git a/www/fonts/FuturaPT-Heavy.ttf b/www/fonts/FuturaPT-Heavy.ttf new file mode 100644 index 0000000..6e46121 Binary files /dev/null and b/www/fonts/FuturaPT-Heavy.ttf differ diff --git a/www/fonts/FuturaPT-Heavy.woff b/www/fonts/FuturaPT-Heavy.woff new file mode 100644 index 0000000..b44a35d Binary files /dev/null and b/www/fonts/FuturaPT-Heavy.woff differ diff --git a/www/fonts/FuturaPT-Heavy.woff2 b/www/fonts/FuturaPT-Heavy.woff2 new file mode 100644 index 0000000..0101b73 Binary files /dev/null and b/www/fonts/FuturaPT-Heavy.woff2 differ diff --git a/www/fonts/FuturaPT-HeavyObl.eot b/www/fonts/FuturaPT-HeavyObl.eot new file mode 100644 index 0000000..45406bc Binary files /dev/null and b/www/fonts/FuturaPT-HeavyObl.eot differ diff --git a/www/fonts/FuturaPT-HeavyObl.ttf b/www/fonts/FuturaPT-HeavyObl.ttf new file mode 100644 index 0000000..9e0d87f Binary files /dev/null and b/www/fonts/FuturaPT-HeavyObl.ttf differ diff --git a/www/fonts/FuturaPT-HeavyObl.woff b/www/fonts/FuturaPT-HeavyObl.woff new file mode 100644 index 0000000..b9c3183 Binary files /dev/null and b/www/fonts/FuturaPT-HeavyObl.woff differ diff --git a/www/fonts/FuturaPT-HeavyObl.woff2 b/www/fonts/FuturaPT-HeavyObl.woff2 new file mode 100644 index 0000000..a0bc1dc Binary files /dev/null and b/www/fonts/FuturaPT-HeavyObl.woff2 differ diff --git a/www/fonts/FuturaPT-Light.eot b/www/fonts/FuturaPT-Light.eot new file mode 100644 index 0000000..c420ccb Binary files /dev/null and b/www/fonts/FuturaPT-Light.eot differ diff --git a/www/fonts/FuturaPT-Light.ttf b/www/fonts/FuturaPT-Light.ttf new file mode 100644 index 0000000..f7d81fb Binary files /dev/null and b/www/fonts/FuturaPT-Light.ttf differ diff --git a/www/fonts/FuturaPT-Light.woff b/www/fonts/FuturaPT-Light.woff new file mode 100644 index 0000000..825581d Binary files /dev/null and b/www/fonts/FuturaPT-Light.woff differ diff --git a/www/fonts/FuturaPT-Light.woff2 b/www/fonts/FuturaPT-Light.woff2 new file mode 100644 index 0000000..0058f0c Binary files /dev/null and b/www/fonts/FuturaPT-Light.woff2 differ diff --git a/www/fonts/FuturaPT-LightObl.eot b/www/fonts/FuturaPT-LightObl.eot new file mode 100644 index 0000000..81731df Binary files /dev/null and b/www/fonts/FuturaPT-LightObl.eot differ diff --git a/www/fonts/FuturaPT-LightObl.ttf b/www/fonts/FuturaPT-LightObl.ttf new file mode 100644 index 0000000..62893b0 Binary files /dev/null and b/www/fonts/FuturaPT-LightObl.ttf differ diff --git a/www/fonts/FuturaPT-LightObl.woff b/www/fonts/FuturaPT-LightObl.woff new file mode 100644 index 0000000..c51442a Binary files /dev/null and b/www/fonts/FuturaPT-LightObl.woff differ diff --git a/www/fonts/FuturaPT-LightObl.woff2 b/www/fonts/FuturaPT-LightObl.woff2 new file mode 100644 index 0000000..fdf9a9e Binary files /dev/null and b/www/fonts/FuturaPT-LightObl.woff2 differ diff --git a/www/fonts/FuturaPT-Medium.eot b/www/fonts/FuturaPT-Medium.eot new file mode 100644 index 0000000..6cd6f73 Binary files /dev/null and b/www/fonts/FuturaPT-Medium.eot differ diff --git a/www/fonts/FuturaPT-Medium.ttf b/www/fonts/FuturaPT-Medium.ttf new file mode 100644 index 0000000..60401ab Binary files /dev/null and b/www/fonts/FuturaPT-Medium.ttf differ diff --git a/www/fonts/FuturaPT-Medium.woff b/www/fonts/FuturaPT-Medium.woff new file mode 100644 index 0000000..94c4126 Binary files /dev/null and b/www/fonts/FuturaPT-Medium.woff differ diff --git a/www/fonts/FuturaPT-Medium.woff2 b/www/fonts/FuturaPT-Medium.woff2 new file mode 100644 index 0000000..27ded77 Binary files /dev/null and b/www/fonts/FuturaPT-Medium.woff2 differ diff --git a/www/fonts/FuturaPT-MediumObl.eot b/www/fonts/FuturaPT-MediumObl.eot new file mode 100644 index 0000000..83ff1f2 Binary files /dev/null and b/www/fonts/FuturaPT-MediumObl.eot differ diff --git a/www/fonts/FuturaPT-MediumObl.ttf b/www/fonts/FuturaPT-MediumObl.ttf new file mode 100644 index 0000000..b09c4c2 Binary files /dev/null and b/www/fonts/FuturaPT-MediumObl.ttf differ diff --git a/www/fonts/FuturaPT-MediumObl.woff b/www/fonts/FuturaPT-MediumObl.woff new file mode 100644 index 0000000..1e0ac11 Binary files /dev/null and b/www/fonts/FuturaPT-MediumObl.woff differ diff --git a/www/fonts/FuturaPT-MediumObl.woff2 b/www/fonts/FuturaPT-MediumObl.woff2 new file mode 100644 index 0000000..108fd26 Binary files /dev/null and b/www/fonts/FuturaPT-MediumObl.woff2 differ diff --git a/www/fonts/FuturaPTCond-Bold.eot b/www/fonts/FuturaPTCond-Bold.eot new file mode 100644 index 0000000..fa60c6b Binary files /dev/null and b/www/fonts/FuturaPTCond-Bold.eot differ diff --git a/www/fonts/FuturaPTCond-Bold.ttf b/www/fonts/FuturaPTCond-Bold.ttf new file mode 100644 index 0000000..9507ad0 Binary files /dev/null and b/www/fonts/FuturaPTCond-Bold.ttf differ diff --git a/www/fonts/FuturaPTCond-Bold.woff b/www/fonts/FuturaPTCond-Bold.woff new file mode 100644 index 0000000..f93e83c Binary files /dev/null and b/www/fonts/FuturaPTCond-Bold.woff differ diff --git a/www/fonts/FuturaPTCond-Bold.woff2 b/www/fonts/FuturaPTCond-Bold.woff2 new file mode 100644 index 0000000..7e51a83 Binary files /dev/null and b/www/fonts/FuturaPTCond-Bold.woff2 differ diff --git a/www/fonts/FuturaPTCond-BoldObl.eot b/www/fonts/FuturaPTCond-BoldObl.eot new file mode 100644 index 0000000..a76bd25 Binary files /dev/null and b/www/fonts/FuturaPTCond-BoldObl.eot differ diff --git a/www/fonts/FuturaPTCond-BoldObl.ttf b/www/fonts/FuturaPTCond-BoldObl.ttf new file mode 100644 index 0000000..adf9620 Binary files /dev/null and b/www/fonts/FuturaPTCond-BoldObl.ttf differ diff --git a/www/fonts/FuturaPTCond-BoldObl.woff b/www/fonts/FuturaPTCond-BoldObl.woff new file mode 100644 index 0000000..bcae536 Binary files /dev/null and b/www/fonts/FuturaPTCond-BoldObl.woff differ diff --git a/www/fonts/FuturaPTCond-BoldObl.woff2 b/www/fonts/FuturaPTCond-BoldObl.woff2 new file mode 100644 index 0000000..98d4ba5 Binary files /dev/null and b/www/fonts/FuturaPTCond-BoldObl.woff2 differ diff --git a/www/fonts/FuturaPTCond-Book.eot b/www/fonts/FuturaPTCond-Book.eot new file mode 100644 index 0000000..f46b03c Binary files /dev/null and b/www/fonts/FuturaPTCond-Book.eot differ diff --git a/www/fonts/FuturaPTCond-Book.ttf b/www/fonts/FuturaPTCond-Book.ttf new file mode 100644 index 0000000..51831e5 Binary files /dev/null and b/www/fonts/FuturaPTCond-Book.ttf differ diff --git a/www/fonts/FuturaPTCond-Book.woff b/www/fonts/FuturaPTCond-Book.woff new file mode 100644 index 0000000..e5a0982 Binary files /dev/null and b/www/fonts/FuturaPTCond-Book.woff differ diff --git a/www/fonts/FuturaPTCond-Book.woff2 b/www/fonts/FuturaPTCond-Book.woff2 new file mode 100644 index 0000000..7868026 Binary files /dev/null and b/www/fonts/FuturaPTCond-Book.woff2 differ diff --git a/www/fonts/FuturaPTCond-BookObl.eot b/www/fonts/FuturaPTCond-BookObl.eot new file mode 100644 index 0000000..df7e537 Binary files /dev/null and b/www/fonts/FuturaPTCond-BookObl.eot differ diff --git a/www/fonts/FuturaPTCond-BookObl.ttf b/www/fonts/FuturaPTCond-BookObl.ttf new file mode 100644 index 0000000..6d96be0 Binary files /dev/null and b/www/fonts/FuturaPTCond-BookObl.ttf differ diff --git a/www/fonts/FuturaPTCond-BookObl.woff b/www/fonts/FuturaPTCond-BookObl.woff new file mode 100644 index 0000000..b8931cb Binary files /dev/null and b/www/fonts/FuturaPTCond-BookObl.woff differ diff --git a/www/fonts/FuturaPTCond-BookObl.woff2 b/www/fonts/FuturaPTCond-BookObl.woff2 new file mode 100644 index 0000000..95fe692 Binary files /dev/null and b/www/fonts/FuturaPTCond-BookObl.woff2 differ diff --git a/www/fonts/FuturaPTCond-ExtraBold.eot b/www/fonts/FuturaPTCond-ExtraBold.eot new file mode 100644 index 0000000..07fbbb1 Binary files /dev/null and b/www/fonts/FuturaPTCond-ExtraBold.eot differ diff --git a/www/fonts/FuturaPTCond-ExtraBold.ttf b/www/fonts/FuturaPTCond-ExtraBold.ttf new file mode 100644 index 0000000..14fe2bd Binary files /dev/null and b/www/fonts/FuturaPTCond-ExtraBold.ttf differ diff --git a/www/fonts/FuturaPTCond-ExtraBold.woff b/www/fonts/FuturaPTCond-ExtraBold.woff new file mode 100644 index 0000000..39b6133 Binary files /dev/null and b/www/fonts/FuturaPTCond-ExtraBold.woff differ diff --git a/www/fonts/FuturaPTCond-ExtraBold.woff2 b/www/fonts/FuturaPTCond-ExtraBold.woff2 new file mode 100644 index 0000000..e6de59b Binary files /dev/null and b/www/fonts/FuturaPTCond-ExtraBold.woff2 differ diff --git a/www/fonts/FuturaPTCond-ExtraBoldObl.eot b/www/fonts/FuturaPTCond-ExtraBoldObl.eot new file mode 100644 index 0000000..4ab2de8 Binary files /dev/null and b/www/fonts/FuturaPTCond-ExtraBoldObl.eot differ diff --git a/www/fonts/FuturaPTCond-ExtraBoldObl.ttf b/www/fonts/FuturaPTCond-ExtraBoldObl.ttf new file mode 100644 index 0000000..a297222 Binary files /dev/null and b/www/fonts/FuturaPTCond-ExtraBoldObl.ttf differ diff --git a/www/fonts/FuturaPTCond-ExtraBoldObl.woff b/www/fonts/FuturaPTCond-ExtraBoldObl.woff new file mode 100644 index 0000000..83ac3f7 Binary files /dev/null and b/www/fonts/FuturaPTCond-ExtraBoldObl.woff differ diff --git a/www/fonts/FuturaPTCond-ExtraBoldObl.woff2 b/www/fonts/FuturaPTCond-ExtraBoldObl.woff2 new file mode 100644 index 0000000..2ff462e Binary files /dev/null and b/www/fonts/FuturaPTCond-ExtraBoldObl.woff2 differ diff --git a/www/fonts/FuturaPTCond-Medium.eot b/www/fonts/FuturaPTCond-Medium.eot new file mode 100644 index 0000000..2eee3aa Binary files /dev/null and b/www/fonts/FuturaPTCond-Medium.eot differ diff --git a/www/fonts/FuturaPTCond-Medium.ttf b/www/fonts/FuturaPTCond-Medium.ttf new file mode 100644 index 0000000..9d9ebca Binary files /dev/null and b/www/fonts/FuturaPTCond-Medium.ttf differ diff --git a/www/fonts/FuturaPTCond-Medium.woff b/www/fonts/FuturaPTCond-Medium.woff new file mode 100644 index 0000000..beaab84 Binary files /dev/null and b/www/fonts/FuturaPTCond-Medium.woff differ diff --git a/www/fonts/FuturaPTCond-Medium.woff2 b/www/fonts/FuturaPTCond-Medium.woff2 new file mode 100644 index 0000000..8a8448c Binary files /dev/null and b/www/fonts/FuturaPTCond-Medium.woff2 differ diff --git a/www/fonts/FuturaPTCond-MediumObl.eot b/www/fonts/FuturaPTCond-MediumObl.eot new file mode 100644 index 0000000..0436365 Binary files /dev/null and b/www/fonts/FuturaPTCond-MediumObl.eot differ diff --git a/www/fonts/FuturaPTCond-MediumObl.ttf b/www/fonts/FuturaPTCond-MediumObl.ttf new file mode 100644 index 0000000..b0b2331 Binary files /dev/null and b/www/fonts/FuturaPTCond-MediumObl.ttf differ diff --git a/www/fonts/FuturaPTCond-MediumObl.woff b/www/fonts/FuturaPTCond-MediumObl.woff new file mode 100644 index 0000000..1b03204 Binary files /dev/null and b/www/fonts/FuturaPTCond-MediumObl.woff differ diff --git a/www/fonts/FuturaPTCond-MediumObl.woff2 b/www/fonts/FuturaPTCond-MediumObl.woff2 new file mode 100644 index 0000000..19c39c9 Binary files /dev/null and b/www/fonts/FuturaPTCond-MediumObl.woff2 differ diff --git a/www/fonts/Roboto-Black.eot b/www/fonts/Roboto-Black.eot new file mode 100644 index 0000000..cd571fd Binary files /dev/null and b/www/fonts/Roboto-Black.eot differ diff --git a/www/fonts/Roboto-Black.ttf b/www/fonts/Roboto-Black.ttf new file mode 100644 index 0000000..144abcd Binary files /dev/null and b/www/fonts/Roboto-Black.ttf differ diff --git a/www/fonts/Roboto-Black.woff b/www/fonts/Roboto-Black.woff new file mode 100644 index 0000000..d77f5a1 Binary files /dev/null and b/www/fonts/Roboto-Black.woff differ diff --git a/www/fonts/Roboto-Black.woff2 b/www/fonts/Roboto-Black.woff2 new file mode 100644 index 0000000..8dff3b1 Binary files /dev/null and b/www/fonts/Roboto-Black.woff2 differ diff --git a/www/fonts/Roboto-BlackItalic.eot b/www/fonts/Roboto-BlackItalic.eot new file mode 100644 index 0000000..4bf5ffb Binary files /dev/null and b/www/fonts/Roboto-BlackItalic.eot differ diff --git a/www/fonts/Roboto-BlackItalic.ttf b/www/fonts/Roboto-BlackItalic.ttf new file mode 100644 index 0000000..af5c0d9 Binary files /dev/null and b/www/fonts/Roboto-BlackItalic.ttf differ diff --git a/www/fonts/Roboto-BlackItalic.woff b/www/fonts/Roboto-BlackItalic.woff new file mode 100644 index 0000000..943e97e Binary files /dev/null and b/www/fonts/Roboto-BlackItalic.woff differ diff --git a/www/fonts/Roboto-BlackItalic.woff2 b/www/fonts/Roboto-BlackItalic.woff2 new file mode 100644 index 0000000..7f51191 Binary files /dev/null and b/www/fonts/Roboto-BlackItalic.woff2 differ diff --git a/www/fonts/Roboto-Bold.eot b/www/fonts/Roboto-Bold.eot new file mode 100644 index 0000000..14ad9ae Binary files /dev/null and b/www/fonts/Roboto-Bold.eot differ diff --git a/www/fonts/Roboto-Bold.ttf b/www/fonts/Roboto-Bold.ttf new file mode 100644 index 0000000..0388c50 Binary files /dev/null and b/www/fonts/Roboto-Bold.ttf differ diff --git a/www/fonts/Roboto-Bold.woff b/www/fonts/Roboto-Bold.woff new file mode 100644 index 0000000..51f1e89 Binary files /dev/null and b/www/fonts/Roboto-Bold.woff differ diff --git a/www/fonts/Roboto-Bold.woff2 b/www/fonts/Roboto-Bold.woff2 new file mode 100644 index 0000000..8d1ec3a Binary files /dev/null and b/www/fonts/Roboto-Bold.woff2 differ diff --git a/www/fonts/Roboto-BoldItalic.eot b/www/fonts/Roboto-BoldItalic.eot new file mode 100644 index 0000000..5b40508 Binary files /dev/null and b/www/fonts/Roboto-BoldItalic.eot differ diff --git a/www/fonts/Roboto-BoldItalic.ttf b/www/fonts/Roboto-BoldItalic.ttf new file mode 100644 index 0000000..0ac4cd4 Binary files /dev/null and b/www/fonts/Roboto-BoldItalic.ttf differ diff --git a/www/fonts/Roboto-BoldItalic.woff b/www/fonts/Roboto-BoldItalic.woff new file mode 100644 index 0000000..d916f94 Binary files /dev/null and b/www/fonts/Roboto-BoldItalic.woff differ diff --git a/www/fonts/Roboto-BoldItalic.woff2 b/www/fonts/Roboto-BoldItalic.woff2 new file mode 100644 index 0000000..ebca4c7 Binary files /dev/null and b/www/fonts/Roboto-BoldItalic.woff2 differ diff --git a/www/fonts/Roboto-Italic.eot b/www/fonts/Roboto-Italic.eot new file mode 100644 index 0000000..baa8a94 Binary files /dev/null and b/www/fonts/Roboto-Italic.eot differ diff --git a/www/fonts/Roboto-Italic.ttf b/www/fonts/Roboto-Italic.ttf new file mode 100644 index 0000000..d632831 Binary files /dev/null and b/www/fonts/Roboto-Italic.ttf differ diff --git a/www/fonts/Roboto-Italic.woff b/www/fonts/Roboto-Italic.woff new file mode 100644 index 0000000..8e72e8d Binary files /dev/null and b/www/fonts/Roboto-Italic.woff differ diff --git a/www/fonts/Roboto-Italic.woff2 b/www/fonts/Roboto-Italic.woff2 new file mode 100644 index 0000000..1714014 Binary files /dev/null and b/www/fonts/Roboto-Italic.woff2 differ diff --git a/www/fonts/Roboto-Light.eot b/www/fonts/Roboto-Light.eot new file mode 100644 index 0000000..3d50d57 Binary files /dev/null and b/www/fonts/Roboto-Light.eot differ diff --git a/www/fonts/Roboto-Light.ttf b/www/fonts/Roboto-Light.ttf new file mode 100644 index 0000000..3a9bdc6 Binary files /dev/null and b/www/fonts/Roboto-Light.ttf differ diff --git a/www/fonts/Roboto-Light.woff b/www/fonts/Roboto-Light.woff new file mode 100644 index 0000000..eec3617 Binary files /dev/null and b/www/fonts/Roboto-Light.woff differ diff --git a/www/fonts/Roboto-Light.woff2 b/www/fonts/Roboto-Light.woff2 new file mode 100644 index 0000000..0e0efd0 Binary files /dev/null and b/www/fonts/Roboto-Light.woff2 differ diff --git a/www/fonts/Roboto-LightItalic.eot b/www/fonts/Roboto-LightItalic.eot new file mode 100644 index 0000000..a78bfe9 Binary files /dev/null and b/www/fonts/Roboto-LightItalic.eot differ diff --git a/www/fonts/Roboto-LightItalic.ttf b/www/fonts/Roboto-LightItalic.ttf new file mode 100644 index 0000000..82e9221 Binary files /dev/null and b/www/fonts/Roboto-LightItalic.ttf differ diff --git a/www/fonts/Roboto-LightItalic.woff b/www/fonts/Roboto-LightItalic.woff new file mode 100644 index 0000000..b6b2525 Binary files /dev/null and b/www/fonts/Roboto-LightItalic.woff differ diff --git a/www/fonts/Roboto-LightItalic.woff2 b/www/fonts/Roboto-LightItalic.woff2 new file mode 100644 index 0000000..b3300d9 Binary files /dev/null and b/www/fonts/Roboto-LightItalic.woff2 differ diff --git a/www/fonts/Roboto-Medium.eot b/www/fonts/Roboto-Medium.eot new file mode 100644 index 0000000..0f60b5e Binary files /dev/null and b/www/fonts/Roboto-Medium.eot differ diff --git a/www/fonts/Roboto-Medium.ttf b/www/fonts/Roboto-Medium.ttf new file mode 100644 index 0000000..09f51e2 Binary files /dev/null and b/www/fonts/Roboto-Medium.ttf differ diff --git a/www/fonts/Roboto-Medium.woff b/www/fonts/Roboto-Medium.woff new file mode 100644 index 0000000..b4f0629 Binary files /dev/null and b/www/fonts/Roboto-Medium.woff differ diff --git a/www/fonts/Roboto-Medium.woff2 b/www/fonts/Roboto-Medium.woff2 new file mode 100644 index 0000000..02bf764 Binary files /dev/null and b/www/fonts/Roboto-Medium.woff2 differ diff --git a/www/fonts/Roboto-MediumItalic.eot b/www/fonts/Roboto-MediumItalic.eot new file mode 100644 index 0000000..141543a Binary files /dev/null and b/www/fonts/Roboto-MediumItalic.eot differ diff --git a/www/fonts/Roboto-MediumItalic.ttf b/www/fonts/Roboto-MediumItalic.ttf new file mode 100644 index 0000000..9943d85 Binary files /dev/null and b/www/fonts/Roboto-MediumItalic.ttf differ diff --git a/www/fonts/Roboto-MediumItalic.woff b/www/fonts/Roboto-MediumItalic.woff new file mode 100644 index 0000000..ca56ca3 Binary files /dev/null and b/www/fonts/Roboto-MediumItalic.woff differ diff --git a/www/fonts/Roboto-MediumItalic.woff2 b/www/fonts/Roboto-MediumItalic.woff2 new file mode 100644 index 0000000..098ab8a Binary files /dev/null and b/www/fonts/Roboto-MediumItalic.woff2 differ diff --git a/www/fonts/Roboto-Regular.eot b/www/fonts/Roboto-Regular.eot new file mode 100644 index 0000000..2f61547 Binary files /dev/null and b/www/fonts/Roboto-Regular.eot differ diff --git a/www/fonts/Roboto-Regular.ttf b/www/fonts/Roboto-Regular.ttf new file mode 100644 index 0000000..28e2c02 Binary files /dev/null and b/www/fonts/Roboto-Regular.ttf differ diff --git a/www/fonts/Roboto-Regular.woff b/www/fonts/Roboto-Regular.woff new file mode 100644 index 0000000..b070d8e Binary files /dev/null and b/www/fonts/Roboto-Regular.woff differ diff --git a/www/fonts/Roboto-Regular.woff2 b/www/fonts/Roboto-Regular.woff2 new file mode 100644 index 0000000..30370cf Binary files /dev/null and b/www/fonts/Roboto-Regular.woff2 differ diff --git a/www/fonts/Roboto-Thin.eot b/www/fonts/Roboto-Thin.eot new file mode 100644 index 0000000..65eaafa Binary files /dev/null and b/www/fonts/Roboto-Thin.eot differ diff --git a/www/fonts/Roboto-Thin.ttf b/www/fonts/Roboto-Thin.ttf new file mode 100644 index 0000000..301842a Binary files /dev/null and b/www/fonts/Roboto-Thin.ttf differ diff --git a/www/fonts/Roboto-Thin.woff b/www/fonts/Roboto-Thin.woff new file mode 100644 index 0000000..bc18032 Binary files /dev/null and b/www/fonts/Roboto-Thin.woff differ diff --git a/www/fonts/Roboto-Thin.woff2 b/www/fonts/Roboto-Thin.woff2 new file mode 100644 index 0000000..c535309 Binary files /dev/null and b/www/fonts/Roboto-Thin.woff2 differ diff --git a/www/fonts/Roboto-ThinItalic.eot b/www/fonts/Roboto-ThinItalic.eot new file mode 100644 index 0000000..e9c3118 Binary files /dev/null and b/www/fonts/Roboto-ThinItalic.eot differ diff --git a/www/fonts/Roboto-ThinItalic.ttf b/www/fonts/Roboto-ThinItalic.ttf new file mode 100644 index 0000000..301fbe1 Binary files /dev/null and b/www/fonts/Roboto-ThinItalic.ttf differ diff --git a/www/fonts/Roboto-ThinItalic.woff b/www/fonts/Roboto-ThinItalic.woff new file mode 100644 index 0000000..8863946 Binary files /dev/null and b/www/fonts/Roboto-ThinItalic.woff differ diff --git a/www/fonts/Roboto-ThinItalic.woff2 b/www/fonts/Roboto-ThinItalic.woff2 new file mode 100644 index 0000000..069ad7b Binary files /dev/null and b/www/fonts/Roboto-ThinItalic.woff2 differ diff --git a/www/fonts/feather.eot b/www/fonts/feather.eot new file mode 100644 index 0000000..58371d9 Binary files /dev/null and b/www/fonts/feather.eot differ diff --git a/www/fonts/feather.svg b/www/fonts/feather.svg new file mode 100644 index 0000000..5dda143 --- /dev/null +++ b/www/fonts/feather.svg @@ -0,0 +1,849 @@ + + + + + +Created by iconfont + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/www/fonts/feather.ttf b/www/fonts/feather.ttf new file mode 100644 index 0000000..0b33dac Binary files /dev/null and b/www/fonts/feather.ttf differ diff --git a/www/fonts/feather.woff b/www/fonts/feather.woff new file mode 100644 index 0000000..9b03a72 Binary files /dev/null and b/www/fonts/feather.woff differ diff --git a/www/fw/@popperjs/core/LICENSE.md b/www/fw/@popperjs/core/LICENSE.md new file mode 100644 index 0000000..0370c45 --- /dev/null +++ b/www/fw/@popperjs/core/LICENSE.md @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2019 Federico Zivolo + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/www/fw/@popperjs/core/README.md b/www/fw/@popperjs/core/README.md new file mode 100644 index 0000000..53be7b9 --- /dev/null +++ b/www/fw/@popperjs/core/README.md @@ -0,0 +1,376 @@ + +

+ Popper +

+ +
+

Tooltip & Popover Positioning Engine

+
+ +

+ + npm version + + + npm downloads per month (popper.js + @popperjs/core) + + + Rolling Versions + +

+ +
+ + +**Positioning tooltips and popovers is difficult. Popper is here to help!** + +Given an element, such as a button, and a tooltip element describing it, Popper +will automatically put the tooltip in the right place near the button. + +It will position _any_ UI element that "pops out" from the flow of your document +and floats near a target element. The most common example is a tooltip, but it +also includes popovers, drop-downs, and more. All of these can be generically +described as a "popper" element. + +## Demo + +[![Popper visualized](https://i.imgur.com/F7qWsmV.jpg)](https://popper.js.org) + +## Docs + +- [v2.x (latest)](https://popper.js.org/docs/v2/) +- [v1.x](https://popper.js.org/docs/v1/) + +We've created a +[Migration Guide](https://popper.js.org/docs/v2/migration-guide/) to help you +migrate from Popper 1 to Popper 2. + +To contribute to the Popper website and documentation, please visit the +[dedicated repository](https://github.com/popperjs/website). + +## Why not use pure CSS? + +- **Clipping and overflow issues**: Pure CSS poppers will not be prevented from + overflowing clipping boundaries, such as the viewport. It will get partially + cut off or overflows if it's near the edge since there is no dynamic + positioning logic. When using Popper, your popper will always be positioned in + the right place without needing manual adjustments. +- **No flipping**: CSS poppers will not flip to a different placement to fit + better in view if necessary. While you can manually adjust for the main axis + overflow, this feature cannot be achieved via CSS alone. Popper automatically + flips the tooltip to make it fit in view as best as possible for the user. +- **No virtual positioning**: CSS poppers cannot follow the mouse cursor or be + used as a context menu. Popper allows you to position your tooltip relative to + any coordinates you desire. +- **Slower development cycle**: When pure CSS is used to position popper + elements, the lack of dynamic positioning means they must be carefully placed + to consider overflow on all screen sizes. In reusable component libraries, + this means a developer can't just add the component anywhere on the page, + because these issues need to be considered and adjusted for every time. With + Popper, you can place your elements anywhere and they will be positioned + correctly, without needing to consider different screen sizes, layouts, etc. + This massively speeds up development time because this work is automatically + offloaded to Popper. +- **Lack of extensibility**: CSS poppers cannot be easily extended to fit any + arbitrary use case you may need to adjust for. Popper is built with + extensibility in mind. + +## Why Popper? + +With the CSS drawbacks out of the way, we now move on to Popper in the +JavaScript space itself. + +Naive JavaScript tooltip implementations usually have the following problems: + +- **Scrolling containers**: They don't ensure the tooltip stays with the + reference element while scrolling when inside any number of scrolling + containers. +- **DOM context**: They often require the tooltip move outside of its original + DOM context because they don't handle `offsetParent` contexts. +- **Compatibility**: Popper handles an incredible number of edge cases regarding + different browsers and environments (mobile viewports, RTL, scrollbars enabled + or disabled, etc.). Popper is a popular and well-maintained library, so you + can be confident positioning will work for your users on any device. +- **Configurability**: They often lack advanced configurability to suit any + possible use case. +- **Size**: They are usually relatively large in size, or require an ancient + jQuery dependency. +- **Performance**: They often have runtime performance issues and update the + tooltip position too slowly. + +**Popper solves all of these key problems in an elegant, performant manner.** It +is a lightweight ~3 kB library that aims to provide a reliable and extensible +positioning engine you can use to ensure all your popper elements are positioned +in the right place. + +When you start writing your own popper implementation, you'll quickly run into +all of the problems mentioned above. These widgets are incredibly common in our +UIs; we've done the hard work figuring this out so you don't need to spend hours +fixing and handling numerous edge cases that we already ran into while building +the library! + +Popper is used in popular libraries like Bootstrap, Foundation, Material UI, and +more. It's likely you've already used popper elements on the web positioned by +Popper at some point in the past few years. + +Since we write UIs using powerful abstraction libraries such as React or Angular +nowadays, you'll also be glad to know Popper can fully integrate with them and +be a good citizen together with your other components. Check out `react-popper` +for the official Popper wrapper for React. + +## Installation + +### 1. Package Manager + +```bash +# With npm +npm i @popperjs/core + +# With Yarn +yarn add @popperjs/core +``` + +### 2. CDN + +```html + + + + + +``` + +### 3. Direct Download? + +Managing dependencies by "directly downloading" them and placing them into your +source code is not recommended for a variety of reasons, including missing out +on feat/fix updates easily. Please use a versioning management system like a CDN +or npm/Yarn. + +## Usage + +The most straightforward way to get started is to import Popper from the `unpkg` +CDN, which includes all of its features. You can call the `Popper.createPopper` +constructor to create new popper instances. + +Here is a complete example: + +```html + +Popper example + + + + + + + + +``` + +Visit the [tutorial](https://popper.js.org/docs/v2/tutorial/) for an example of +how to build your own tooltip from scratch using Popper. + +### Module bundlers + +You can import the `createPopper` constructor from the fully-featured file: + +```js +import { createPopper } from '@popperjs/core'; + +const button = document.querySelector('#button'); +const tooltip = document.querySelector('#tooltip'); + +// Pass the button, the tooltip, and some options, and Popper will do the +// magic positioning for you: +createPopper(button, tooltip, { + placement: 'right', +}); +``` + +All the modifiers listed in the docs menu will be enabled and "just work", so +you don't need to think about setting Popper up. The size of Popper including +all of its features is about 5 kB minzipped, but it may grow a bit in the +future. + +#### Popper Lite (tree-shaking) + +If bundle size is important, you'll want to take advantage of tree-shaking. The +library is built in a modular way to allow to import only the parts you really +need. + +```js +import { createPopperLite as createPopper } from '@popperjs/core'; +``` + +The Lite version includes the most necessary modifiers that will compute the +offsets of the popper, compute and add the positioning styles, and add event +listeners. This is close in bundle size to pure CSS tooltip libraries, and +behaves somewhat similarly. + +However, this does not include the features that makes Popper truly useful. + +The two most useful modifiers not included in Lite are `preventOverflow` and +`flip`: + +```js +import { + createPopperLite as createPopper, + preventOverflow, + flip, +} from '@popperjs/core'; + +const button = document.querySelector('#button'); +const tooltip = document.querySelector('#tooltip'); + +createPopper(button, tooltip, { + modifiers: [preventOverflow, flip], +}); +``` + +As you make more poppers, you may be finding yourself needing other modifiers +provided by the library. + +See [tree-shaking](https://popper.js.org/docs/v2/performance/#tree-shaking) for more +information. + +## Distribution targets + +Popper is distributed in 3 different versions, in 3 different file formats. + +The 3 file formats are: + +- `esm` (works with `import` syntax — **recommended**) +- `umd` (works with ` + + + + + + + + + + + + + + + + +
+
+
+ + +
+
+
+ + + + +
+ +
+ + + + + + + + + + + + + + diff --git a/www/info.html b/www/info.html new file mode 100644 index 0000000..22bc065 --- /dev/null +++ b/www/info.html @@ -0,0 +1,146 @@ +
+ + + + +
\ No newline at end of file diff --git a/www/js/auth.js b/www/js/auth.js new file mode 100644 index 0000000..998f616 --- /dev/null +++ b/www/js/auth.js @@ -0,0 +1,140 @@ +let key = 'userData'; + +function saveUserData(data) { + console.log('Пробую сохранить данные'); + localStorage.removeItem(key); + localStorage.setItem(key,JSON.stringify(data)); + console.log('сохранил',JSON.parse(localStorage.getItem(key))); +} + +function loadUserData(){ + return JSON.parse(localStorage.getItem(key)); +} + +function removeData(){ + localStorage.removeItem(key); +} + +function loadJWT() { + console.log('запрашиваю локальные пользовательские данные'); + var data = loadUserData(); + console.log(data); + if(data){ + console.log('нашлись: ', data.accessToken); + return data.accessToken; + }else{ + console.log('данные отсутствуют'); + return null; + } +} + +function doLogout(){ + removeData(); + page('/profile'); +} + +function sendAuth() { + // Скрываем предыдущие сообщения об ошибках + document.getElementById('username').classList.remove('is-invalid'); + document.getElementById('password').classList.remove('is-invalid'); + document.getElementById('usernameError').hidden = true; + document.getElementById('passwordError').hidden = true; + + const username = document.getElementById('username').value; + const password = document.getElementById('password').value; + + const data = { + username: username, + password: password + }; + + fetch('https://api.beartrack.ru/v1/auth/signin', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(data) + }) + .then(response => { + if (!response.ok) { + return response.json().then(errData => { + throw new Error(errData.message); + }); + } + return response.json(); + }) + .then(data => { + console.log('Success:', data); + + // Сохранение токена доступа в локальное хранилище + saveUserData(data); + + // Перенаправление пользователя на страницу /profile + page('/profile'); + }) + .catch((error) => { + console.error('Error:', error.message); + + // Обработка ошибок + if (error.message === 'User Not found.') { + document.getElementById('username').classList.add('is-invalid'); + document.getElementById('usernameError').hidden = false; + document.getElementById('password').classList.add('is-invalid'); + document.getElementById('passwordError').hidden = false; + } + }); +} + +function userRegistration(){ + // Скрываем предыдущие сообщения об ошибках + document.getElementById('regUsername').classList.remove('is-invalid'); + document.getElementById('regUsernameError').hidden = true; + document.getElementById('regMail').classList.remove('is-invalid'); + document.getElementById('regMailError').hidden = true; + + const username = document.getElementById('regUsername').value; + const email = document.getElementById('regMail').value; + const password = document.getElementById('regPassword').value; + + console.log(username,email,password); + + const data = { + username: username, + email: email, + password: password + }; + + fetch('https://api.beartrack.ru/v1/auth/signup', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(data) + }) + .then(response => { + if (!response.ok) { + return response.json().then(errData => { + throw new Error(errData.message); + }); + } + return response.json(); + }) + .then(data => { + console.log('Success:', data); + // Перенаправление пользователя на страницу /profile + page('/profile'); + }) + .catch((error) => { + console.error('Error:', error.message); + + // Обработка ошибок + if (error.message === 'Failed! Username is already in use!') { + document.getElementById('regUsername').classList.add('is-invalid'); + document.getElementById('regUsernameError').hidden = false; + } + if(error.message === 'Failed! Email is already in use!') { + document.getElementById('regMail').classList.add('is-invalid'); + document.getElementById('regMailError').hidden = false; + } + }); +} \ No newline at end of file diff --git a/www/js/borderParser.js b/www/js/borderParser.js new file mode 100644 index 0000000..8f79af6 --- /dev/null +++ b/www/js/borderParser.js @@ -0,0 +1,79 @@ +function parseOSMData(xmlData) { + const parser = new DOMParser(); + const xmlDoc = parser.parseFromString(xmlData, "text/xml"); + const ways = xmlDoc.getElementsByTagName("way"); + const nodes = xmlDoc.getElementsByTagName("node"); + const relations = xmlDoc.getElementsByTagName("relation"); + const nodeMap = new Map(); + + // ref + for (let i = 0; i < nodes.length; i++) { + const node = nodes[i]; + const id = node.getAttribute("id"); + const lat = parseFloat(node.getAttribute("lat")); + const lon = parseFloat(node.getAttribute("lon")); + nodeMap.set(id, [lat, lon]); + } + + const wayMap = new Map(); + + // ways ref + for (let i = 0; i < ways.length; i++) { + const way = ways[i]; + const nds = way.getElementsByTagName("nd"); + const coordinates = []; + + for (let k = 0; k < nds.length; k++) { + const ref = nds[k].getAttribute("ref"); + if (nodeMap.has(ref)) { + coordinates.push(nodeMap.get(ref)); + } + } + + wayMap.set(way.getAttribute("id"), coordinates); + } + + const parkBoundaries = []; + + for (let i = 0; i < relations.length; i++) { + const relation = relations[i]; + const tags = relation.getElementsByTagName("tag"); + const members = relation.getElementsByTagName("member"); + + let isParkBoundary = false; + let relationName = ''; + + // , + for (let j = 0; j < tags.length; j++) { + const tag = tags[j]; + const key = tag.getAttribute("k"); + const value = tag.getAttribute("v"); + + if (key === "boundary" && value === "national_park") { + isParkBoundary = true; + } else if (key === "name") { + relationName = value; + } + } + + // , + if (isParkBoundary) { // && relationName.includes("") + console.log(relationName); + const coordinates = []; + + for (let k = 0; k < members.length; k++) { + const member = members[k]; + if (member.getAttribute("type") === "way") { + const ref = member.getAttribute("ref"); + if (wayMap.has(ref)) { + coordinates.push(...wayMap.get(ref)); + } + } + } + + parkBoundaries.push(coordinates); + } + } + + return parkBoundaries; +} \ No newline at end of file diff --git a/www/js/file-saver/CHANGELOG.md b/www/js/file-saver/CHANGELOG.md new file mode 100644 index 0000000..c8c7955 --- /dev/null +++ b/www/js/file-saver/CHANGELOG.md @@ -0,0 +1,64 @@ +# Changelog +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [2.0.5] - 2020-11-18 + +- Fix server side rendering + +## [2.0.2] - 2019-05-14 + +- Catching an exception on Send (HEAD) ([#534]) + +## [2.0.0] - 2018-10-17 + +- Removed eval to resolve CSP ([#465]) + +## [2.0.0-rc.4] - 2018-10-17 + +- Don’t throw on module.exports + +## [2.0.0-rc.3] - 2018-09-27 + +- Switch export method + +## [2.0.0-rc.2] - 2018-09-26 + +- Added a changelog.md +- Reverted `a.click()` to use dispatch with a try-catch ([#465], [#382]) +- Made third argument to an object where you have to pass `{ autoBom: true }` + - boolean are depricated but still works + +## [2.0.0-rc.1] - 2018-09-26 + +- saveAs don't return anything + - The object that dispatched `writestart progress write writeend` are gone + - detecting such features was never possible and nobody seems to use it. +- Removed the demo folder +- Removed date/version from top of the file +- Dosen't crash in web workers ([#449]) +- Support saving urls ([#260] with workarounds for cross origin) +- Uses babel universal module pattern (UMD) to export the package +- Provides source map now as well. +- use a[download] before msSaveAs ([#193], [#294]) +- removed dist from .gitignore (npm uses it if it don't find a .npmignore) +- autoBom is now reversed so you have to tell when you want to use autoBom ([#432]) +- `a.click()` since there are new and depricated event constructors that works differently ([#382]) +- opens up a new popup (tab) directly for the fallback method since the FileReader is async +- removed the explicitly MSIE [1-9] check +- Uses new anchor link for each save (might solve multiple download problems) + + [#382]: https://github.com/eligrey/FileSaver.js/issues/382 + [#449]: https://github.com/eligrey/FileSaver.js/issues/449 + [#260]: https://github.com/eligrey/FileSaver.js/issues/260 + [#193]: https://github.com/eligrey/FileSaver.js/issues/193 + [#294]: https://github.com/eligrey/FileSaver.js/issues/294 + [#432]: https://github.com/eligrey/FileSaver.js/issues/432 + [#382]: https://github.com/eligrey/FileSaver.js/issues/382 + [#465]: https://github.com/eligrey/FileSaver.js/issues/465 + [#469]: https://github.com/eligrey/FileSaver.js/issues/469 + [#470]: https://github.com/eligrey/FileSaver.js/issues/470 + [#491]: https://github.com/eligrey/FileSaver.js/issues/491 + [#534]: https://github.com/eligrey/FileSaver.js/issues/534 diff --git a/www/js/file-saver/LICENSE.md b/www/js/file-saver/LICENSE.md new file mode 100644 index 0000000..32ef3ca --- /dev/null +++ b/www/js/file-saver/LICENSE.md @@ -0,0 +1,11 @@ +The MIT License + +Copyright © 2016 [Eli Grey][1]. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + [1]: http://eligrey.com diff --git a/www/js/file-saver/README.md b/www/js/file-saver/README.md new file mode 100644 index 0000000..8cf55b0 --- /dev/null +++ b/www/js/file-saver/README.md @@ -0,0 +1,150 @@ +If you need to save really large files bigger than the blob's size limitation or don't have +enough RAM, then have a look at the more advanced [StreamSaver.js][7] +that can save data directly to the hard drive asynchronously with the power of the new streams API. That will have +support for progress, cancelation and knowing when it's done writing + +FileSaver.js +============ + +FileSaver.js is the solution to saving files on the client-side, and is perfect for +web apps that generates files on the client, However if the file is coming from the +server we recommend you to first try to use [Content-Disposition][8] attachment response header as it has more cross-browser compatiblity. + +Looking for `canvas.toBlob()` for saving canvases? Check out +[canvas-toBlob.js][2] for a cross-browser implementation. + +Supported Browsers +------------------ + +| Browser | Constructs as | Filenames | Max Blob Size | Dependencies | +| -------------- | ------------- | ------------ | ------------- | ------------ | +| Firefox 20+ | Blob | Yes | 800 MiB | None | +| Firefox < 20 | data: URI | No | n/a | [Blob.js](https://github.com/eligrey/Blob.js) | +| Chrome | Blob | Yes | [2GB][3] | None | +| Chrome for Android | Blob | Yes | [RAM/5][3] | None | +| Edge | Blob | Yes | ? | None | +| IE 10+ | Blob | Yes | 600 MiB | None | +| Opera 15+ | Blob | Yes | 500 MiB | None | +| Opera < 15 | data: URI | No | n/a | [Blob.js](https://github.com/eligrey/Blob.js) | +| Safari 6.1+* | Blob | No | ? | None | +| Safari < 6 | data: URI | No | n/a | [Blob.js](https://github.com/eligrey/Blob.js) | +| Safari 10.1+   | Blob         | Yes         | n/a           | None | + +Feature detection is possible: + +```js +try { + var isFileSaverSupported = !!new Blob; +} catch (e) {} +``` + +### IE < 10 + +It is possible to save text files in IE < 10 without Flash-based polyfills. +See [ChenWenBrian and koffsyrup's `saveTextAs()`](https://github.com/koffsyrup/FileSaver.js#examples) for more details. + +### Safari 6.1+ + +Blobs may be opened instead of saved sometimes—you may have to direct your Safari users to manually +press +S to save the file after it is opened. Using the `application/octet-stream` MIME type to force downloads [can cause issues in Safari](https://github.com/eligrey/FileSaver.js/issues/12#issuecomment-47247096). + +### iOS + +saveAs must be run within a user interaction event such as onTouchDown or onClick; setTimeout will prevent saveAs from triggering. Due to restrictions in iOS saveAs opens in a new window instead of downloading, if you want this fixed please [tell Apple how this WebKit bug is affecting you](https://bugs.webkit.org/show_bug.cgi?id=167341). + +Syntax +------ +### Import `saveAs()` from file-saver +```js +import { saveAs } from 'file-saver'; +``` + +```js +FileSaver saveAs(Blob/File/Url, optional DOMString filename, optional Object { autoBom }) +``` + +Pass `{ autoBom: true }` if you want FileSaver.js to automatically provide Unicode text encoding hints (see: [byte order mark](https://en.wikipedia.org/wiki/Byte_order_mark)). Note that this is only done if your blob type has `charset=utf-8` set. + +Examples +-------- + +### Saving text using `require()` +```js +var FileSaver = require('file-saver'); +var blob = new Blob(["Hello, world!"], {type: "text/plain;charset=utf-8"}); +FileSaver.saveAs(blob, "hello world.txt"); +``` + +### Saving text + +```js +var blob = new Blob(["Hello, world!"], {type: "text/plain;charset=utf-8"}); +FileSaver.saveAs(blob, "hello world.txt"); +``` + +### Saving URLs + +```js +FileSaver.saveAs("https://httpbin.org/image", "image.jpg"); +``` +Using URLs within the same origin will just use `a[download]`. +Otherwise, it will first check if it supports cors header with a synchronous head request. +If it does, it will download the data and save using blob URLs. +If not, it will try to download it using `a[download]`. + +The standard W3C File API [`Blob`][4] interface is not available in all browsers. +[Blob.js][5] is a cross-browser `Blob` implementation that solves this. + +### Saving a canvas +```js +var canvas = document.getElementById("my-canvas"); +canvas.toBlob(function(blob) { + saveAs(blob, "pretty image.png"); +}); +``` + +Note: The standard HTML5 `canvas.toBlob()` method is not available in all browsers. +[canvas-toBlob.js][6] is a cross-browser `canvas.toBlob()` that polyfills this. + +### Saving File + +You can save a File constructor without specifying a filename. If the +file itself already contains a name, there is a hand full of ways to get a file +instance (from storage, file input, new constructor, clipboard event). +If you still want to change the name, then you can change it in the 2nd argument. + +```js +// Note: Ie and Edge don't support the new File constructor, +// so it's better to construct blobs and use saveAs(blob, filename) +var file = new File(["Hello, world!"], "hello world.txt", {type: "text/plain;charset=utf-8"}); +FileSaver.saveAs(file); +``` + + + +![Tracking image](https://in.getclicky.com/212712ns.gif) + + [1]: http://eligrey.com/demos/FileSaver.js/ + [2]: https://github.com/eligrey/canvas-toBlob.js + [3]: https://bugs.chromium.org/p/chromium/issues/detail?id=375297#c107 + [4]: https://developer.mozilla.org/en-US/docs/DOM/Blob + [5]: https://github.com/eligrey/Blob.js + [6]: https://github.com/eligrey/canvas-toBlob.js + [7]: https://github.com/jimmywarting/StreamSaver.js + [8]: https://github.com/eligrey/FileSaver.js/wiki/Saving-a-remote-file#using-http-header + +Installation +------------------ + +```bash +# Basic Node.JS installation +npm install file-saver --save +bower install file-saver +``` + +Additionally, TypeScript definitions can be installed via: + +```bash +# Additional typescript definitions +npm install @types/file-saver --save-dev +``` diff --git a/www/js/file-saver/dist/FileSaver.js b/www/js/file-saver/dist/FileSaver.js new file mode 100644 index 0000000..e07c980 --- /dev/null +++ b/www/js/file-saver/dist/FileSaver.js @@ -0,0 +1,188 @@ +(function (global, factory) { + if (typeof define === "function" && define.amd) { + define([], factory); + } else if (typeof exports !== "undefined") { + factory(); + } else { + var mod = { + exports: {} + }; + factory(); + global.FileSaver = mod.exports; + } +})(this, function () { + "use strict"; + + /* + * FileSaver.js + * A saveAs() FileSaver implementation. + * + * By Eli Grey, http://eligrey.com + * + * License : https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md (MIT) + * source : http://purl.eligrey.com/github/FileSaver.js + */ + // The one and only way of getting global scope in all environments + // https://stackoverflow.com/q/3277182/1008999 + var _global = typeof window === 'object' && window.window === window ? window : typeof self === 'object' && self.self === self ? self : typeof global === 'object' && global.global === global ? global : void 0; + + function bom(blob, opts) { + if (typeof opts === 'undefined') opts = { + autoBom: false + };else if (typeof opts !== 'object') { + console.warn('Deprecated: Expected third argument to be a object'); + opts = { + autoBom: !opts + }; + } // prepend BOM for UTF-8 XML and text/* types (including HTML) + // note: your browser will automatically convert UTF-16 U+FEFF to EF BB BF + + if (opts.autoBom && /^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(blob.type)) { + return new Blob([String.fromCharCode(0xFEFF), blob], { + type: blob.type + }); + } + + return blob; + } + + function download(url, name, opts) { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url); + xhr.responseType = 'blob'; + + xhr.onload = function () { + saveAs(xhr.response, name, opts); + }; + + xhr.onerror = function () { + console.error('could not download file'); + }; + + xhr.send(); + } + + function corsEnabled(url) { + var xhr = new XMLHttpRequest(); // use sync to avoid popup blocker + + xhr.open('HEAD', url, false); + + try { + xhr.send(); + } catch (e) {} + + return xhr.status >= 200 && xhr.status <= 299; + } // `a.click()` doesn't work for all browsers (#465) + + + function click(node) { + try { + node.dispatchEvent(new MouseEvent('click')); + } catch (e) { + var evt = document.createEvent('MouseEvents'); + evt.initMouseEvent('click', true, true, window, 0, 0, 0, 80, 20, false, false, false, false, 0, null); + node.dispatchEvent(evt); + } + } // Detect WebView inside a native macOS app by ruling out all browsers + // We just need to check for 'Safari' because all other browsers (besides Firefox) include that too + // https://www.whatismybrowser.com/guides/the-latest-user-agent/macos + + + var isMacOSWebView = _global.navigator && /Macintosh/.test(navigator.userAgent) && /AppleWebKit/.test(navigator.userAgent) && !/Safari/.test(navigator.userAgent); + var saveAs = _global.saveAs || ( // probably in some web worker + typeof window !== 'object' || window !== _global ? function saveAs() {} + /* noop */ + // Use download attribute first if possible (#193 Lumia mobile) unless this is a macOS WebView + : 'download' in HTMLAnchorElement.prototype && !isMacOSWebView ? function saveAs(blob, name, opts) { + var URL = _global.URL || _global.webkitURL; + var a = document.createElement('a'); + name = name || blob.name || 'download'; + a.download = name; + a.rel = 'noopener'; // tabnabbing + // TODO: detect chrome extensions & packaged apps + // a.target = '_blank' + + if (typeof blob === 'string') { + // Support regular links + a.href = blob; + + if (a.origin !== location.origin) { + corsEnabled(a.href) ? download(blob, name, opts) : click(a, a.target = '_blank'); + } else { + click(a); + } + } else { + // Support blobs + a.href = URL.createObjectURL(blob); + setTimeout(function () { + URL.revokeObjectURL(a.href); + }, 4E4); // 40s + + setTimeout(function () { + click(a); + }, 0); + } + } // Use msSaveOrOpenBlob as a second approach + : 'msSaveOrOpenBlob' in navigator ? function saveAs(blob, name, opts) { + name = name || blob.name || 'download'; + + if (typeof blob === 'string') { + if (corsEnabled(blob)) { + download(blob, name, opts); + } else { + var a = document.createElement('a'); + a.href = blob; + a.target = '_blank'; + setTimeout(function () { + click(a); + }); + } + } else { + navigator.msSaveOrOpenBlob(bom(blob, opts), name); + } + } // Fallback to using FileReader and a popup + : function saveAs(blob, name, opts, popup) { + // Open a popup immediately do go around popup blocker + // Mostly only available on user interaction and the fileReader is async so... + popup = popup || open('', '_blank'); + + if (popup) { + popup.document.title = popup.document.body.innerText = 'downloading...'; + } + + if (typeof blob === 'string') return download(blob, name, opts); + var force = blob.type === 'application/octet-stream'; + + var isSafari = /constructor/i.test(_global.HTMLElement) || _global.safari; + + var isChromeIOS = /CriOS\/[\d]+/.test(navigator.userAgent); + + if ((isChromeIOS || force && isSafari || isMacOSWebView) && typeof FileReader !== 'undefined') { + // Safari doesn't allow downloading of blob URLs + var reader = new FileReader(); + + reader.onloadend = function () { + var url = reader.result; + url = isChromeIOS ? url : url.replace(/^data:[^;]*;/, 'data:attachment/file;'); + if (popup) popup.location.href = url;else location = url; + popup = null; // reverse-tabnabbing #460 + }; + + reader.readAsDataURL(blob); + } else { + var URL = _global.URL || _global.webkitURL; + var url = URL.createObjectURL(blob); + if (popup) popup.location = url;else location.href = url; + popup = null; // reverse-tabnabbing #460 + + setTimeout(function () { + URL.revokeObjectURL(url); + }, 4E4); // 40s + } + }); + _global.saveAs = saveAs.saveAs = saveAs; + + if (typeof module !== 'undefined') { + module.exports = saveAs; + } +}); diff --git a/www/js/file-saver/dist/FileSaver.min.js b/www/js/file-saver/dist/FileSaver.min.js new file mode 100644 index 0000000..77f4ff9 --- /dev/null +++ b/www/js/file-saver/dist/FileSaver.min.js @@ -0,0 +1,3 @@ +(function(a,b){if("function"==typeof define&&define.amd)define([],b);else if("undefined"!=typeof exports)b();else{b(),a.FileSaver={exports:{}}.exports}})(this,function(){"use strict";function b(a,b){return"undefined"==typeof b?b={autoBom:!1}:"object"!=typeof b&&(console.warn("Deprecated: Expected third argument to be a object"),b={autoBom:!b}),b.autoBom&&/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(a.type)?new Blob(["\uFEFF",a],{type:a.type}):a}function c(a,b,c){var d=new XMLHttpRequest;d.open("GET",a),d.responseType="blob",d.onload=function(){g(d.response,b,c)},d.onerror=function(){console.error("could not download file")},d.send()}function d(a){var b=new XMLHttpRequest;b.open("HEAD",a,!1);try{b.send()}catch(a){}return 200<=b.status&&299>=b.status}function e(a){try{a.dispatchEvent(new MouseEvent("click"))}catch(c){var b=document.createEvent("MouseEvents");b.initMouseEvent("click",!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),a.dispatchEvent(b)}}var f="object"==typeof window&&window.window===window?window:"object"==typeof self&&self.self===self?self:"object"==typeof global&&global.global===global?global:void 0,a=f.navigator&&/Macintosh/.test(navigator.userAgent)&&/AppleWebKit/.test(navigator.userAgent)&&!/Safari/.test(navigator.userAgent),g=f.saveAs||("object"!=typeof window||window!==f?function(){}:"download"in HTMLAnchorElement.prototype&&!a?function(b,g,h){var i=f.URL||f.webkitURL,j=document.createElement("a");g=g||b.name||"download",j.download=g,j.rel="noopener","string"==typeof b?(j.href=b,j.origin===location.origin?e(j):d(j.href)?c(b,g,h):e(j,j.target="_blank")):(j.href=i.createObjectURL(b),setTimeout(function(){i.revokeObjectURL(j.href)},4E4),setTimeout(function(){e(j)},0))}:"msSaveOrOpenBlob"in navigator?function(f,g,h){if(g=g||f.name||"download","string"!=typeof f)navigator.msSaveOrOpenBlob(b(f,h),g);else if(d(f))c(f,g,h);else{var i=document.createElement("a");i.href=f,i.target="_blank",setTimeout(function(){e(i)})}}:function(b,d,e,g){if(g=g||open("","_blank"),g&&(g.document.title=g.document.body.innerText="downloading..."),"string"==typeof b)return c(b,d,e);var h="application/octet-stream"===b.type,i=/constructor/i.test(f.HTMLElement)||f.safari,j=/CriOS\/[\d]+/.test(navigator.userAgent);if((j||h&&i||a)&&"undefined"!=typeof FileReader){var k=new FileReader;k.onloadend=function(){var a=k.result;a=j?a:a.replace(/^data:[^;]*;/,"data:attachment/file;"),g?g.location.href=a:location=a,g=null},k.readAsDataURL(b)}else{var l=f.URL||f.webkitURL,m=l.createObjectURL(b);g?g.location=m:location.href=m,g=null,setTimeout(function(){l.revokeObjectURL(m)},4E4)}});f.saveAs=g.saveAs=g,"undefined"!=typeof module&&(module.exports=g)}); + +//# sourceMappingURL=FileSaver.min.js.map \ No newline at end of file diff --git a/www/js/file-saver/dist/FileSaver.min.js.map b/www/js/file-saver/dist/FileSaver.min.js.map new file mode 100644 index 0000000..0df89e0 --- /dev/null +++ b/www/js/file-saver/dist/FileSaver.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/FileSaver.js"],"names":[],"mappings":"uLAkBA,QAAS,CAAA,CAAT,CAAc,CAAd,CAAoB,CAApB,CAA0B,OACJ,WAAhB,QAAO,CAAA,CADa,CACS,CAAI,CAAG,CAAE,OAAO,GAAT,CADhB,CAEC,QAAhB,QAAO,CAAA,CAFQ,GAGtB,OAAO,CAAC,IAAR,CAAa,oDAAb,CAHsB,CAItB,CAAI,CAAG,CAAE,OAAO,CAAE,CAAC,CAAZ,CAJe,EASpB,CAAI,CAAC,OAAL,EAAgB,6EAA6E,IAA7E,CAAkF,CAAI,CAAC,IAAvF,CATI,CAUf,GAAI,CAAA,IAAJ,CAAS,UAA8B,CAA9B,CAAT,CAA8C,CAAE,IAAI,CAAE,CAAI,CAAC,IAAb,CAA9C,CAVe,CAYjB,CACR,CAED,QAAS,CAAA,CAAT,CAAmB,CAAnB,CAAwB,CAAxB,CAA8B,CAA9B,CAAoC,CAClC,GAAI,CAAA,CAAG,CAAG,GAAI,CAAA,cAAd,CACA,CAAG,CAAC,IAAJ,CAAS,KAAT,CAAgB,CAAhB,CAFkC,CAGlC,CAAG,CAAC,YAAJ,CAAmB,MAHe,CAIlC,CAAG,CAAC,MAAJ,CAAa,UAAY,CACvB,CAAM,CAAC,CAAG,CAAC,QAAL,CAAe,CAAf,CAAqB,CAArB,CACP,CANiC,CAOlC,CAAG,CAAC,OAAJ,CAAc,UAAY,CACxB,OAAO,CAAC,KAAR,CAAc,yBAAd,CACD,CATiC,CAUlC,CAAG,CAAC,IAAJ,EACD,CAED,QAAS,CAAA,CAAT,CAAsB,CAAtB,CAA2B,CACzB,GAAI,CAAA,CAAG,CAAG,GAAI,CAAA,cAAd,CAEA,CAAG,CAAC,IAAJ,CAAS,MAAT,CAAiB,CAAjB,IAHyB,CAIzB,GAAI,CACF,CAAG,CAAC,IAAJ,EACD,CAAC,MAAO,CAAP,CAAU,CAAE,CACd,MAAqB,IAAd,EAAA,CAAG,CAAC,MAAJ,EAAmC,GAAd,EAAA,CAAG,CAAC,MACjC,CAGD,QAAS,CAAA,CAAT,CAAgB,CAAhB,CAAsB,CACpB,GAAI,CACF,CAAI,CAAC,aAAL,CAAmB,GAAI,CAAA,UAAJ,CAAe,OAAf,CAAnB,CACD,CAAC,MAAO,CAAP,CAAU,CACV,GAAI,CAAA,CAAG,CAAG,QAAQ,CAAC,WAAT,CAAqB,aAArB,CAAV,CACA,CAAG,CAAC,cAAJ,CAAmB,OAAnB,OAAwC,MAAxC,CAAgD,CAAhD,CAAmD,CAAnD,CAAsD,CAAtD,CAAyD,EAAzD,CACsB,EADtB,aACsD,CADtD,CACyD,IADzD,CAFU,CAIV,CAAI,CAAC,aAAL,CAAmB,CAAnB,CACD,CACF,C,GAtDG,CAAA,CAAO,CAAqB,QAAlB,QAAO,CAAA,MAAP,EAA8B,MAAM,CAAC,MAAP,GAAkB,MAAhD,CACV,MADU,CACe,QAAhB,QAAO,CAAA,IAAP,EAA4B,IAAI,CAAC,IAAL,GAAc,IAA1C,CACT,IADS,CACgB,QAAlB,QAAO,CAAA,MAAP,EAA8B,MAAM,CAAC,MAAP,GAAkB,MAAhD,CACP,MADO,O,CAyDP,CAAc,CAAG,CAAO,CAAC,SAAR,EAAqB,YAAY,IAAZ,CAAiB,SAAS,CAAC,SAA3B,CAArB,EAA8D,cAAc,IAAd,CAAmB,SAAS,CAAC,SAA7B,CAA9D,EAAyG,CAAC,SAAS,IAAT,CAAc,SAAS,CAAC,SAAxB,C,CAE3H,CAAM,CAAG,CAAO,CAAC,MAAR,GAEQ,QAAlB,QAAO,CAAA,MAAP,EAA8B,MAAM,GAAK,CAA1C,CACI,UAAmB,CAAc,CADrC,CAIG,YAAc,CAAA,iBAAiB,CAAC,SAAhC,EAA6C,CAAC,CAA/C,CACA,SAAiB,CAAjB,CAAuB,CAAvB,CAA6B,CAA7B,CAAmC,IAC/B,CAAA,CAAG,CAAG,CAAO,CAAC,GAAR,EAAe,CAAO,CAAC,SADE,CAE/B,CAAC,CAAG,QAAQ,CAAC,aAAT,CAAuB,GAAvB,CAF2B,CAGnC,CAAI,CAAG,CAAI,EAAI,CAAI,CAAC,IAAb,EAAqB,UAHO,CAKnC,CAAC,CAAC,QAAF,CAAa,CALsB,CAMnC,CAAC,CAAC,GAAF,CAAQ,UAN2B,CAWf,QAAhB,QAAO,CAAA,CAXwB,EAajC,CAAC,CAAC,IAAF,CAAS,CAbwB,CAc7B,CAAC,CAAC,MAAF,GAAa,QAAQ,CAAC,MAdO,CAmB/B,CAAK,CAAC,CAAD,CAnB0B,CAe/B,CAAW,CAAC,CAAC,CAAC,IAAH,CAAX,CACI,CAAQ,CAAC,CAAD,CAAO,CAAP,CAAa,CAAb,CADZ,CAEI,CAAK,CAAC,CAAD,CAAI,CAAC,CAAC,MAAF,CAAW,QAAf,CAjBsB,GAuBjC,CAAC,CAAC,IAAF,CAAS,CAAG,CAAC,eAAJ,CAAoB,CAApB,CAvBwB,CAwBjC,UAAU,CAAC,UAAY,CAAE,CAAG,CAAC,eAAJ,CAAoB,CAAC,CAAC,IAAtB,CAA6B,CAA5C,CAA8C,GAA9C,CAxBuB,CAyBjC,UAAU,CAAC,UAAY,CAAE,CAAK,CAAC,CAAD,CAAK,CAAzB,CAA2B,CAA3B,CAzBuB,CA2BpC,CA5BC,CA+BA,oBAAsB,CAAA,SAAtB,CACA,SAAiB,CAAjB,CAAuB,CAAvB,CAA6B,CAA7B,CAAmC,CAGnC,GAFA,CAAI,CAAG,CAAI,EAAI,CAAI,CAAC,IAAb,EAAqB,UAE5B,CAAoB,QAAhB,QAAO,CAAA,CAAX,CAUE,SAAS,CAAC,gBAAV,CAA2B,CAAG,CAAC,CAAD,CAAO,CAAP,CAA9B,CAA4C,CAA5C,CAVF,KACE,IAAI,CAAW,CAAC,CAAD,CAAf,CACE,CAAQ,CAAC,CAAD,CAAO,CAAP,CAAa,CAAb,CADV,KAEO,CACL,GAAI,CAAA,CAAC,CAAG,QAAQ,CAAC,aAAT,CAAuB,GAAvB,CAAR,CACA,CAAC,CAAC,IAAF,CAAS,CAFJ,CAGL,CAAC,CAAC,MAAF,CAAW,QAHN,CAIL,UAAU,CAAC,UAAY,CAAE,CAAK,CAAC,CAAD,CAAK,CAAzB,CACX,CAIJ,CAhBC,CAmBA,SAAiB,CAAjB,CAAuB,CAAvB,CAA6B,CAA7B,CAAmC,CAAnC,CAA0C,CAS1C,GANA,CAAK,CAAG,CAAK,EAAI,IAAI,CAAC,EAAD,CAAK,QAAL,CAMrB,CALI,CAKJ,GAJE,CAAK,CAAC,QAAN,CAAe,KAAf,CACA,CAAK,CAAC,QAAN,CAAe,IAAf,CAAoB,SAApB,CAAgC,gBAGlC,EAAoB,QAAhB,QAAO,CAAA,CAAX,CAA8B,MAAO,CAAA,CAAQ,CAAC,CAAD,CAAO,CAAP,CAAa,CAAb,CAAf,CATY,GAWtC,CAAA,CAAK,CAAiB,0BAAd,GAAA,CAAI,CAAC,IAXyB,CAYtC,CAAQ,CAAG,eAAe,IAAf,CAAoB,CAAO,CAAC,WAA5B,GAA4C,CAAO,CAAC,MAZzB,CAatC,CAAW,CAAG,eAAe,IAAf,CAAoB,SAAS,CAAC,SAA9B,CAbwB,CAe1C,GAAI,CAAC,CAAW,EAAK,CAAK,EAAI,CAAzB,EAAsC,CAAvC,GAAgF,WAAtB,QAAO,CAAA,UAArE,CAAiG,CAE/F,GAAI,CAAA,CAAM,CAAG,GAAI,CAAA,UAAjB,CACA,CAAM,CAAC,SAAP,CAAmB,UAAY,CAC7B,GAAI,CAAA,CAAG,CAAG,CAAM,CAAC,MAAjB,CACA,CAAG,CAAG,CAAW,CAAG,CAAH,CAAS,CAAG,CAAC,OAAJ,CAAY,cAAZ,CAA4B,uBAA5B,CAFG,CAGzB,CAHyB,CAGlB,CAAK,CAAC,QAAN,CAAe,IAAf,CAAsB,CAHJ,CAIxB,QAAQ,CAAG,CAJa,CAK7B,CAAK,CAAG,IACT,CAT8F,CAU/F,CAAM,CAAC,aAAP,CAAqB,CAArB,CACD,CAXD,IAWO,IACD,CAAA,CAAG,CAAG,CAAO,CAAC,GAAR,EAAe,CAAO,CAAC,SAD5B,CAED,CAAG,CAAG,CAAG,CAAC,eAAJ,CAAoB,CAApB,CAFL,CAGD,CAHC,CAGM,CAAK,CAAC,QAAN,CAAiB,CAHvB,CAIA,QAAQ,CAAC,IAAT,CAAgB,CAJhB,CAKL,CAAK,CAAG,IALH,CAML,UAAU,CAAC,UAAY,CAAE,CAAG,CAAC,eAAJ,CAAoB,CAApB,CAA0B,CAAzC,CAA2C,GAA3C,CACX,CACF,CA1FU,C,CA6Fb,CAAO,CAAC,MAAR,CAAiB,CAAM,CAAC,MAAP,CAAgB,C,CAEX,WAAlB,QAAO,CAAA,M,GACT,MAAM,CAAC,OAAP,CAAiB,C","file":"FileSaver.min.js","sourcesContent":["/*\n* FileSaver.js\n* A saveAs() FileSaver implementation.\n*\n* By Eli Grey, http://eligrey.com\n*\n* License : https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md (MIT)\n* source : http://purl.eligrey.com/github/FileSaver.js\n*/\n\n// The one and only way of getting global scope in all environments\n// https://stackoverflow.com/q/3277182/1008999\nvar _global = typeof window === 'object' && window.window === window\n ? window : typeof self === 'object' && self.self === self\n ? self : typeof global === 'object' && global.global === global\n ? global\n : this\n\nfunction bom (blob, opts) {\n if (typeof opts === 'undefined') opts = { autoBom: false }\n else if (typeof opts !== 'object') {\n console.warn('Deprecated: Expected third argument to be a object')\n opts = { autoBom: !opts }\n }\n\n // prepend BOM for UTF-8 XML and text/* types (including HTML)\n // note: your browser will automatically convert UTF-16 U+FEFF to EF BB BF\n if (opts.autoBom && /^\\s*(?:text\\/\\S*|application\\/xml|\\S*\\/\\S*\\+xml)\\s*;.*charset\\s*=\\s*utf-8/i.test(blob.type)) {\n return new Blob([String.fromCharCode(0xFEFF), blob], { type: blob.type })\n }\n return blob\n}\n\nfunction download (url, name, opts) {\n var xhr = new XMLHttpRequest()\n xhr.open('GET', url)\n xhr.responseType = 'blob'\n xhr.onload = function () {\n saveAs(xhr.response, name, opts)\n }\n xhr.onerror = function () {\n console.error('could not download file')\n }\n xhr.send()\n}\n\nfunction corsEnabled (url) {\n var xhr = new XMLHttpRequest()\n // use sync to avoid popup blocker\n xhr.open('HEAD', url, false)\n try {\n xhr.send()\n } catch (e) {}\n return xhr.status >= 200 && xhr.status <= 299\n}\n\n// `a.click()` doesn't work for all browsers (#465)\nfunction click (node) {\n try {\n node.dispatchEvent(new MouseEvent('click'))\n } catch (e) {\n var evt = document.createEvent('MouseEvents')\n evt.initMouseEvent('click', true, true, window, 0, 0, 0, 80,\n 20, false, false, false, false, 0, null)\n node.dispatchEvent(evt)\n }\n}\n\n// Detect WebView inside a native macOS app by ruling out all browsers\n// We just need to check for 'Safari' because all other browsers (besides Firefox) include that too\n// https://www.whatismybrowser.com/guides/the-latest-user-agent/macos\nvar isMacOSWebView = _global.navigator && /Macintosh/.test(navigator.userAgent) && /AppleWebKit/.test(navigator.userAgent) && !/Safari/.test(navigator.userAgent)\n\nvar saveAs = _global.saveAs || (\n // probably in some web worker\n (typeof window !== 'object' || window !== _global)\n ? function saveAs () { /* noop */ }\n\n // Use download attribute first if possible (#193 Lumia mobile) unless this is a macOS WebView\n : ('download' in HTMLAnchorElement.prototype && !isMacOSWebView)\n ? function saveAs (blob, name, opts) {\n var URL = _global.URL || _global.webkitURL\n var a = document.createElement('a')\n name = name || blob.name || 'download'\n\n a.download = name\n a.rel = 'noopener' // tabnabbing\n\n // TODO: detect chrome extensions & packaged apps\n // a.target = '_blank'\n\n if (typeof blob === 'string') {\n // Support regular links\n a.href = blob\n if (a.origin !== location.origin) {\n corsEnabled(a.href)\n ? download(blob, name, opts)\n : click(a, a.target = '_blank')\n } else {\n click(a)\n }\n } else {\n // Support blobs\n a.href = URL.createObjectURL(blob)\n setTimeout(function () { URL.revokeObjectURL(a.href) }, 4E4) // 40s\n setTimeout(function () { click(a) }, 0)\n }\n }\n\n // Use msSaveOrOpenBlob as a second approach\n : 'msSaveOrOpenBlob' in navigator\n ? function saveAs (blob, name, opts) {\n name = name || blob.name || 'download'\n\n if (typeof blob === 'string') {\n if (corsEnabled(blob)) {\n download(blob, name, opts)\n } else {\n var a = document.createElement('a')\n a.href = blob\n a.target = '_blank'\n setTimeout(function () { click(a) })\n }\n } else {\n navigator.msSaveOrOpenBlob(bom(blob, opts), name)\n }\n }\n\n // Fallback to using FileReader and a popup\n : function saveAs (blob, name, opts, popup) {\n // Open a popup immediately do go around popup blocker\n // Mostly only available on user interaction and the fileReader is async so...\n popup = popup || open('', '_blank')\n if (popup) {\n popup.document.title =\n popup.document.body.innerText = 'downloading...'\n }\n\n if (typeof blob === 'string') return download(blob, name, opts)\n\n var force = blob.type === 'application/octet-stream'\n var isSafari = /constructor/i.test(_global.HTMLElement) || _global.safari\n var isChromeIOS = /CriOS\\/[\\d]+/.test(navigator.userAgent)\n\n if ((isChromeIOS || (force && isSafari) || isMacOSWebView) && typeof FileReader !== 'undefined') {\n // Safari doesn't allow downloading of blob URLs\n var reader = new FileReader()\n reader.onloadend = function () {\n var url = reader.result\n url = isChromeIOS ? url : url.replace(/^data:[^;]*;/, 'data:attachment/file;')\n if (popup) popup.location.href = url\n else location = url\n popup = null // reverse-tabnabbing #460\n }\n reader.readAsDataURL(blob)\n } else {\n var URL = _global.URL || _global.webkitURL\n var url = URL.createObjectURL(blob)\n if (popup) popup.location = url\n else location.href = url\n popup = null // reverse-tabnabbing #460\n setTimeout(function () { URL.revokeObjectURL(url) }, 4E4) // 40s\n }\n }\n)\n\n_global.saveAs = saveAs.saveAs = saveAs\n\nif (typeof module !== 'undefined') {\n module.exports = saveAs;\n}\n"]} \ No newline at end of file diff --git a/www/js/file-saver/package.json b/www/js/file-saver/package.json new file mode 100644 index 0000000..36398ae --- /dev/null +++ b/www/js/file-saver/package.json @@ -0,0 +1,40 @@ +{ + "name": "file-saver", + "version": "2.0.5", + "description": "An HTML5 saveAs() FileSaver implementation", + "main": "dist/FileSaver.min.js", + "files": [ + "dist/FileSaver.js", + "dist/FileSaver.min.js", + "dist/FileSaver.min.js.map", + "src/FileSaver.js" + ], + "scripts": { + "test": "echo \"Error: no test specified\" && exit 0", + "build:development": "babel -o dist/FileSaver.js --plugins @babel/plugin-transform-modules-umd src/FileSaver.js", + "build:production": "babel -o dist/FileSaver.min.js -s --plugins @babel/plugin-transform-modules-umd --presets minify src/FileSaver.js", + "build": "npm run build:development && npm run build:production", + "prepublishOnly": "npm run build" + }, + "repository": { + "type": "git", + "url": "https://github.com/eligrey/FileSaver.js" + }, + "keywords": [ + "filesaver", + "saveas", + "blob" + ], + "author": "Eli Grey ", + "license": "MIT", + "bugs": { + "url": "https://github.com/eligrey/FileSaver.js/issues" + }, + "homepage": "https://github.com/eligrey/FileSaver.js#readme", + "devDependencies": { + "@babel/cli": "^7.1.0", + "@babel/core": "^7.1.0", + "@babel/plugin-transform-modules-umd": "^7.1.0", + "babel-preset-minify": "^0.4.3" + } +} diff --git a/www/js/file-saver/src/FileSaver.js b/www/js/file-saver/src/FileSaver.js new file mode 100644 index 0000000..5d204ae --- /dev/null +++ b/www/js/file-saver/src/FileSaver.js @@ -0,0 +1,171 @@ +/* +* FileSaver.js +* A saveAs() FileSaver implementation. +* +* By Eli Grey, http://eligrey.com +* +* License : https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md (MIT) +* source : http://purl.eligrey.com/github/FileSaver.js +*/ + +// The one and only way of getting global scope in all environments +// https://stackoverflow.com/q/3277182/1008999 +var _global = typeof window === 'object' && window.window === window + ? window : typeof self === 'object' && self.self === self + ? self : typeof global === 'object' && global.global === global + ? global + : this + +function bom (blob, opts) { + if (typeof opts === 'undefined') opts = { autoBom: false } + else if (typeof opts !== 'object') { + console.warn('Deprecated: Expected third argument to be a object') + opts = { autoBom: !opts } + } + + // prepend BOM for UTF-8 XML and text/* types (including HTML) + // note: your browser will automatically convert UTF-16 U+FEFF to EF BB BF + if (opts.autoBom && /^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(blob.type)) { + return new Blob([String.fromCharCode(0xFEFF), blob], { type: blob.type }) + } + return blob +} + +function download (url, name, opts) { + var xhr = new XMLHttpRequest() + xhr.open('GET', url) + xhr.responseType = 'blob' + xhr.onload = function () { + saveAs(xhr.response, name, opts) + } + xhr.onerror = function () { + console.error('could not download file') + } + xhr.send() +} + +function corsEnabled (url) { + var xhr = new XMLHttpRequest() + // use sync to avoid popup blocker + xhr.open('HEAD', url, false) + try { + xhr.send() + } catch (e) {} + return xhr.status >= 200 && xhr.status <= 299 +} + +// `a.click()` doesn't work for all browsers (#465) +function click (node) { + try { + node.dispatchEvent(new MouseEvent('click')) + } catch (e) { + var evt = document.createEvent('MouseEvents') + evt.initMouseEvent('click', true, true, window, 0, 0, 0, 80, + 20, false, false, false, false, 0, null) + node.dispatchEvent(evt) + } +} + +// Detect WebView inside a native macOS app by ruling out all browsers +// We just need to check for 'Safari' because all other browsers (besides Firefox) include that too +// https://www.whatismybrowser.com/guides/the-latest-user-agent/macos +var isMacOSWebView = _global.navigator && /Macintosh/.test(navigator.userAgent) && /AppleWebKit/.test(navigator.userAgent) && !/Safari/.test(navigator.userAgent) + +var saveAs = _global.saveAs || ( + // probably in some web worker + (typeof window !== 'object' || window !== _global) + ? function saveAs () { /* noop */ } + + // Use download attribute first if possible (#193 Lumia mobile) unless this is a macOS WebView + : ('download' in HTMLAnchorElement.prototype && !isMacOSWebView) + ? function saveAs (blob, name, opts) { + var URL = _global.URL || _global.webkitURL + var a = document.createElement('a') + name = name || blob.name || 'download' + + a.download = name + a.rel = 'noopener' // tabnabbing + + // TODO: detect chrome extensions & packaged apps + // a.target = '_blank' + + if (typeof blob === 'string') { + // Support regular links + a.href = blob + if (a.origin !== location.origin) { + corsEnabled(a.href) + ? download(blob, name, opts) + : click(a, a.target = '_blank') + } else { + click(a) + } + } else { + // Support blobs + a.href = URL.createObjectURL(blob) + setTimeout(function () { URL.revokeObjectURL(a.href) }, 4E4) // 40s + setTimeout(function () { click(a) }, 0) + } + } + + // Use msSaveOrOpenBlob as a second approach + : 'msSaveOrOpenBlob' in navigator + ? function saveAs (blob, name, opts) { + name = name || blob.name || 'download' + + if (typeof blob === 'string') { + if (corsEnabled(blob)) { + download(blob, name, opts) + } else { + var a = document.createElement('a') + a.href = blob + a.target = '_blank' + setTimeout(function () { click(a) }) + } + } else { + navigator.msSaveOrOpenBlob(bom(blob, opts), name) + } + } + + // Fallback to using FileReader and a popup + : function saveAs (blob, name, opts, popup) { + // Open a popup immediately do go around popup blocker + // Mostly only available on user interaction and the fileReader is async so... + popup = popup || open('', '_blank') + if (popup) { + popup.document.title = + popup.document.body.innerText = 'downloading...' + } + + if (typeof blob === 'string') return download(blob, name, opts) + + var force = blob.type === 'application/octet-stream' + var isSafari = /constructor/i.test(_global.HTMLElement) || _global.safari + var isChromeIOS = /CriOS\/[\d]+/.test(navigator.userAgent) + + if ((isChromeIOS || (force && isSafari) || isMacOSWebView) && typeof FileReader !== 'undefined') { + // Safari doesn't allow downloading of blob URLs + var reader = new FileReader() + reader.onloadend = function () { + var url = reader.result + url = isChromeIOS ? url : url.replace(/^data:[^;]*;/, 'data:attachment/file;') + if (popup) popup.location.href = url + else location = url + popup = null // reverse-tabnabbing #460 + } + reader.readAsDataURL(blob) + } else { + var URL = _global.URL || _global.webkitURL + var url = URL.createObjectURL(blob) + if (popup) popup.location = url + else location.href = url + popup = null // reverse-tabnabbing #460 + setTimeout(function () { URL.revokeObjectURL(url) }, 4E4) // 40s + } + } +) + +_global.saveAs = saveAs.saveAs = saveAs + +if (typeof module !== 'undefined') { + module.exports = saveAs; +} diff --git a/www/js/gpx-parse/.codeclimate.yml b/www/js/gpx-parse/.codeclimate.yml new file mode 100644 index 0000000..f4b556a --- /dev/null +++ b/www/js/gpx-parse/.codeclimate.yml @@ -0,0 +1,5 @@ +languages: + JavaScript: true +exclude_paths: +- "test/*" +- "dist/*" diff --git a/www/js/gpx-parse/.npmignore b/www/js/gpx-parse/.npmignore new file mode 100644 index 0000000..e0b773b --- /dev/null +++ b/www/js/gpx-parse/.npmignore @@ -0,0 +1,18 @@ +lib-cov +lcov.info +*.seed +*.log +*.csv +*.dat +*.out +*.pid +*.gz + +application-config.json +pids +logs +results +build +.grunt + +node_modules \ No newline at end of file diff --git a/www/js/gpx-parse/.travis.yml b/www/js/gpx-parse/.travis.yml new file mode 100644 index 0000000..969cc9b --- /dev/null +++ b/www/js/gpx-parse/.travis.yml @@ -0,0 +1,5 @@ +language: node_js +node_js: +- '0.10' +after_script: + - npm run coveralls diff --git a/www/js/gpx-parse/Gruntfile.js b/www/js/gpx-parse/Gruntfile.js new file mode 100644 index 0000000..35e8f33 --- /dev/null +++ b/www/js/gpx-parse/Gruntfile.js @@ -0,0 +1,35 @@ +module.exports = function(grunt) { + grunt.initConfig({ + jsdoc: { + dist : { + src: ['README.md', 'lib/**/*.js'], + options: { + destination: 'doc' + } + } + }, + browserify: { + options: { + browserifyOptions: { + standalone: 'gpx-parse' + } + }, + dist: { + src: 'index.js', + dest: 'dist/gpx-parse-browser.js', + options: { + alias: [ + // Mockup to avoid loading lib-cov/gpx-parse in the browserify build process + './browserify-mock.js:./lib-cov/gpx-parse' + ] + } + } + } + }); + + grunt.loadNpmTasks('grunt-jsdoc'); + grunt.loadNpmTasks('grunt-browserify'); + + + grunt.registerTask('document', ['jsdoc']); +}; diff --git a/www/js/gpx-parse/LICENSE b/www/js/gpx-parse/LICENSE new file mode 100644 index 0000000..a98263f --- /dev/null +++ b/www/js/gpx-parse/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2016 Elliot Stokes + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/www/js/gpx-parse/README.md b/www/js/gpx-parse/README.md new file mode 100644 index 0000000..7a3f945 --- /dev/null +++ b/www/js/gpx-parse/README.md @@ -0,0 +1,44 @@ +gpx-parse [![NPM Version](https://badge.fury.io/js/gpx-parse.png)](https://badge.fury.io/js/gpx-parse) [![Build Status](https://travis-ci.org/elliotstokes/gpx-parse.png?branch=master)](https://travis-ci.org/elliotstokes/gpx-parse) [![Coverage Status](https://coveralls.io/repos/elliotstokes/gpx-parse/badge.png?branch=master)](https://coveralls.io/r/elliotstokes/gpx-parse?branch=master) [![Code Climate](https://codeclimate.com/github/elliotstokes/gpx-parse.png)](https://codeclimate.com/github/elliotstokes/gpx-parse) +======== + +A library for parsing gpx data. Works against most of the Gpx v1.0 spec and Gpx v1.1. Feel free to fork if you need something specific. + +More information available on the [Project Page](http://www.vapidspace.com/gpx-parse) + +#Installation + + $ npm install gpx-parse + +#Or with bower + + $ bower install gpx-parse + +#Usage + +The module has been designed to work within node but you can also use it on the client side using the browserfy version that can be found in the dist folder. + +```javascript +var gpxParse = require("gpx-parse"); + +//from file +gpxParse.parseGpxFromFile("/path/to/gpxFile", function(error, data) { + //do stuff +}); + +//or from string +gpxParse.parseGpx("", function(error, data) { + //do stuff +}); + +// or an external file via HTTP(S) +gpxParse.parseRemoteGpxFile("http://host.tld/my.gpx", function(error, data) { + //do stuff +}); + +``` + +#Tests + +Tests are written with nodeunit. To test make sure you have the dev dependencies installed and just run: + + $ npm test diff --git a/www/js/gpx-parse/bower.json b/www/js/gpx-parse/bower.json new file mode 100644 index 0000000..e6a0388 --- /dev/null +++ b/www/js/gpx-parse/bower.json @@ -0,0 +1,26 @@ +{ + "name": "gpx-parse", + "description": "GPX parser for Node.js and the Browser", + "main": "dist/gpx-parse-browser.js", + "authors": [ + "Elliot Stokes" + ], + "license": "MIT", + "keywords": [ + "gpx", + "parser", + "gps", + "geo" + ], + "homepage": "https://github.com/elliotstokes/gpx-parse", + "moduleType": [ + "node" + ], + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "test", + "tests" + ] +} diff --git a/www/js/gpx-parse/browserify-mock.js b/www/js/gpx-parse/browserify-mock.js new file mode 100644 index 0000000..8179da1 --- /dev/null +++ b/www/js/gpx-parse/browserify-mock.js @@ -0,0 +1 @@ +exports.empty = null; diff --git a/www/js/gpx-parse/dist/gpx-parse-browser.js b/www/js/gpx-parse/dist/gpx-parse-browser.js new file mode 100644 index 0000000..94c44ae --- /dev/null +++ b/www/js/gpx-parse/dist/gpx-parse-browser.js @@ -0,0 +1,14508 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.gpxParse = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o} gpxWaypoints - The array of points from the xml + */ +var _getWayPoints = function(gpxWaypoints) { + var waypoints = []; + if (gpxWaypoints && gpxWaypoints.length) { + gpxWaypoints.forEach(function(wayPoint) { + console.log(wayPoint.desc); + var point = new GpxWaypoint(wayPoint.$.lat, wayPoint.$.lon, getFloat(wayPoint.ele), wayPoint.time, null, null, getString(wayPoint.name), null, getString(wayPoint.desc)); + waypoints.push(point); + }); + } + + return waypoints; +}; + +/** + * Parses routes into an array of route objects + */ +var _getRoutes = function(gpxRoutes) { + var routes = []; + + if (gpxRoutes && gpxRoutes.length) { + gpxRoutes.forEach(function(currentRoute) { + var routePoints = []; + + currentRoute.rtept.forEach(function(routePoint) { + routePoints.push(new GpxWaypoint(routePoint.$.lat, routePoint.$.lon)); + }); + + var route = new GpxRoute(gpxRoutes.name, gpxRoutes.cmt, gpxRoutes.desc, routePoints); + routes.push(route); + }); + } + + return routes; +}; + +/** + * Gets a float from an element + **/ +var getFloat = function(item) { + var value = null; + if (item && Array.isArray(item) && item.length > 0) { + value = parseFloat(item[0]); + } + return value; +}; + +/** + * Gets a string from an element + **/ +var getString = function(item) { + var value = null; + if (item && Array.isArray(item) && item.length > 0) { + value = item[0].toString(); + } + return value; +}; + +/** + * Grabs any tracks contained within the gpx + * @params {Object} gpxTracks - THe gpcx tracks from the file + **/ +var _getTracks = function(gpxTracks) { + var tracks = []; + + if (gpxTracks && gpxTracks.length) { + + gpxTracks.forEach(function(currentTrack) { + + var trackSegments = []; + + currentTrack.trkseg.forEach(function(currentSegment) { + var trackSegement = []; + + currentSegment.trkpt.forEach(function(trackPoint) { + var elevation = getFloat(trackPoint.ele); + trackSegement.push(new GpxWaypoint(trackPoint.$.lat, trackPoint.$.lon, elevation, trackPoint.time)); + }); + + trackSegments.push(trackSegement); + }); + + tracks.push(new GpxTrack(trackSegments, getString(currentTrack.name))); + }); + } + + return tracks; +}; + +/** + * Parses v1.0 data into data structure + */ +var _ParseV10 = function(gpx) { + + var extent = null, + metadata = null; + + extent = new GpxExtent(); + metadata = new GpxMetaData(gpx.$.creator, gpx.time, extent); + + return new GpxResult(metadata, _getWayPoints(gpx.wpt), _getRoutes(gpx.rte), _getTracks(gpx.trk)); +}; + +/** + * Parses v1.1 data into data structure + */ +var _ParseV11 = function(gpx) { + var metadata; + + if (gpx.metadata && gpx.metadata.length > 0) { + metadata = new GpxMetaData(gpx.$.creator, getString(gpx.metadata[0].time)); + } else { + metadata = new GpxMetaData(); + } + + return new GpxResult(metadata, _getWayPoints(gpx.wpt), _getRoutes(gpx.rte), _getTracks(gpx.trk)); +}; + +/** + * Parses gpx passed in as String + * @param {string} gpxString gpxData passed in as string + * @param {gpxParseCompleteCallback} callback Callback function to call when parse has completed. + */ +exports.parseGpx = function(gpxString, callback) { + + var parseString = require('xml2js').parseString, + gpxResult = null, + version = null; + + parseString(gpxString, function(error, data) { + if (error) { + callback(error, null); + return; + } + + try { + if (!data.gpx) return callback(new Error("version not specified"), null); + + version = data.gpx.$.version; + + switch (version) { + case "1.0": + gpxResult = _ParseV10(data.gpx); + break; + case "1.1": + gpxResult = _ParseV11(data.gpx); + break; + default: + return callback(new Error("version not supported"), null); + } + + callback(null, gpxResult); + + } catch (error) { + return callback(error); + } + }); +}; + + +/** + * Parse gpx from a file + * @param {string} gpxFile Path to gpx file you want to parse + * @param {gpxParseCompleteCallback} callback Callback function to call when parse has completed. + */ +exports.parseGpxFromFile = function(gpxFile, callback) { + + fs.readFile(gpxFile, function(error, file) { + + if (error) { + console.log("error"); + callback(error, null); + return; + } + + exports.parseGpx(file, callback); + }); +}; + +/** + * Fetch a remote GPX file via HTTP(S) and parse it. + * @param {string} uri The URI of the remote gpx file. + * @param {gpxParseCompleteCallback} callback Callback function to call when parse has completed. + * + */ +exports.parseRemoteGpxFile = function parseRemoteGpxFile (uri, callback) { + assert.equal(typeof uri, 'string', 'uri should be a string'); + assert.equal(typeof callback, 'function', 'callback should be a function'); + + function onError (err) { + return callback(new Error('failed to fetch gpx file: ' + err.toString())); + } + + function onResponse (res) { + var body = ''; + + res.on('data', function (data) { + body = body + data; + }); + + res.once('end', function () { + exports.parseGpx(body, callback); + }); + } + + (('https:' === url.parse(uri).protocol) ? https : http) + .get(uri, onResponse) + .once('error', onError); +}; + +//expose objects +exports.GpxResult = GpxResult; +exports.GpxExtent = GpxExtent; +exports.GpxWaypoint = GpxWaypoint; +exports.GpxTrack = GpxTrack; +exports.GpxMetaData = GpxMetaData; +exports.GpxRoute = GpxRoute; +exports.utils = geomUtils; + +/** + * Callback when gpx result has been processed. + * @callback gpxParseCompleteCallback + * @param {Object} error If an error has occurred the error otherwise null + * @param {GpxResult} response The parsed gpx file object + */ + +},{"./geomUtils":2,"./gpxExtent":4,"./gpxMetaData":5,"./gpxResult":6,"./gpxRoute":7,"./gpxTrack":8,"./gpxWaypoint":9,"assert":11,"fs":10,"http":41,"https":18,"url":52,"xml2js":58}],4:[function(require,module,exports){ +/** +* Contructor for gpx extent +* @classdesc Stores an extent. +* @class +* @param {number} minx The minimum x value +* @param {number} miny The minimum y value +* @param {number} maxx The maximum x value +* @param {number} miny The maximum y value +*/ +function GpxExtent(minx, miny, maxx, maxy) { + + minx = minx || -1; + miny = miny || -1; + maxx = maxx || -1; + maxy = maxy || -1; + + this.__defineGetter__("minx", function() { + return minx; + }); + + this.__defineGetter__("miny", function() { + return miny; + }); + + this.__defineGetter__("maxx", function() { + return maxx; + }); + + this.__defineGetter__("maxy", function() { + return maxy; + }); +} + +module.exports = GpxExtent; + +},{}],5:[function(require,module,exports){ +/** + * Contructor for the gpx metadata class + * @class + * @classdesc Stores all the metadata associated with the gpx file. + * @param {string} creator The creator of the gpx file. + * @param {string} time The string representation of the datetime from the file. + */ +function GpxMetaData(creator, time, bounds, name, desc, author, copyright, links, keywords) { + + creator = creator || null; + time = new Date(time) || null; + bounds = bounds || null; + name = name || ""; + desc = desc || ""; + + this.__defineGetter__("creator", function() { + return creator; + }); + + this.__defineGetter__("time", function() { + return time; + }); + + this.__defineGetter__("bounds", function() { + return bounds; + }); + + this.__defineGetter__("name", function() { + return name; + }); + + this.__defineGetter__("description", function() { + return desc; + }); + + this.__defineGetter__("author", function() { + return author; + }); + + this.__defineGetter__("copyright", function() { + return copyright; + }); + + this.__defineGetter__("links", function() { + return links; + }); + + this.__defineGetter__("keywords", function() { + return keywords; + }); +} + +module.exports = GpxMetaData; + +},{}],6:[function(require,module,exports){ +/** + * Constructor for GpxResult + * @class + * @classdesc Holds the results of the gpx parse + * @param {GpxMetaData} metadata The metadata associated with the gpx trace + * @param {Array.} waypoints An array of waypoints. + * @param {Array.} routes An array of routes. + * @param {Array.} tracks An array of tracks. + */ +function GpxResult(metadata, waypoints, routes, tracks) { + + metadata = metadata || null; + waypoints = waypoints || null; + routes = routes || null; + tracks = tracks || null; + + + this.__defineGetter__("metadata", function() { + return metadata; + }); + + this.__defineGetter__("waypoints", function() { + return waypoints; + }); + + this.__defineGetter__("routes", function() { + return routes; + }); + + this.__defineGetter__("tracks", function() { + return tracks; + }); +} + + + +module.exports = GpxResult; + +},{}],7:[function(require,module,exports){ +var geomUtils = require('./geomUtils'); + +/** +* Constructs a gpx route. +* @class +* @classdesc represents a route, an ordered list of waypoints representing a series of turn points leading to a destination. +* @param {string} name The name of the route. +* @param {string} cmt A comment regarding the route. +* @param {string} desc A description of the route. +* @param {object[]} points An array of waypoints representing the route. +**/ +function GpxRoute(name, cmt, desc, points) { + + name = name || ""; + desc = desc || ""; + cmt = cmt || ""; + points = points || []; + + this.__defineGetter__("name", function() { + return name; + }); + + this.__defineGetter__("cmt", function() { + return cmt; + }); + + this.__defineGetter__("description", function() { + return desc; + }); + + this.__defineGetter__("points", function() { + return points; + }); + + this.point = function(index) { + return points[index]; + }; + + /** + * Calculates the length of the route + **/ + this.length = function() { + var total = 0; + + for (var j=0, jl = points.length -1; j 1) { + for (var j=0, jl = currentSegment.length -1; j +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the 'Software'), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +// when used in node, this will actually load the util module we depend on +// versus loading the builtin util module as happens otherwise +// this is a bug in node module loading as far as I am concerned +var util = require('util/'); + +var pSlice = Array.prototype.slice; +var hasOwn = Object.prototype.hasOwnProperty; + +// 1. The assert module provides functions that throw +// AssertionError's when particular conditions are not met. The +// assert module must conform to the following interface. + +var assert = module.exports = ok; + +// 2. The AssertionError is defined in assert. +// new assert.AssertionError({ message: message, +// actual: actual, +// expected: expected }) + +assert.AssertionError = function AssertionError(options) { + this.name = 'AssertionError'; + this.actual = options.actual; + this.expected = options.expected; + this.operator = options.operator; + if (options.message) { + this.message = options.message; + this.generatedMessage = false; + } else { + this.message = getMessage(this); + this.generatedMessage = true; + } + var stackStartFunction = options.stackStartFunction || fail; + + if (Error.captureStackTrace) { + Error.captureStackTrace(this, stackStartFunction); + } + else { + // non v8 browsers so we can have a stacktrace + var err = new Error(); + if (err.stack) { + var out = err.stack; + + // try to strip useless frames + var fn_name = stackStartFunction.name; + var idx = out.indexOf('\n' + fn_name); + if (idx >= 0) { + // once we have located the function frame + // we need to strip out everything before it (and its line) + var next_line = out.indexOf('\n', idx + 1); + out = out.substring(next_line + 1); + } + + this.stack = out; + } + } +}; + +// assert.AssertionError instanceof Error +util.inherits(assert.AssertionError, Error); + +function replacer(key, value) { + if (util.isUndefined(value)) { + return '' + value; + } + if (util.isNumber(value) && !isFinite(value)) { + return value.toString(); + } + if (util.isFunction(value) || util.isRegExp(value)) { + return value.toString(); + } + return value; +} + +function truncate(s, n) { + if (util.isString(s)) { + return s.length < n ? s : s.slice(0, n); + } else { + return s; + } +} + +function getMessage(self) { + return truncate(JSON.stringify(self.actual, replacer), 128) + ' ' + + self.operator + ' ' + + truncate(JSON.stringify(self.expected, replacer), 128); +} + +// At present only the three keys mentioned above are used and +// understood by the spec. Implementations or sub modules can pass +// other keys to the AssertionError's constructor - they will be +// ignored. + +// 3. All of the following functions must throw an AssertionError +// when a corresponding condition is not met, with a message that +// may be undefined if not provided. All assertion methods provide +// both the actual and expected values to the assertion error for +// display purposes. + +function fail(actual, expected, message, operator, stackStartFunction) { + throw new assert.AssertionError({ + message: message, + actual: actual, + expected: expected, + operator: operator, + stackStartFunction: stackStartFunction + }); +} + +// EXTENSION! allows for well behaved errors defined elsewhere. +assert.fail = fail; + +// 4. Pure assertion tests whether a value is truthy, as determined +// by !!guard. +// assert.ok(guard, message_opt); +// This statement is equivalent to assert.equal(true, !!guard, +// message_opt);. To test strictly for the value true, use +// assert.strictEqual(true, guard, message_opt);. + +function ok(value, message) { + if (!value) fail(value, true, message, '==', assert.ok); +} +assert.ok = ok; + +// 5. The equality assertion tests shallow, coercive equality with +// ==. +// assert.equal(actual, expected, message_opt); + +assert.equal = function equal(actual, expected, message) { + if (actual != expected) fail(actual, expected, message, '==', assert.equal); +}; + +// 6. The non-equality assertion tests for whether two objects are not equal +// with != assert.notEqual(actual, expected, message_opt); + +assert.notEqual = function notEqual(actual, expected, message) { + if (actual == expected) { + fail(actual, expected, message, '!=', assert.notEqual); + } +}; + +// 7. The equivalence assertion tests a deep equality relation. +// assert.deepEqual(actual, expected, message_opt); + +assert.deepEqual = function deepEqual(actual, expected, message) { + if (!_deepEqual(actual, expected)) { + fail(actual, expected, message, 'deepEqual', assert.deepEqual); + } +}; + +function _deepEqual(actual, expected) { + // 7.1. All identical values are equivalent, as determined by ===. + if (actual === expected) { + return true; + + } else if (util.isBuffer(actual) && util.isBuffer(expected)) { + if (actual.length != expected.length) return false; + + for (var i = 0; i < actual.length; i++) { + if (actual[i] !== expected[i]) return false; + } + + return true; + + // 7.2. If the expected value is a Date object, the actual value is + // equivalent if it is also a Date object that refers to the same time. + } else if (util.isDate(actual) && util.isDate(expected)) { + return actual.getTime() === expected.getTime(); + + // 7.3 If the expected value is a RegExp object, the actual value is + // equivalent if it is also a RegExp object with the same source and + // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`). + } else if (util.isRegExp(actual) && util.isRegExp(expected)) { + return actual.source === expected.source && + actual.global === expected.global && + actual.multiline === expected.multiline && + actual.lastIndex === expected.lastIndex && + actual.ignoreCase === expected.ignoreCase; + + // 7.4. Other pairs that do not both pass typeof value == 'object', + // equivalence is determined by ==. + } else if (!util.isObject(actual) && !util.isObject(expected)) { + return actual == expected; + + // 7.5 For all other Object pairs, including Array objects, equivalence is + // determined by having the same number of owned properties (as verified + // with Object.prototype.hasOwnProperty.call), the same set of keys + // (although not necessarily the same order), equivalent values for every + // corresponding key, and an identical 'prototype' property. Note: this + // accounts for both named and indexed properties on Arrays. + } else { + return objEquiv(actual, expected); + } +} + +function isArguments(object) { + return Object.prototype.toString.call(object) == '[object Arguments]'; +} + +function objEquiv(a, b) { + if (util.isNullOrUndefined(a) || util.isNullOrUndefined(b)) + return false; + // an identical 'prototype' property. + if (a.prototype !== b.prototype) return false; + // if one is a primitive, the other must be same + if (util.isPrimitive(a) || util.isPrimitive(b)) { + return a === b; + } + var aIsArgs = isArguments(a), + bIsArgs = isArguments(b); + if ((aIsArgs && !bIsArgs) || (!aIsArgs && bIsArgs)) + return false; + if (aIsArgs) { + a = pSlice.call(a); + b = pSlice.call(b); + return _deepEqual(a, b); + } + var ka = objectKeys(a), + kb = objectKeys(b), + key, i; + // having the same number of owned properties (keys incorporates + // hasOwnProperty) + if (ka.length != kb.length) + return false; + //the same set of keys (although not necessarily the same order), + ka.sort(); + kb.sort(); + //~~~cheap key test + for (i = ka.length - 1; i >= 0; i--) { + if (ka[i] != kb[i]) + return false; + } + //equivalent values for every corresponding key, and + //~~~possibly expensive deep test + for (i = ka.length - 1; i >= 0; i--) { + key = ka[i]; + if (!_deepEqual(a[key], b[key])) return false; + } + return true; +} + +// 8. The non-equivalence assertion tests for any deep inequality. +// assert.notDeepEqual(actual, expected, message_opt); + +assert.notDeepEqual = function notDeepEqual(actual, expected, message) { + if (_deepEqual(actual, expected)) { + fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual); + } +}; + +// 9. The strict equality assertion tests strict equality, as determined by ===. +// assert.strictEqual(actual, expected, message_opt); + +assert.strictEqual = function strictEqual(actual, expected, message) { + if (actual !== expected) { + fail(actual, expected, message, '===', assert.strictEqual); + } +}; + +// 10. The strict non-equality assertion tests for strict inequality, as +// determined by !==. assert.notStrictEqual(actual, expected, message_opt); + +assert.notStrictEqual = function notStrictEqual(actual, expected, message) { + if (actual === expected) { + fail(actual, expected, message, '!==', assert.notStrictEqual); + } +}; + +function expectedException(actual, expected) { + if (!actual || !expected) { + return false; + } + + if (Object.prototype.toString.call(expected) == '[object RegExp]') { + return expected.test(actual); + } else if (actual instanceof expected) { + return true; + } else if (expected.call({}, actual) === true) { + return true; + } + + return false; +} + +function _throws(shouldThrow, block, expected, message) { + var actual; + + if (util.isString(expected)) { + message = expected; + expected = null; + } + + try { + block(); + } catch (e) { + actual = e; + } + + message = (expected && expected.name ? ' (' + expected.name + ').' : '.') + + (message ? ' ' + message : '.'); + + if (shouldThrow && !actual) { + fail(actual, expected, 'Missing expected exception' + message); + } + + if (!shouldThrow && expectedException(actual, expected)) { + fail(actual, expected, 'Got unwanted exception' + message); + } + + if ((shouldThrow && actual && expected && + !expectedException(actual, expected)) || (!shouldThrow && actual)) { + throw actual; + } +} + +// 11. Expected to throw an error: +// assert.throws(block, Error_opt, message_opt); + +assert.throws = function(block, /*optional*/error, /*optional*/message) { + _throws.apply(this, [true].concat(pSlice.call(arguments))); +}; + +// EXTENSION! This is annoying to write outside this module. +assert.doesNotThrow = function(block, /*optional*/message) { + _throws.apply(this, [false].concat(pSlice.call(arguments))); +}; + +assert.ifError = function(err) { if (err) {throw err;}}; + +var objectKeys = Object.keys || function (obj) { + var keys = []; + for (var key in obj) { + if (hasOwn.call(obj, key)) keys.push(key); + } + return keys; +}; + +},{"util/":54}],12:[function(require,module,exports){ +arguments[4][10][0].apply(exports,arguments) +},{"dup":10}],13:[function(require,module,exports){ +(function (global){ +/*! + * The buffer module from node.js, for the browser. + * + * @author Feross Aboukhadijeh + * @license MIT + */ +/* eslint-disable no-proto */ + +var base64 = require('base64-js') +var ieee754 = require('ieee754') +var isArray = require('is-array') + +exports.Buffer = Buffer +exports.SlowBuffer = SlowBuffer +exports.INSPECT_MAX_BYTES = 50 +Buffer.poolSize = 8192 // not used by this implementation + +var rootParent = {} + +/** + * If `Buffer.TYPED_ARRAY_SUPPORT`: + * === true Use Uint8Array implementation (fastest) + * === false Use Object implementation (most compatible, even IE6) + * + * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, + * Opera 11.6+, iOS 4.2+. + * + * Due to various browser bugs, sometimes the Object implementation will be used even + * when the browser supports typed arrays. + * + * Note: + * + * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances, + * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438. + * + * - Safari 5-7 lacks support for changing the `Object.prototype.constructor` property + * on objects. + * + * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function. + * + * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of + * incorrect length in some situations. + + * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they + * get the Object implementation, which is slower but behaves correctly. + */ +Buffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined + ? global.TYPED_ARRAY_SUPPORT + : typedArraySupport() + +function typedArraySupport () { + function Bar () {} + try { + var arr = new Uint8Array(1) + arr.foo = function () { return 42 } + arr.constructor = Bar + return arr.foo() === 42 && // typed array instances can be augmented + arr.constructor === Bar && // constructor can be set + typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray` + arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray` + } catch (e) { + return false + } +} + +function kMaxLength () { + return Buffer.TYPED_ARRAY_SUPPORT + ? 0x7fffffff + : 0x3fffffff +} + +/** + * Class: Buffer + * ============= + * + * The Buffer constructor returns instances of `Uint8Array` that are augmented + * with function properties for all the node `Buffer` API functions. We use + * `Uint8Array` so that square bracket notation works as expected -- it returns + * a single octet. + * + * By augmenting the instances, we can avoid modifying the `Uint8Array` + * prototype. + */ +function Buffer (arg) { + if (!(this instanceof Buffer)) { + // Avoid going through an ArgumentsAdaptorTrampoline in the common case. + if (arguments.length > 1) return new Buffer(arg, arguments[1]) + return new Buffer(arg) + } + + this.length = 0 + this.parent = undefined + + // Common case. + if (typeof arg === 'number') { + return fromNumber(this, arg) + } + + // Slightly less common case. + if (typeof arg === 'string') { + return fromString(this, arg, arguments.length > 1 ? arguments[1] : 'utf8') + } + + // Unusual. + return fromObject(this, arg) +} + +function fromNumber (that, length) { + that = allocate(that, length < 0 ? 0 : checked(length) | 0) + if (!Buffer.TYPED_ARRAY_SUPPORT) { + for (var i = 0; i < length; i++) { + that[i] = 0 + } + } + return that +} + +function fromString (that, string, encoding) { + if (typeof encoding !== 'string' || encoding === '') encoding = 'utf8' + + // Assumption: byteLength() return value is always < kMaxLength. + var length = byteLength(string, encoding) | 0 + that = allocate(that, length) + + that.write(string, encoding) + return that +} + +function fromObject (that, object) { + if (Buffer.isBuffer(object)) return fromBuffer(that, object) + + if (isArray(object)) return fromArray(that, object) + + if (object == null) { + throw new TypeError('must start with number, buffer, array or string') + } + + if (typeof ArrayBuffer !== 'undefined') { + if (object.buffer instanceof ArrayBuffer) { + return fromTypedArray(that, object) + } + if (object instanceof ArrayBuffer) { + return fromArrayBuffer(that, object) + } + } + + if (object.length) return fromArrayLike(that, object) + + return fromJsonObject(that, object) +} + +function fromBuffer (that, buffer) { + var length = checked(buffer.length) | 0 + that = allocate(that, length) + buffer.copy(that, 0, 0, length) + return that +} + +function fromArray (that, array) { + var length = checked(array.length) | 0 + that = allocate(that, length) + for (var i = 0; i < length; i += 1) { + that[i] = array[i] & 255 + } + return that +} + +// Duplicate of fromArray() to keep fromArray() monomorphic. +function fromTypedArray (that, array) { + var length = checked(array.length) | 0 + that = allocate(that, length) + // Truncating the elements is probably not what people expect from typed + // arrays with BYTES_PER_ELEMENT > 1 but it's compatible with the behavior + // of the old Buffer constructor. + for (var i = 0; i < length; i += 1) { + that[i] = array[i] & 255 + } + return that +} + +function fromArrayBuffer (that, array) { + if (Buffer.TYPED_ARRAY_SUPPORT) { + // Return an augmented `Uint8Array` instance, for best performance + array.byteLength + that = Buffer._augment(new Uint8Array(array)) + } else { + // Fallback: Return an object instance of the Buffer class + that = fromTypedArray(that, new Uint8Array(array)) + } + return that +} + +function fromArrayLike (that, array) { + var length = checked(array.length) | 0 + that = allocate(that, length) + for (var i = 0; i < length; i += 1) { + that[i] = array[i] & 255 + } + return that +} + +// Deserialize { type: 'Buffer', data: [1,2,3,...] } into a Buffer object. +// Returns a zero-length buffer for inputs that don't conform to the spec. +function fromJsonObject (that, object) { + var array + var length = 0 + + if (object.type === 'Buffer' && isArray(object.data)) { + array = object.data + length = checked(array.length) | 0 + } + that = allocate(that, length) + + for (var i = 0; i < length; i += 1) { + that[i] = array[i] & 255 + } + return that +} + +if (Buffer.TYPED_ARRAY_SUPPORT) { + Buffer.prototype.__proto__ = Uint8Array.prototype + Buffer.__proto__ = Uint8Array +} + +function allocate (that, length) { + if (Buffer.TYPED_ARRAY_SUPPORT) { + // Return an augmented `Uint8Array` instance, for best performance + that = Buffer._augment(new Uint8Array(length)) + that.__proto__ = Buffer.prototype + } else { + // Fallback: Return an object instance of the Buffer class + that.length = length + that._isBuffer = true + } + + var fromPool = length !== 0 && length <= Buffer.poolSize >>> 1 + if (fromPool) that.parent = rootParent + + return that +} + +function checked (length) { + // Note: cannot use `length < kMaxLength` here because that fails when + // length is NaN (which is otherwise coerced to zero.) + if (length >= kMaxLength()) { + throw new RangeError('Attempt to allocate Buffer larger than maximum ' + + 'size: 0x' + kMaxLength().toString(16) + ' bytes') + } + return length | 0 +} + +function SlowBuffer (subject, encoding) { + if (!(this instanceof SlowBuffer)) return new SlowBuffer(subject, encoding) + + var buf = new Buffer(subject, encoding) + delete buf.parent + return buf +} + +Buffer.isBuffer = function isBuffer (b) { + return !!(b != null && b._isBuffer) +} + +Buffer.compare = function compare (a, b) { + if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) { + throw new TypeError('Arguments must be Buffers') + } + + if (a === b) return 0 + + var x = a.length + var y = b.length + + var i = 0 + var len = Math.min(x, y) + while (i < len) { + if (a[i] !== b[i]) break + + ++i + } + + if (i !== len) { + x = a[i] + y = b[i] + } + + if (x < y) return -1 + if (y < x) return 1 + return 0 +} + +Buffer.isEncoding = function isEncoding (encoding) { + switch (String(encoding).toLowerCase()) { + case 'hex': + case 'utf8': + case 'utf-8': + case 'ascii': + case 'binary': + case 'base64': + case 'raw': + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return true + default: + return false + } +} + +Buffer.concat = function concat (list, length) { + if (!isArray(list)) throw new TypeError('list argument must be an Array of Buffers.') + + if (list.length === 0) { + return new Buffer(0) + } + + var i + if (length === undefined) { + length = 0 + for (i = 0; i < list.length; i++) { + length += list[i].length + } + } + + var buf = new Buffer(length) + var pos = 0 + for (i = 0; i < list.length; i++) { + var item = list[i] + item.copy(buf, pos) + pos += item.length + } + return buf +} + +function byteLength (string, encoding) { + if (typeof string !== 'string') string = '' + string + + var len = string.length + if (len === 0) return 0 + + // Use a for loop to avoid recursion + var loweredCase = false + for (;;) { + switch (encoding) { + case 'ascii': + case 'binary': + // Deprecated + case 'raw': + case 'raws': + return len + case 'utf8': + case 'utf-8': + return utf8ToBytes(string).length + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return len * 2 + case 'hex': + return len >>> 1 + case 'base64': + return base64ToBytes(string).length + default: + if (loweredCase) return utf8ToBytes(string).length // assume utf8 + encoding = ('' + encoding).toLowerCase() + loweredCase = true + } + } +} +Buffer.byteLength = byteLength + +// pre-set for values that may exist in the future +Buffer.prototype.length = undefined +Buffer.prototype.parent = undefined + +function slowToString (encoding, start, end) { + var loweredCase = false + + start = start | 0 + end = end === undefined || end === Infinity ? this.length : end | 0 + + if (!encoding) encoding = 'utf8' + if (start < 0) start = 0 + if (end > this.length) end = this.length + if (end <= start) return '' + + while (true) { + switch (encoding) { + case 'hex': + return hexSlice(this, start, end) + + case 'utf8': + case 'utf-8': + return utf8Slice(this, start, end) + + case 'ascii': + return asciiSlice(this, start, end) + + case 'binary': + return binarySlice(this, start, end) + + case 'base64': + return base64Slice(this, start, end) + + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return utf16leSlice(this, start, end) + + default: + if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) + encoding = (encoding + '').toLowerCase() + loweredCase = true + } + } +} + +Buffer.prototype.toString = function toString () { + var length = this.length | 0 + if (length === 0) return '' + if (arguments.length === 0) return utf8Slice(this, 0, length) + return slowToString.apply(this, arguments) +} + +Buffer.prototype.equals = function equals (b) { + if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') + if (this === b) return true + return Buffer.compare(this, b) === 0 +} + +Buffer.prototype.inspect = function inspect () { + var str = '' + var max = exports.INSPECT_MAX_BYTES + if (this.length > 0) { + str = this.toString('hex', 0, max).match(/.{2}/g).join(' ') + if (this.length > max) str += ' ... ' + } + return '' +} + +Buffer.prototype.compare = function compare (b) { + if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') + if (this === b) return 0 + return Buffer.compare(this, b) +} + +Buffer.prototype.indexOf = function indexOf (val, byteOffset) { + if (byteOffset > 0x7fffffff) byteOffset = 0x7fffffff + else if (byteOffset < -0x80000000) byteOffset = -0x80000000 + byteOffset >>= 0 + + if (this.length === 0) return -1 + if (byteOffset >= this.length) return -1 + + // Negative offsets start from the end of the buffer + if (byteOffset < 0) byteOffset = Math.max(this.length + byteOffset, 0) + + if (typeof val === 'string') { + if (val.length === 0) return -1 // special case: looking for empty string always fails + return String.prototype.indexOf.call(this, val, byteOffset) + } + if (Buffer.isBuffer(val)) { + return arrayIndexOf(this, val, byteOffset) + } + if (typeof val === 'number') { + if (Buffer.TYPED_ARRAY_SUPPORT && Uint8Array.prototype.indexOf === 'function') { + return Uint8Array.prototype.indexOf.call(this, val, byteOffset) + } + return arrayIndexOf(this, [ val ], byteOffset) + } + + function arrayIndexOf (arr, val, byteOffset) { + var foundIndex = -1 + for (var i = 0; byteOffset + i < arr.length; i++) { + if (arr[byteOffset + i] === val[foundIndex === -1 ? 0 : i - foundIndex]) { + if (foundIndex === -1) foundIndex = i + if (i - foundIndex + 1 === val.length) return byteOffset + foundIndex + } else { + foundIndex = -1 + } + } + return -1 + } + + throw new TypeError('val must be string, number or Buffer') +} + +// `get` is deprecated +Buffer.prototype.get = function get (offset) { + console.log('.get() is deprecated. Access using array indexes instead.') + return this.readUInt8(offset) +} + +// `set` is deprecated +Buffer.prototype.set = function set (v, offset) { + console.log('.set() is deprecated. Access using array indexes instead.') + return this.writeUInt8(v, offset) +} + +function hexWrite (buf, string, offset, length) { + offset = Number(offset) || 0 + var remaining = buf.length - offset + if (!length) { + length = remaining + } else { + length = Number(length) + if (length > remaining) { + length = remaining + } + } + + // must be an even number of digits + var strLen = string.length + if (strLen % 2 !== 0) throw new Error('Invalid hex string') + + if (length > strLen / 2) { + length = strLen / 2 + } + for (var i = 0; i < length; i++) { + var parsed = parseInt(string.substr(i * 2, 2), 16) + if (isNaN(parsed)) throw new Error('Invalid hex string') + buf[offset + i] = parsed + } + return i +} + +function utf8Write (buf, string, offset, length) { + return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length) +} + +function asciiWrite (buf, string, offset, length) { + return blitBuffer(asciiToBytes(string), buf, offset, length) +} + +function binaryWrite (buf, string, offset, length) { + return asciiWrite(buf, string, offset, length) +} + +function base64Write (buf, string, offset, length) { + return blitBuffer(base64ToBytes(string), buf, offset, length) +} + +function ucs2Write (buf, string, offset, length) { + return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length) +} + +Buffer.prototype.write = function write (string, offset, length, encoding) { + // Buffer#write(string) + if (offset === undefined) { + encoding = 'utf8' + length = this.length + offset = 0 + // Buffer#write(string, encoding) + } else if (length === undefined && typeof offset === 'string') { + encoding = offset + length = this.length + offset = 0 + // Buffer#write(string, offset[, length][, encoding]) + } else if (isFinite(offset)) { + offset = offset | 0 + if (isFinite(length)) { + length = length | 0 + if (encoding === undefined) encoding = 'utf8' + } else { + encoding = length + length = undefined + } + // legacy write(string, encoding, offset, length) - remove in v0.13 + } else { + var swap = encoding + encoding = offset + offset = length | 0 + length = swap + } + + var remaining = this.length - offset + if (length === undefined || length > remaining) length = remaining + + if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) { + throw new RangeError('attempt to write outside buffer bounds') + } + + if (!encoding) encoding = 'utf8' + + var loweredCase = false + for (;;) { + switch (encoding) { + case 'hex': + return hexWrite(this, string, offset, length) + + case 'utf8': + case 'utf-8': + return utf8Write(this, string, offset, length) + + case 'ascii': + return asciiWrite(this, string, offset, length) + + case 'binary': + return binaryWrite(this, string, offset, length) + + case 'base64': + // Warning: maxLength not taken into account in base64Write + return base64Write(this, string, offset, length) + + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return ucs2Write(this, string, offset, length) + + default: + if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) + encoding = ('' + encoding).toLowerCase() + loweredCase = true + } + } +} + +Buffer.prototype.toJSON = function toJSON () { + return { + type: 'Buffer', + data: Array.prototype.slice.call(this._arr || this, 0) + } +} + +function base64Slice (buf, start, end) { + if (start === 0 && end === buf.length) { + return base64.fromByteArray(buf) + } else { + return base64.fromByteArray(buf.slice(start, end)) + } +} + +function utf8Slice (buf, start, end) { + end = Math.min(buf.length, end) + var res = [] + + var i = start + while (i < end) { + var firstByte = buf[i] + var codePoint = null + var bytesPerSequence = (firstByte > 0xEF) ? 4 + : (firstByte > 0xDF) ? 3 + : (firstByte > 0xBF) ? 2 + : 1 + + if (i + bytesPerSequence <= end) { + var secondByte, thirdByte, fourthByte, tempCodePoint + + switch (bytesPerSequence) { + case 1: + if (firstByte < 0x80) { + codePoint = firstByte + } + break + case 2: + secondByte = buf[i + 1] + if ((secondByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F) + if (tempCodePoint > 0x7F) { + codePoint = tempCodePoint + } + } + break + case 3: + secondByte = buf[i + 1] + thirdByte = buf[i + 2] + if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F) + if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) { + codePoint = tempCodePoint + } + } + break + case 4: + secondByte = buf[i + 1] + thirdByte = buf[i + 2] + fourthByte = buf[i + 3] + if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F) + if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) { + codePoint = tempCodePoint + } + } + } + } + + if (codePoint === null) { + // we did not generate a valid codePoint so insert a + // replacement char (U+FFFD) and advance only 1 byte + codePoint = 0xFFFD + bytesPerSequence = 1 + } else if (codePoint > 0xFFFF) { + // encode to utf16 (surrogate pair dance) + codePoint -= 0x10000 + res.push(codePoint >>> 10 & 0x3FF | 0xD800) + codePoint = 0xDC00 | codePoint & 0x3FF + } + + res.push(codePoint) + i += bytesPerSequence + } + + return decodeCodePointsArray(res) +} + +// Based on http://stackoverflow.com/a/22747272/680742, the browser with +// the lowest limit is Chrome, with 0x10000 args. +// We go 1 magnitude less, for safety +var MAX_ARGUMENTS_LENGTH = 0x1000 + +function decodeCodePointsArray (codePoints) { + var len = codePoints.length + if (len <= MAX_ARGUMENTS_LENGTH) { + return String.fromCharCode.apply(String, codePoints) // avoid extra slice() + } + + // Decode in chunks to avoid "call stack size exceeded". + var res = '' + var i = 0 + while (i < len) { + res += String.fromCharCode.apply( + String, + codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH) + ) + } + return res +} + +function asciiSlice (buf, start, end) { + var ret = '' + end = Math.min(buf.length, end) + + for (var i = start; i < end; i++) { + ret += String.fromCharCode(buf[i] & 0x7F) + } + return ret +} + +function binarySlice (buf, start, end) { + var ret = '' + end = Math.min(buf.length, end) + + for (var i = start; i < end; i++) { + ret += String.fromCharCode(buf[i]) + } + return ret +} + +function hexSlice (buf, start, end) { + var len = buf.length + + if (!start || start < 0) start = 0 + if (!end || end < 0 || end > len) end = len + + var out = '' + for (var i = start; i < end; i++) { + out += toHex(buf[i]) + } + return out +} + +function utf16leSlice (buf, start, end) { + var bytes = buf.slice(start, end) + var res = '' + for (var i = 0; i < bytes.length; i += 2) { + res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256) + } + return res +} + +Buffer.prototype.slice = function slice (start, end) { + var len = this.length + start = ~~start + end = end === undefined ? len : ~~end + + if (start < 0) { + start += len + if (start < 0) start = 0 + } else if (start > len) { + start = len + } + + if (end < 0) { + end += len + if (end < 0) end = 0 + } else if (end > len) { + end = len + } + + if (end < start) end = start + + var newBuf + if (Buffer.TYPED_ARRAY_SUPPORT) { + newBuf = Buffer._augment(this.subarray(start, end)) + } else { + var sliceLen = end - start + newBuf = new Buffer(sliceLen, undefined) + for (var i = 0; i < sliceLen; i++) { + newBuf[i] = this[i + start] + } + } + + if (newBuf.length) newBuf.parent = this.parent || this + + return newBuf +} + +/* + * Need to make sure that buffer isn't trying to write out of bounds. + */ +function checkOffset (offset, ext, length) { + if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint') + if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length') +} + +Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) { + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) checkOffset(offset, byteLength, this.length) + + var val = this[offset] + var mul = 1 + var i = 0 + while (++i < byteLength && (mul *= 0x100)) { + val += this[offset + i] * mul + } + + return val +} + +Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) { + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) { + checkOffset(offset, byteLength, this.length) + } + + var val = this[offset + --byteLength] + var mul = 1 + while (byteLength > 0 && (mul *= 0x100)) { + val += this[offset + --byteLength] * mul + } + + return val +} + +Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) { + if (!noAssert) checkOffset(offset, 1, this.length) + return this[offset] +} + +Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length) + return this[offset] | (this[offset + 1] << 8) +} + +Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length) + return (this[offset] << 8) | this[offset + 1] +} + +Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + + return ((this[offset]) | + (this[offset + 1] << 8) | + (this[offset + 2] << 16)) + + (this[offset + 3] * 0x1000000) +} + +Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + + return (this[offset] * 0x1000000) + + ((this[offset + 1] << 16) | + (this[offset + 2] << 8) | + this[offset + 3]) +} + +Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) { + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) checkOffset(offset, byteLength, this.length) + + var val = this[offset] + var mul = 1 + var i = 0 + while (++i < byteLength && (mul *= 0x100)) { + val += this[offset + i] * mul + } + mul *= 0x80 + + if (val >= mul) val -= Math.pow(2, 8 * byteLength) + + return val +} + +Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) { + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) checkOffset(offset, byteLength, this.length) + + var i = byteLength + var mul = 1 + var val = this[offset + --i] + while (i > 0 && (mul *= 0x100)) { + val += this[offset + --i] * mul + } + mul *= 0x80 + + if (val >= mul) val -= Math.pow(2, 8 * byteLength) + + return val +} + +Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) { + if (!noAssert) checkOffset(offset, 1, this.length) + if (!(this[offset] & 0x80)) return (this[offset]) + return ((0xff - this[offset] + 1) * -1) +} + +Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length) + var val = this[offset] | (this[offset + 1] << 8) + return (val & 0x8000) ? val | 0xFFFF0000 : val +} + +Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length) + var val = this[offset + 1] | (this[offset] << 8) + return (val & 0x8000) ? val | 0xFFFF0000 : val +} + +Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + + return (this[offset]) | + (this[offset + 1] << 8) | + (this[offset + 2] << 16) | + (this[offset + 3] << 24) +} + +Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + + return (this[offset] << 24) | + (this[offset + 1] << 16) | + (this[offset + 2] << 8) | + (this[offset + 3]) +} + +Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + return ieee754.read(this, offset, true, 23, 4) +} + +Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + return ieee754.read(this, offset, false, 23, 4) +} + +Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 8, this.length) + return ieee754.read(this, offset, true, 52, 8) +} + +Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 8, this.length) + return ieee754.read(this, offset, false, 52, 8) +} + +function checkInt (buf, value, offset, ext, max, min) { + if (!Buffer.isBuffer(buf)) throw new TypeError('buffer must be a Buffer instance') + if (value > max || value < min) throw new RangeError('value is out of bounds') + if (offset + ext > buf.length) throw new RangeError('index out of range') +} + +Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) { + value = +value + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0) + + var mul = 1 + var i = 0 + this[offset] = value & 0xFF + while (++i < byteLength && (mul *= 0x100)) { + this[offset + i] = (value / mul) & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) { + value = +value + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0) + + var i = byteLength - 1 + var mul = 1 + this[offset + i] = value & 0xFF + while (--i >= 0 && (mul *= 0x100)) { + this[offset + i] = (value / mul) & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0) + if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) + this[offset] = (value & 0xff) + return offset + 1 +} + +function objectWriteUInt16 (buf, value, offset, littleEndian) { + if (value < 0) value = 0xffff + value + 1 + for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; i++) { + buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>> + (littleEndian ? i : 1 - i) * 8 + } +} + +Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value & 0xff) + this[offset + 1] = (value >>> 8) + } else { + objectWriteUInt16(this, value, offset, true) + } + return offset + 2 +} + +Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 8) + this[offset + 1] = (value & 0xff) + } else { + objectWriteUInt16(this, value, offset, false) + } + return offset + 2 +} + +function objectWriteUInt32 (buf, value, offset, littleEndian) { + if (value < 0) value = 0xffffffff + value + 1 + for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; i++) { + buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff + } +} + +Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset + 3] = (value >>> 24) + this[offset + 2] = (value >>> 16) + this[offset + 1] = (value >>> 8) + this[offset] = (value & 0xff) + } else { + objectWriteUInt32(this, value, offset, true) + } + return offset + 4 +} + +Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 24) + this[offset + 1] = (value >>> 16) + this[offset + 2] = (value >>> 8) + this[offset + 3] = (value & 0xff) + } else { + objectWriteUInt32(this, value, offset, false) + } + return offset + 4 +} + +Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) { + var limit = Math.pow(2, 8 * byteLength - 1) + + checkInt(this, value, offset, byteLength, limit - 1, -limit) + } + + var i = 0 + var mul = 1 + var sub = value < 0 ? 1 : 0 + this[offset] = value & 0xFF + while (++i < byteLength && (mul *= 0x100)) { + this[offset + i] = ((value / mul) >> 0) - sub & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) { + var limit = Math.pow(2, 8 * byteLength - 1) + + checkInt(this, value, offset, byteLength, limit - 1, -limit) + } + + var i = byteLength - 1 + var mul = 1 + var sub = value < 0 ? 1 : 0 + this[offset + i] = value & 0xFF + while (--i >= 0 && (mul *= 0x100)) { + this[offset + i] = ((value / mul) >> 0) - sub & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80) + if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) + if (value < 0) value = 0xff + value + 1 + this[offset] = (value & 0xff) + return offset + 1 +} + +Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value & 0xff) + this[offset + 1] = (value >>> 8) + } else { + objectWriteUInt16(this, value, offset, true) + } + return offset + 2 +} + +Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 8) + this[offset + 1] = (value & 0xff) + } else { + objectWriteUInt16(this, value, offset, false) + } + return offset + 2 +} + +Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value & 0xff) + this[offset + 1] = (value >>> 8) + this[offset + 2] = (value >>> 16) + this[offset + 3] = (value >>> 24) + } else { + objectWriteUInt32(this, value, offset, true) + } + return offset + 4 +} + +Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) + if (value < 0) value = 0xffffffff + value + 1 + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 24) + this[offset + 1] = (value >>> 16) + this[offset + 2] = (value >>> 8) + this[offset + 3] = (value & 0xff) + } else { + objectWriteUInt32(this, value, offset, false) + } + return offset + 4 +} + +function checkIEEE754 (buf, value, offset, ext, max, min) { + if (value > max || value < min) throw new RangeError('value is out of bounds') + if (offset + ext > buf.length) throw new RangeError('index out of range') + if (offset < 0) throw new RangeError('index out of range') +} + +function writeFloat (buf, value, offset, littleEndian, noAssert) { + if (!noAssert) { + checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38) + } + ieee754.write(buf, value, offset, littleEndian, 23, 4) + return offset + 4 +} + +Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) { + return writeFloat(this, value, offset, true, noAssert) +} + +Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) { + return writeFloat(this, value, offset, false, noAssert) +} + +function writeDouble (buf, value, offset, littleEndian, noAssert) { + if (!noAssert) { + checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308) + } + ieee754.write(buf, value, offset, littleEndian, 52, 8) + return offset + 8 +} + +Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) { + return writeDouble(this, value, offset, true, noAssert) +} + +Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) { + return writeDouble(this, value, offset, false, noAssert) +} + +// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) +Buffer.prototype.copy = function copy (target, targetStart, start, end) { + if (!start) start = 0 + if (!end && end !== 0) end = this.length + if (targetStart >= target.length) targetStart = target.length + if (!targetStart) targetStart = 0 + if (end > 0 && end < start) end = start + + // Copy 0 bytes; we're done + if (end === start) return 0 + if (target.length === 0 || this.length === 0) return 0 + + // Fatal error conditions + if (targetStart < 0) { + throw new RangeError('targetStart out of bounds') + } + if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds') + if (end < 0) throw new RangeError('sourceEnd out of bounds') + + // Are we oob? + if (end > this.length) end = this.length + if (target.length - targetStart < end - start) { + end = target.length - targetStart + start + } + + var len = end - start + var i + + if (this === target && start < targetStart && targetStart < end) { + // descending copy from end + for (i = len - 1; i >= 0; i--) { + target[i + targetStart] = this[i + start] + } + } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) { + // ascending copy from start + for (i = 0; i < len; i++) { + target[i + targetStart] = this[i + start] + } + } else { + target._set(this.subarray(start, start + len), targetStart) + } + + return len +} + +// fill(value, start=0, end=buffer.length) +Buffer.prototype.fill = function fill (value, start, end) { + if (!value) value = 0 + if (!start) start = 0 + if (!end) end = this.length + + if (end < start) throw new RangeError('end < start') + + // Fill 0 bytes; we're done + if (end === start) return + if (this.length === 0) return + + if (start < 0 || start >= this.length) throw new RangeError('start out of bounds') + if (end < 0 || end > this.length) throw new RangeError('end out of bounds') + + var i + if (typeof value === 'number') { + for (i = start; i < end; i++) { + this[i] = value + } + } else { + var bytes = utf8ToBytes(value.toString()) + var len = bytes.length + for (i = start; i < end; i++) { + this[i] = bytes[i % len] + } + } + + return this +} + +/** + * Creates a new `ArrayBuffer` with the *copied* memory of the buffer instance. + * Added in Node 0.12. Only available in browsers that support ArrayBuffer. + */ +Buffer.prototype.toArrayBuffer = function toArrayBuffer () { + if (typeof Uint8Array !== 'undefined') { + if (Buffer.TYPED_ARRAY_SUPPORT) { + return (new Buffer(this)).buffer + } else { + var buf = new Uint8Array(this.length) + for (var i = 0, len = buf.length; i < len; i += 1) { + buf[i] = this[i] + } + return buf.buffer + } + } else { + throw new TypeError('Buffer.toArrayBuffer not supported in this browser') + } +} + +// HELPER FUNCTIONS +// ================ + +var BP = Buffer.prototype + +/** + * Augment a Uint8Array *instance* (not the Uint8Array class!) with Buffer methods + */ +Buffer._augment = function _augment (arr) { + arr.constructor = Buffer + arr._isBuffer = true + + // save reference to original Uint8Array set method before overwriting + arr._set = arr.set + + // deprecated + arr.get = BP.get + arr.set = BP.set + + arr.write = BP.write + arr.toString = BP.toString + arr.toLocaleString = BP.toString + arr.toJSON = BP.toJSON + arr.equals = BP.equals + arr.compare = BP.compare + arr.indexOf = BP.indexOf + arr.copy = BP.copy + arr.slice = BP.slice + arr.readUIntLE = BP.readUIntLE + arr.readUIntBE = BP.readUIntBE + arr.readUInt8 = BP.readUInt8 + arr.readUInt16LE = BP.readUInt16LE + arr.readUInt16BE = BP.readUInt16BE + arr.readUInt32LE = BP.readUInt32LE + arr.readUInt32BE = BP.readUInt32BE + arr.readIntLE = BP.readIntLE + arr.readIntBE = BP.readIntBE + arr.readInt8 = BP.readInt8 + arr.readInt16LE = BP.readInt16LE + arr.readInt16BE = BP.readInt16BE + arr.readInt32LE = BP.readInt32LE + arr.readInt32BE = BP.readInt32BE + arr.readFloatLE = BP.readFloatLE + arr.readFloatBE = BP.readFloatBE + arr.readDoubleLE = BP.readDoubleLE + arr.readDoubleBE = BP.readDoubleBE + arr.writeUInt8 = BP.writeUInt8 + arr.writeUIntLE = BP.writeUIntLE + arr.writeUIntBE = BP.writeUIntBE + arr.writeUInt16LE = BP.writeUInt16LE + arr.writeUInt16BE = BP.writeUInt16BE + arr.writeUInt32LE = BP.writeUInt32LE + arr.writeUInt32BE = BP.writeUInt32BE + arr.writeIntLE = BP.writeIntLE + arr.writeIntBE = BP.writeIntBE + arr.writeInt8 = BP.writeInt8 + arr.writeInt16LE = BP.writeInt16LE + arr.writeInt16BE = BP.writeInt16BE + arr.writeInt32LE = BP.writeInt32LE + arr.writeInt32BE = BP.writeInt32BE + arr.writeFloatLE = BP.writeFloatLE + arr.writeFloatBE = BP.writeFloatBE + arr.writeDoubleLE = BP.writeDoubleLE + arr.writeDoubleBE = BP.writeDoubleBE + arr.fill = BP.fill + arr.inspect = BP.inspect + arr.toArrayBuffer = BP.toArrayBuffer + + return arr +} + +var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g + +function base64clean (str) { + // Node strips out invalid characters like \n and \t from the string, base64-js does not + str = stringtrim(str).replace(INVALID_BASE64_RE, '') + // Node converts strings with length < 2 to '' + if (str.length < 2) return '' + // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not + while (str.length % 4 !== 0) { + str = str + '=' + } + return str +} + +function stringtrim (str) { + if (str.trim) return str.trim() + return str.replace(/^\s+|\s+$/g, '') +} + +function toHex (n) { + if (n < 16) return '0' + n.toString(16) + return n.toString(16) +} + +function utf8ToBytes (string, units) { + units = units || Infinity + var codePoint + var length = string.length + var leadSurrogate = null + var bytes = [] + + for (var i = 0; i < length; i++) { + codePoint = string.charCodeAt(i) + + // is surrogate component + if (codePoint > 0xD7FF && codePoint < 0xE000) { + // last char was a lead + if (!leadSurrogate) { + // no lead yet + if (codePoint > 0xDBFF) { + // unexpected trail + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + continue + } else if (i + 1 === length) { + // unpaired lead + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + continue + } + + // valid lead + leadSurrogate = codePoint + + continue + } + + // 2 leads in a row + if (codePoint < 0xDC00) { + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + leadSurrogate = codePoint + continue + } + + // valid surrogate pair + codePoint = leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00 | 0x10000 + } else if (leadSurrogate) { + // valid bmp char, but last char was a lead + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + } + + leadSurrogate = null + + // encode utf8 + if (codePoint < 0x80) { + if ((units -= 1) < 0) break + bytes.push(codePoint) + } else if (codePoint < 0x800) { + if ((units -= 2) < 0) break + bytes.push( + codePoint >> 0x6 | 0xC0, + codePoint & 0x3F | 0x80 + ) + } else if (codePoint < 0x10000) { + if ((units -= 3) < 0) break + bytes.push( + codePoint >> 0xC | 0xE0, + codePoint >> 0x6 & 0x3F | 0x80, + codePoint & 0x3F | 0x80 + ) + } else if (codePoint < 0x110000) { + if ((units -= 4) < 0) break + bytes.push( + codePoint >> 0x12 | 0xF0, + codePoint >> 0xC & 0x3F | 0x80, + codePoint >> 0x6 & 0x3F | 0x80, + codePoint & 0x3F | 0x80 + ) + } else { + throw new Error('Invalid code point') + } + } + + return bytes +} + +function asciiToBytes (str) { + var byteArray = [] + for (var i = 0; i < str.length; i++) { + // Node's code seems to be doing this and not & 0x7F.. + byteArray.push(str.charCodeAt(i) & 0xFF) + } + return byteArray +} + +function utf16leToBytes (str, units) { + var c, hi, lo + var byteArray = [] + for (var i = 0; i < str.length; i++) { + if ((units -= 2) < 0) break + + c = str.charCodeAt(i) + hi = c >> 8 + lo = c % 256 + byteArray.push(lo) + byteArray.push(hi) + } + + return byteArray +} + +function base64ToBytes (str) { + return base64.toByteArray(base64clean(str)) +} + +function blitBuffer (src, dst, offset, length) { + for (var i = 0; i < length; i++) { + if ((i + offset >= dst.length) || (i >= src.length)) break + dst[i + offset] = src[i] + } + return i +} + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"base64-js":14,"ieee754":15,"is-array":16}],14:[function(require,module,exports){ +var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + +;(function (exports) { + 'use strict'; + + var Arr = (typeof Uint8Array !== 'undefined') + ? Uint8Array + : Array + + var PLUS = '+'.charCodeAt(0) + var SLASH = '/'.charCodeAt(0) + var NUMBER = '0'.charCodeAt(0) + var LOWER = 'a'.charCodeAt(0) + var UPPER = 'A'.charCodeAt(0) + var PLUS_URL_SAFE = '-'.charCodeAt(0) + var SLASH_URL_SAFE = '_'.charCodeAt(0) + + function decode (elt) { + var code = elt.charCodeAt(0) + if (code === PLUS || + code === PLUS_URL_SAFE) + return 62 // '+' + if (code === SLASH || + code === SLASH_URL_SAFE) + return 63 // '/' + if (code < NUMBER) + return -1 //no match + if (code < NUMBER + 10) + return code - NUMBER + 26 + 26 + if (code < UPPER + 26) + return code - UPPER + if (code < LOWER + 26) + return code - LOWER + 26 + } + + function b64ToByteArray (b64) { + var i, j, l, tmp, placeHolders, arr + + if (b64.length % 4 > 0) { + throw new Error('Invalid string. Length must be a multiple of 4') + } + + // the number of equal signs (place holders) + // if there are two placeholders, than the two characters before it + // represent one byte + // if there is only one, then the three characters before it represent 2 bytes + // this is just a cheap hack to not do indexOf twice + var len = b64.length + placeHolders = '=' === b64.charAt(len - 2) ? 2 : '=' === b64.charAt(len - 1) ? 1 : 0 + + // base64 is 4/3 + up to two characters of the original data + arr = new Arr(b64.length * 3 / 4 - placeHolders) + + // if there are placeholders, only get up to the last complete 4 chars + l = placeHolders > 0 ? b64.length - 4 : b64.length + + var L = 0 + + function push (v) { + arr[L++] = v + } + + for (i = 0, j = 0; i < l; i += 4, j += 3) { + tmp = (decode(b64.charAt(i)) << 18) | (decode(b64.charAt(i + 1)) << 12) | (decode(b64.charAt(i + 2)) << 6) | decode(b64.charAt(i + 3)) + push((tmp & 0xFF0000) >> 16) + push((tmp & 0xFF00) >> 8) + push(tmp & 0xFF) + } + + if (placeHolders === 2) { + tmp = (decode(b64.charAt(i)) << 2) | (decode(b64.charAt(i + 1)) >> 4) + push(tmp & 0xFF) + } else if (placeHolders === 1) { + tmp = (decode(b64.charAt(i)) << 10) | (decode(b64.charAt(i + 1)) << 4) | (decode(b64.charAt(i + 2)) >> 2) + push((tmp >> 8) & 0xFF) + push(tmp & 0xFF) + } + + return arr + } + + function uint8ToBase64 (uint8) { + var i, + extraBytes = uint8.length % 3, // if we have 1 byte left, pad 2 bytes + output = "", + temp, length + + function encode (num) { + return lookup.charAt(num) + } + + function tripletToBase64 (num) { + return encode(num >> 18 & 0x3F) + encode(num >> 12 & 0x3F) + encode(num >> 6 & 0x3F) + encode(num & 0x3F) + } + + // go through the array every three bytes, we'll deal with trailing stuff later + for (i = 0, length = uint8.length - extraBytes; i < length; i += 3) { + temp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]) + output += tripletToBase64(temp) + } + + // pad the end with zeros, but make sure to not forget the extra bytes + switch (extraBytes) { + case 1: + temp = uint8[uint8.length - 1] + output += encode(temp >> 2) + output += encode((temp << 4) & 0x3F) + output += '==' + break + case 2: + temp = (uint8[uint8.length - 2] << 8) + (uint8[uint8.length - 1]) + output += encode(temp >> 10) + output += encode((temp >> 4) & 0x3F) + output += encode((temp << 2) & 0x3F) + output += '=' + break + } + + return output + } + + exports.toByteArray = b64ToByteArray + exports.fromByteArray = uint8ToBase64 +}(typeof exports === 'undefined' ? (this.base64js = {}) : exports)) + +},{}],15:[function(require,module,exports){ +exports.read = function (buffer, offset, isLE, mLen, nBytes) { + var e, m + var eLen = nBytes * 8 - mLen - 1 + var eMax = (1 << eLen) - 1 + var eBias = eMax >> 1 + var nBits = -7 + var i = isLE ? (nBytes - 1) : 0 + var d = isLE ? -1 : 1 + var s = buffer[offset + i] + + i += d + + e = s & ((1 << (-nBits)) - 1) + s >>= (-nBits) + nBits += eLen + for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {} + + m = e & ((1 << (-nBits)) - 1) + e >>= (-nBits) + nBits += mLen + for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {} + + if (e === 0) { + e = 1 - eBias + } else if (e === eMax) { + return m ? NaN : ((s ? -1 : 1) * Infinity) + } else { + m = m + Math.pow(2, mLen) + e = e - eBias + } + return (s ? -1 : 1) * m * Math.pow(2, e - mLen) +} + +exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { + var e, m, c + var eLen = nBytes * 8 - mLen - 1 + var eMax = (1 << eLen) - 1 + var eBias = eMax >> 1 + var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0) + var i = isLE ? 0 : (nBytes - 1) + var d = isLE ? 1 : -1 + var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0 + + value = Math.abs(value) + + if (isNaN(value) || value === Infinity) { + m = isNaN(value) ? 1 : 0 + e = eMax + } else { + e = Math.floor(Math.log(value) / Math.LN2) + if (value * (c = Math.pow(2, -e)) < 1) { + e-- + c *= 2 + } + if (e + eBias >= 1) { + value += rt / c + } else { + value += rt * Math.pow(2, 1 - eBias) + } + if (value * c >= 2) { + e++ + c /= 2 + } + + if (e + eBias >= eMax) { + m = 0 + e = eMax + } else if (e + eBias >= 1) { + m = (value * c - 1) * Math.pow(2, mLen) + e = e + eBias + } else { + m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen) + e = 0 + } + } + + for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} + + e = (e << mLen) | m + eLen += mLen + for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} + + buffer[offset + i - d] |= s * 128 +} + +},{}],16:[function(require,module,exports){ + +/** + * isArray + */ + +var isArray = Array.isArray; + +/** + * toString + */ + +var str = Object.prototype.toString; + +/** + * Whether or not the given `val` + * is an array. + * + * example: + * + * isArray([]); + * // > true + * isArray(arguments); + * // > false + * isArray(''); + * // > false + * + * @param {mixed} val + * @return {bool} + */ + +module.exports = isArray || function (val) { + return !! val && '[object Array]' == str.call(val); +}; + +},{}],17:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +function EventEmitter() { + this._events = this._events || {}; + this._maxListeners = this._maxListeners || undefined; +} +module.exports = EventEmitter; + +// Backwards-compat with node 0.10.x +EventEmitter.EventEmitter = EventEmitter; + +EventEmitter.prototype._events = undefined; +EventEmitter.prototype._maxListeners = undefined; + +// By default EventEmitters will print a warning if more than 10 listeners are +// added to it. This is a useful default which helps finding memory leaks. +EventEmitter.defaultMaxListeners = 10; + +// Obviously not all Emitters should be limited to 10. This function allows +// that to be increased. Set to zero for unlimited. +EventEmitter.prototype.setMaxListeners = function(n) { + if (!isNumber(n) || n < 0 || isNaN(n)) + throw TypeError('n must be a positive number'); + this._maxListeners = n; + return this; +}; + +EventEmitter.prototype.emit = function(type) { + var er, handler, len, args, i, listeners; + + if (!this._events) + this._events = {}; + + // If there is no 'error' event listener then throw. + if (type === 'error') { + if (!this._events.error || + (isObject(this._events.error) && !this._events.error.length)) { + er = arguments[1]; + if (er instanceof Error) { + throw er; // Unhandled 'error' event + } + throw TypeError('Uncaught, unspecified "error" event.'); + } + } + + handler = this._events[type]; + + if (isUndefined(handler)) + return false; + + if (isFunction(handler)) { + switch (arguments.length) { + // fast cases + case 1: + handler.call(this); + break; + case 2: + handler.call(this, arguments[1]); + break; + case 3: + handler.call(this, arguments[1], arguments[2]); + break; + // slower + default: + len = arguments.length; + args = new Array(len - 1); + for (i = 1; i < len; i++) + args[i - 1] = arguments[i]; + handler.apply(this, args); + } + } else if (isObject(handler)) { + len = arguments.length; + args = new Array(len - 1); + for (i = 1; i < len; i++) + args[i - 1] = arguments[i]; + + listeners = handler.slice(); + len = listeners.length; + for (i = 0; i < len; i++) + listeners[i].apply(this, args); + } + + return true; +}; + +EventEmitter.prototype.addListener = function(type, listener) { + var m; + + if (!isFunction(listener)) + throw TypeError('listener must be a function'); + + if (!this._events) + this._events = {}; + + // To avoid recursion in the case that type === "newListener"! Before + // adding it to the listeners, first emit "newListener". + if (this._events.newListener) + this.emit('newListener', type, + isFunction(listener.listener) ? + listener.listener : listener); + + if (!this._events[type]) + // Optimize the case of one listener. Don't need the extra array object. + this._events[type] = listener; + else if (isObject(this._events[type])) + // If we've already got an array, just append. + this._events[type].push(listener); + else + // Adding the second element, need to change to array. + this._events[type] = [this._events[type], listener]; + + // Check for listener leak + if (isObject(this._events[type]) && !this._events[type].warned) { + var m; + if (!isUndefined(this._maxListeners)) { + m = this._maxListeners; + } else { + m = EventEmitter.defaultMaxListeners; + } + + if (m && m > 0 && this._events[type].length > m) { + this._events[type].warned = true; + console.error('(node) warning: possible EventEmitter memory ' + + 'leak detected. %d listeners added. ' + + 'Use emitter.setMaxListeners() to increase limit.', + this._events[type].length); + if (typeof console.trace === 'function') { + // not supported in IE 10 + console.trace(); + } + } + } + + return this; +}; + +EventEmitter.prototype.on = EventEmitter.prototype.addListener; + +EventEmitter.prototype.once = function(type, listener) { + if (!isFunction(listener)) + throw TypeError('listener must be a function'); + + var fired = false; + + function g() { + this.removeListener(type, g); + + if (!fired) { + fired = true; + listener.apply(this, arguments); + } + } + + g.listener = listener; + this.on(type, g); + + return this; +}; + +// emits a 'removeListener' event iff the listener was removed +EventEmitter.prototype.removeListener = function(type, listener) { + var list, position, length, i; + + if (!isFunction(listener)) + throw TypeError('listener must be a function'); + + if (!this._events || !this._events[type]) + return this; + + list = this._events[type]; + length = list.length; + position = -1; + + if (list === listener || + (isFunction(list.listener) && list.listener === listener)) { + delete this._events[type]; + if (this._events.removeListener) + this.emit('removeListener', type, listener); + + } else if (isObject(list)) { + for (i = length; i-- > 0;) { + if (list[i] === listener || + (list[i].listener && list[i].listener === listener)) { + position = i; + break; + } + } + + if (position < 0) + return this; + + if (list.length === 1) { + list.length = 0; + delete this._events[type]; + } else { + list.splice(position, 1); + } + + if (this._events.removeListener) + this.emit('removeListener', type, listener); + } + + return this; +}; + +EventEmitter.prototype.removeAllListeners = function(type) { + var key, listeners; + + if (!this._events) + return this; + + // not listening for removeListener, no need to emit + if (!this._events.removeListener) { + if (arguments.length === 0) + this._events = {}; + else if (this._events[type]) + delete this._events[type]; + return this; + } + + // emit removeListener for all listeners on all events + if (arguments.length === 0) { + for (key in this._events) { + if (key === 'removeListener') continue; + this.removeAllListeners(key); + } + this.removeAllListeners('removeListener'); + this._events = {}; + return this; + } + + listeners = this._events[type]; + + if (isFunction(listeners)) { + this.removeListener(type, listeners); + } else { + // LIFO order + while (listeners.length) + this.removeListener(type, listeners[listeners.length - 1]); + } + delete this._events[type]; + + return this; +}; + +EventEmitter.prototype.listeners = function(type) { + var ret; + if (!this._events || !this._events[type]) + ret = []; + else if (isFunction(this._events[type])) + ret = [this._events[type]]; + else + ret = this._events[type].slice(); + return ret; +}; + +EventEmitter.listenerCount = function(emitter, type) { + var ret; + if (!emitter._events || !emitter._events[type]) + ret = 0; + else if (isFunction(emitter._events[type])) + ret = 1; + else + ret = emitter._events[type].length; + return ret; +}; + +function isFunction(arg) { + return typeof arg === 'function'; +} + +function isNumber(arg) { + return typeof arg === 'number'; +} + +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} + +function isUndefined(arg) { + return arg === void 0; +} + +},{}],18:[function(require,module,exports){ +var http = require('http'); + +var https = module.exports; + +for (var key in http) { + if (http.hasOwnProperty(key)) https[key] = http[key]; +}; + +https.request = function (params, cb) { + if (!params) params = {}; + params.scheme = 'https'; + params.protocol = 'https:'; + return http.request.call(this, params, cb); +} + +},{"http":41}],19:[function(require,module,exports){ +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + }; +} else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } +} + +},{}],20:[function(require,module,exports){ +/** + * Determine if an object is Buffer + * + * Author: Feross Aboukhadijeh + * License: MIT + * + * `npm install is-buffer` + */ + +module.exports = function (obj) { + return !!(obj != null && + (obj._isBuffer || // For Safari 5-7 (missing Object.prototype.constructor) + (obj.constructor && + typeof obj.constructor.isBuffer === 'function' && + obj.constructor.isBuffer(obj)) + )) +} + +},{}],21:[function(require,module,exports){ +module.exports = Array.isArray || function (arr) { + return Object.prototype.toString.call(arr) == '[object Array]'; +}; + +},{}],22:[function(require,module,exports){ +// shim for using process in browser + +var process = module.exports = {}; +var queue = []; +var draining = false; +var currentQueue; +var queueIndex = -1; + +function cleanUpNextTick() { + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } +} + +function drainQueue() { + if (draining) { + return; + } + var timeout = setTimeout(cleanUpNextTick); + draining = true; + + var len = queue.length; + while(len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + clearTimeout(timeout); +} + +process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + setTimeout(drainQueue, 0); + } +}; + +// v8 likes predictible objects +function Item(fun, array) { + this.fun = fun; + this.array = array; +} +Item.prototype.run = function () { + this.fun.apply(null, this.array); +}; +process.title = 'browser'; +process.browser = true; +process.env = {}; +process.argv = []; +process.version = ''; // empty string to avoid regexp issues +process.versions = {}; + +function noop() {} + +process.on = noop; +process.addListener = noop; +process.once = noop; +process.off = noop; +process.removeListener = noop; +process.removeAllListeners = noop; +process.emit = noop; + +process.binding = function (name) { + throw new Error('process.binding is not supported'); +}; + +process.cwd = function () { return '/' }; +process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); +}; +process.umask = function() { return 0; }; + +},{}],23:[function(require,module,exports){ +(function (global){ +/*! https://mths.be/punycode v1.3.2 by @mathias */ +;(function(root) { + + /** Detect free variables */ + var freeExports = typeof exports == 'object' && exports && + !exports.nodeType && exports; + var freeModule = typeof module == 'object' && module && + !module.nodeType && module; + var freeGlobal = typeof global == 'object' && global; + if ( + freeGlobal.global === freeGlobal || + freeGlobal.window === freeGlobal || + freeGlobal.self === freeGlobal + ) { + root = freeGlobal; + } + + /** + * The `punycode` object. + * @name punycode + * @type Object + */ + var punycode, + + /** Highest positive signed 32-bit float value */ + maxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1 + + /** Bootstring parameters */ + base = 36, + tMin = 1, + tMax = 26, + skew = 38, + damp = 700, + initialBias = 72, + initialN = 128, // 0x80 + delimiter = '-', // '\x2D' + + /** Regular expressions */ + regexPunycode = /^xn--/, + regexNonASCII = /[^\x20-\x7E]/, // unprintable ASCII chars + non-ASCII chars + regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g, // RFC 3490 separators + + /** Error messages */ + errors = { + 'overflow': 'Overflow: input needs wider integers to process', + 'not-basic': 'Illegal input >= 0x80 (not a basic code point)', + 'invalid-input': 'Invalid input' + }, + + /** Convenience shortcuts */ + baseMinusTMin = base - tMin, + floor = Math.floor, + stringFromCharCode = String.fromCharCode, + + /** Temporary variable */ + key; + + /*--------------------------------------------------------------------------*/ + + /** + * A generic error utility function. + * @private + * @param {String} type The error type. + * @returns {Error} Throws a `RangeError` with the applicable error message. + */ + function error(type) { + throw RangeError(errors[type]); + } + + /** + * A generic `Array#map` utility function. + * @private + * @param {Array} array The array to iterate over. + * @param {Function} callback The function that gets called for every array + * item. + * @returns {Array} A new array of values returned by the callback function. + */ + function map(array, fn) { + var length = array.length; + var result = []; + while (length--) { + result[length] = fn(array[length]); + } + return result; + } + + /** + * A simple `Array#map`-like wrapper to work with domain name strings or email + * addresses. + * @private + * @param {String} domain The domain name or email address. + * @param {Function} callback The function that gets called for every + * character. + * @returns {Array} A new string of characters returned by the callback + * function. + */ + function mapDomain(string, fn) { + var parts = string.split('@'); + var result = ''; + if (parts.length > 1) { + // In email addresses, only the domain name should be punycoded. Leave + // the local part (i.e. everything up to `@`) intact. + result = parts[0] + '@'; + string = parts[1]; + } + // Avoid `split(regex)` for IE8 compatibility. See #17. + string = string.replace(regexSeparators, '\x2E'); + var labels = string.split('.'); + var encoded = map(labels, fn).join('.'); + return result + encoded; + } + + /** + * Creates an array containing the numeric code points of each Unicode + * character in the string. While JavaScript uses UCS-2 internally, + * this function will convert a pair of surrogate halves (each of which + * UCS-2 exposes as separate characters) into a single code point, + * matching UTF-16. + * @see `punycode.ucs2.encode` + * @see + * @memberOf punycode.ucs2 + * @name decode + * @param {String} string The Unicode input string (UCS-2). + * @returns {Array} The new array of code points. + */ + function ucs2decode(string) { + var output = [], + counter = 0, + length = string.length, + value, + extra; + while (counter < length) { + value = string.charCodeAt(counter++); + if (value >= 0xD800 && value <= 0xDBFF && counter < length) { + // high surrogate, and there is a next character + extra = string.charCodeAt(counter++); + if ((extra & 0xFC00) == 0xDC00) { // low surrogate + output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000); + } else { + // unmatched surrogate; only append this code unit, in case the next + // code unit is the high surrogate of a surrogate pair + output.push(value); + counter--; + } + } else { + output.push(value); + } + } + return output; + } + + /** + * Creates a string based on an array of numeric code points. + * @see `punycode.ucs2.decode` + * @memberOf punycode.ucs2 + * @name encode + * @param {Array} codePoints The array of numeric code points. + * @returns {String} The new Unicode string (UCS-2). + */ + function ucs2encode(array) { + return map(array, function(value) { + var output = ''; + if (value > 0xFFFF) { + value -= 0x10000; + output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800); + value = 0xDC00 | value & 0x3FF; + } + output += stringFromCharCode(value); + return output; + }).join(''); + } + + /** + * Converts a basic code point into a digit/integer. + * @see `digitToBasic()` + * @private + * @param {Number} codePoint The basic numeric code point value. + * @returns {Number} The numeric value of a basic code point (for use in + * representing integers) in the range `0` to `base - 1`, or `base` if + * the code point does not represent a value. + */ + function basicToDigit(codePoint) { + if (codePoint - 48 < 10) { + return codePoint - 22; + } + if (codePoint - 65 < 26) { + return codePoint - 65; + } + if (codePoint - 97 < 26) { + return codePoint - 97; + } + return base; + } + + /** + * Converts a digit/integer into a basic code point. + * @see `basicToDigit()` + * @private + * @param {Number} digit The numeric value of a basic code point. + * @returns {Number} The basic code point whose value (when used for + * representing integers) is `digit`, which needs to be in the range + * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is + * used; else, the lowercase form is used. The behavior is undefined + * if `flag` is non-zero and `digit` has no uppercase form. + */ + function digitToBasic(digit, flag) { + // 0..25 map to ASCII a..z or A..Z + // 26..35 map to ASCII 0..9 + return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5); + } + + /** + * Bias adaptation function as per section 3.4 of RFC 3492. + * http://tools.ietf.org/html/rfc3492#section-3.4 + * @private + */ + function adapt(delta, numPoints, firstTime) { + var k = 0; + delta = firstTime ? floor(delta / damp) : delta >> 1; + delta += floor(delta / numPoints); + for (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) { + delta = floor(delta / baseMinusTMin); + } + return floor(k + (baseMinusTMin + 1) * delta / (delta + skew)); + } + + /** + * Converts a Punycode string of ASCII-only symbols to a string of Unicode + * symbols. + * @memberOf punycode + * @param {String} input The Punycode string of ASCII-only symbols. + * @returns {String} The resulting string of Unicode symbols. + */ + function decode(input) { + // Don't use UCS-2 + var output = [], + inputLength = input.length, + out, + i = 0, + n = initialN, + bias = initialBias, + basic, + j, + index, + oldi, + w, + k, + digit, + t, + /** Cached calculation results */ + baseMinusT; + + // Handle the basic code points: let `basic` be the number of input code + // points before the last delimiter, or `0` if there is none, then copy + // the first basic code points to the output. + + basic = input.lastIndexOf(delimiter); + if (basic < 0) { + basic = 0; + } + + for (j = 0; j < basic; ++j) { + // if it's not a basic code point + if (input.charCodeAt(j) >= 0x80) { + error('not-basic'); + } + output.push(input.charCodeAt(j)); + } + + // Main decoding loop: start just after the last delimiter if any basic code + // points were copied; start at the beginning otherwise. + + for (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) { + + // `index` is the index of the next character to be consumed. + // Decode a generalized variable-length integer into `delta`, + // which gets added to `i`. The overflow checking is easier + // if we increase `i` as we go, then subtract off its starting + // value at the end to obtain `delta`. + for (oldi = i, w = 1, k = base; /* no condition */; k += base) { + + if (index >= inputLength) { + error('invalid-input'); + } + + digit = basicToDigit(input.charCodeAt(index++)); + + if (digit >= base || digit > floor((maxInt - i) / w)) { + error('overflow'); + } + + i += digit * w; + t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); + + if (digit < t) { + break; + } + + baseMinusT = base - t; + if (w > floor(maxInt / baseMinusT)) { + error('overflow'); + } + + w *= baseMinusT; + + } + + out = output.length + 1; + bias = adapt(i - oldi, out, oldi == 0); + + // `i` was supposed to wrap around from `out` to `0`, + // incrementing `n` each time, so we'll fix that now: + if (floor(i / out) > maxInt - n) { + error('overflow'); + } + + n += floor(i / out); + i %= out; + + // Insert `n` at position `i` of the output + output.splice(i++, 0, n); + + } + + return ucs2encode(output); + } + + /** + * Converts a string of Unicode symbols (e.g. a domain name label) to a + * Punycode string of ASCII-only symbols. + * @memberOf punycode + * @param {String} input The string of Unicode symbols. + * @returns {String} The resulting Punycode string of ASCII-only symbols. + */ + function encode(input) { + var n, + delta, + handledCPCount, + basicLength, + bias, + j, + m, + q, + k, + t, + currentValue, + output = [], + /** `inputLength` will hold the number of code points in `input`. */ + inputLength, + /** Cached calculation results */ + handledCPCountPlusOne, + baseMinusT, + qMinusT; + + // Convert the input in UCS-2 to Unicode + input = ucs2decode(input); + + // Cache the length + inputLength = input.length; + + // Initialize the state + n = initialN; + delta = 0; + bias = initialBias; + + // Handle the basic code points + for (j = 0; j < inputLength; ++j) { + currentValue = input[j]; + if (currentValue < 0x80) { + output.push(stringFromCharCode(currentValue)); + } + } + + handledCPCount = basicLength = output.length; + + // `handledCPCount` is the number of code points that have been handled; + // `basicLength` is the number of basic code points. + + // Finish the basic string - if it is not empty - with a delimiter + if (basicLength) { + output.push(delimiter); + } + + // Main encoding loop: + while (handledCPCount < inputLength) { + + // All non-basic code points < n have been handled already. Find the next + // larger one: + for (m = maxInt, j = 0; j < inputLength; ++j) { + currentValue = input[j]; + if (currentValue >= n && currentValue < m) { + m = currentValue; + } + } + + // Increase `delta` enough to advance the decoder's state to , + // but guard against overflow + handledCPCountPlusOne = handledCPCount + 1; + if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) { + error('overflow'); + } + + delta += (m - n) * handledCPCountPlusOne; + n = m; + + for (j = 0; j < inputLength; ++j) { + currentValue = input[j]; + + if (currentValue < n && ++delta > maxInt) { + error('overflow'); + } + + if (currentValue == n) { + // Represent delta as a generalized variable-length integer + for (q = delta, k = base; /* no condition */; k += base) { + t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); + if (q < t) { + break; + } + qMinusT = q - t; + baseMinusT = base - t; + output.push( + stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0)) + ); + q = floor(qMinusT / baseMinusT); + } + + output.push(stringFromCharCode(digitToBasic(q, 0))); + bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength); + delta = 0; + ++handledCPCount; + } + } + + ++delta; + ++n; + + } + return output.join(''); + } + + /** + * Converts a Punycode string representing a domain name or an email address + * to Unicode. Only the Punycoded parts of the input will be converted, i.e. + * it doesn't matter if you call it on a string that has already been + * converted to Unicode. + * @memberOf punycode + * @param {String} input The Punycoded domain name or email address to + * convert to Unicode. + * @returns {String} The Unicode representation of the given Punycode + * string. + */ + function toUnicode(input) { + return mapDomain(input, function(string) { + return regexPunycode.test(string) + ? decode(string.slice(4).toLowerCase()) + : string; + }); + } + + /** + * Converts a Unicode string representing a domain name or an email address to + * Punycode. Only the non-ASCII parts of the domain name will be converted, + * i.e. it doesn't matter if you call it with a domain that's already in + * ASCII. + * @memberOf punycode + * @param {String} input The domain name or email address to convert, as a + * Unicode string. + * @returns {String} The Punycode representation of the given domain name or + * email address. + */ + function toASCII(input) { + return mapDomain(input, function(string) { + return regexNonASCII.test(string) + ? 'xn--' + encode(string) + : string; + }); + } + + /*--------------------------------------------------------------------------*/ + + /** Define the public API */ + punycode = { + /** + * A string representing the current Punycode.js version number. + * @memberOf punycode + * @type String + */ + 'version': '1.3.2', + /** + * An object of methods to convert from JavaScript's internal character + * representation (UCS-2) to Unicode code points, and back. + * @see + * @memberOf punycode + * @type Object + */ + 'ucs2': { + 'decode': ucs2decode, + 'encode': ucs2encode + }, + 'decode': decode, + 'encode': encode, + 'toASCII': toASCII, + 'toUnicode': toUnicode + }; + + /** Expose `punycode` */ + // Some AMD build optimizers, like r.js, check for specific condition patterns + // like the following: + if ( + typeof define == 'function' && + typeof define.amd == 'object' && + define.amd + ) { + define('punycode', function() { + return punycode; + }); + } else if (freeExports && freeModule) { + if (module.exports == freeExports) { // in Node.js or RingoJS v0.8.0+ + freeModule.exports = punycode; + } else { // in Narwhal or RingoJS v0.7.0- + for (key in punycode) { + punycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]); + } + } + } else { // in Rhino or a web browser + root.punycode = punycode; + } + +}(this)); + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}],24:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +'use strict'; + +// If obj.hasOwnProperty has been overridden, then calling +// obj.hasOwnProperty(prop) will break. +// See: https://github.com/joyent/node/issues/1707 +function hasOwnProperty(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); +} + +module.exports = function(qs, sep, eq, options) { + sep = sep || '&'; + eq = eq || '='; + var obj = {}; + + if (typeof qs !== 'string' || qs.length === 0) { + return obj; + } + + var regexp = /\+/g; + qs = qs.split(sep); + + var maxKeys = 1000; + if (options && typeof options.maxKeys === 'number') { + maxKeys = options.maxKeys; + } + + var len = qs.length; + // maxKeys <= 0 means that we should not limit keys count + if (maxKeys > 0 && len > maxKeys) { + len = maxKeys; + } + + for (var i = 0; i < len; ++i) { + var x = qs[i].replace(regexp, '%20'), + idx = x.indexOf(eq), + kstr, vstr, k, v; + + if (idx >= 0) { + kstr = x.substr(0, idx); + vstr = x.substr(idx + 1); + } else { + kstr = x; + vstr = ''; + } + + k = decodeURIComponent(kstr); + v = decodeURIComponent(vstr); + + if (!hasOwnProperty(obj, k)) { + obj[k] = v; + } else if (isArray(obj[k])) { + obj[k].push(v); + } else { + obj[k] = [obj[k], v]; + } + } + + return obj; +}; + +var isArray = Array.isArray || function (xs) { + return Object.prototype.toString.call(xs) === '[object Array]'; +}; + +},{}],25:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +'use strict'; + +var stringifyPrimitive = function(v) { + switch (typeof v) { + case 'string': + return v; + + case 'boolean': + return v ? 'true' : 'false'; + + case 'number': + return isFinite(v) ? v : ''; + + default: + return ''; + } +}; + +module.exports = function(obj, sep, eq, name) { + sep = sep || '&'; + eq = eq || '='; + if (obj === null) { + obj = undefined; + } + + if (typeof obj === 'object') { + return map(objectKeys(obj), function(k) { + var ks = encodeURIComponent(stringifyPrimitive(k)) + eq; + if (isArray(obj[k])) { + return map(obj[k], function(v) { + return ks + encodeURIComponent(stringifyPrimitive(v)); + }).join(sep); + } else { + return ks + encodeURIComponent(stringifyPrimitive(obj[k])); + } + }).join(sep); + + } + + if (!name) return ''; + return encodeURIComponent(stringifyPrimitive(name)) + eq + + encodeURIComponent(stringifyPrimitive(obj)); +}; + +var isArray = Array.isArray || function (xs) { + return Object.prototype.toString.call(xs) === '[object Array]'; +}; + +function map (xs, f) { + if (xs.map) return xs.map(f); + var res = []; + for (var i = 0; i < xs.length; i++) { + res.push(f(xs[i], i)); + } + return res; +} + +var objectKeys = Object.keys || function (obj) { + var res = []; + for (var key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) res.push(key); + } + return res; +}; + +},{}],26:[function(require,module,exports){ +'use strict'; + +exports.decode = exports.parse = require('./decode'); +exports.encode = exports.stringify = require('./encode'); + +},{"./decode":24,"./encode":25}],27:[function(require,module,exports){ +module.exports = require("./lib/_stream_duplex.js") + +},{"./lib/_stream_duplex.js":28}],28:[function(require,module,exports){ +// a duplex stream is just a stream that is both readable and writable. +// Since JS doesn't have multiple prototypal inheritance, this class +// prototypally inherits from Readable, and then parasitically from +// Writable. + +'use strict'; + +/**/ +var objectKeys = Object.keys || function (obj) { + var keys = []; + for (var key in obj) keys.push(key); + return keys; +} +/**/ + + +module.exports = Duplex; + +/**/ +var processNextTick = require('process-nextick-args'); +/**/ + + + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +var Readable = require('./_stream_readable'); +var Writable = require('./_stream_writable'); + +util.inherits(Duplex, Readable); + +var keys = objectKeys(Writable.prototype); +for (var v = 0; v < keys.length; v++) { + var method = keys[v]; + if (!Duplex.prototype[method]) + Duplex.prototype[method] = Writable.prototype[method]; +} + +function Duplex(options) { + if (!(this instanceof Duplex)) + return new Duplex(options); + + Readable.call(this, options); + Writable.call(this, options); + + if (options && options.readable === false) + this.readable = false; + + if (options && options.writable === false) + this.writable = false; + + this.allowHalfOpen = true; + if (options && options.allowHalfOpen === false) + this.allowHalfOpen = false; + + this.once('end', onend); +} + +// the no-half-open enforcer +function onend() { + // if we allow half-open state, or if the writable side ended, + // then we're ok. + if (this.allowHalfOpen || this._writableState.ended) + return; + + // no more data can be written. + // But allow more writes to happen in this tick. + processNextTick(onEndNT, this); +} + +function onEndNT(self) { + self.end(); +} + +function forEach (xs, f) { + for (var i = 0, l = xs.length; i < l; i++) { + f(xs[i], i); + } +} + +},{"./_stream_readable":30,"./_stream_writable":32,"core-util-is":33,"inherits":19,"process-nextick-args":34}],29:[function(require,module,exports){ +// a passthrough stream. +// basically just the most minimal sort of Transform stream. +// Every written chunk gets output as-is. + +'use strict'; + +module.exports = PassThrough; + +var Transform = require('./_stream_transform'); + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +util.inherits(PassThrough, Transform); + +function PassThrough(options) { + if (!(this instanceof PassThrough)) + return new PassThrough(options); + + Transform.call(this, options); +} + +PassThrough.prototype._transform = function(chunk, encoding, cb) { + cb(null, chunk); +}; + +},{"./_stream_transform":31,"core-util-is":33,"inherits":19}],30:[function(require,module,exports){ +(function (process){ +'use strict'; + +module.exports = Readable; + +/**/ +var processNextTick = require('process-nextick-args'); +/**/ + + +/**/ +var isArray = require('isarray'); +/**/ + + +/**/ +var Buffer = require('buffer').Buffer; +/**/ + +Readable.ReadableState = ReadableState; + +var EE = require('events'); + +/**/ +var EElistenerCount = function(emitter, type) { + return emitter.listeners(type).length; +}; +/**/ + + + +/**/ +var Stream; +(function (){try{ + Stream = require('st' + 'ream'); +}catch(_){}finally{ + if (!Stream) + Stream = require('events').EventEmitter; +}}()) +/**/ + +var Buffer = require('buffer').Buffer; + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + + + +/**/ +var debugUtil = require('util'); +var debug; +if (debugUtil && debugUtil.debuglog) { + debug = debugUtil.debuglog('stream'); +} else { + debug = function () {}; +} +/**/ + +var StringDecoder; + +util.inherits(Readable, Stream); + +function ReadableState(options, stream) { + var Duplex = require('./_stream_duplex'); + + options = options || {}; + + // object stream flag. Used to make read(n) ignore n and to + // make all the buffer merging and length checks go away + this.objectMode = !!options.objectMode; + + if (stream instanceof Duplex) + this.objectMode = this.objectMode || !!options.readableObjectMode; + + // the point at which it stops calling _read() to fill the buffer + // Note: 0 is a valid value, means "don't call _read preemptively ever" + var hwm = options.highWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + this.highWaterMark = (hwm || hwm === 0) ? hwm : defaultHwm; + + // cast to ints. + this.highWaterMark = ~~this.highWaterMark; + + this.buffer = []; + this.length = 0; + this.pipes = null; + this.pipesCount = 0; + this.flowing = null; + this.ended = false; + this.endEmitted = false; + this.reading = false; + + // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, because any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + this.sync = true; + + // whenever we return null, then we set a flag to say + // that we're awaiting a 'readable' event emission. + this.needReadable = false; + this.emittedReadable = false; + this.readableListening = false; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // when piping, we only care about 'readable' events that happen + // after read()ing all the bytes and not getting any pushback. + this.ranOut = false; + + // the number of writers that are awaiting a drain event in .pipe()s + this.awaitDrain = 0; + + // if true, a maybeReadMore has been scheduled + this.readingMore = false; + + this.decoder = null; + this.encoding = null; + if (options.encoding) { + if (!StringDecoder) + StringDecoder = require('string_decoder/').StringDecoder; + this.decoder = new StringDecoder(options.encoding); + this.encoding = options.encoding; + } +} + +function Readable(options) { + var Duplex = require('./_stream_duplex'); + + if (!(this instanceof Readable)) + return new Readable(options); + + this._readableState = new ReadableState(options, this); + + // legacy + this.readable = true; + + if (options && typeof options.read === 'function') + this._read = options.read; + + Stream.call(this); +} + +// Manually shove something into the read() buffer. +// This returns true if the highWaterMark has not been hit yet, +// similar to how Writable.write() returns true if you should +// write() some more. +Readable.prototype.push = function(chunk, encoding) { + var state = this._readableState; + + if (!state.objectMode && typeof chunk === 'string') { + encoding = encoding || state.defaultEncoding; + if (encoding !== state.encoding) { + chunk = new Buffer(chunk, encoding); + encoding = ''; + } + } + + return readableAddChunk(this, state, chunk, encoding, false); +}; + +// Unshift should *always* be something directly out of read() +Readable.prototype.unshift = function(chunk) { + var state = this._readableState; + return readableAddChunk(this, state, chunk, '', true); +}; + +Readable.prototype.isPaused = function() { + return this._readableState.flowing === false; +}; + +function readableAddChunk(stream, state, chunk, encoding, addToFront) { + var er = chunkInvalid(state, chunk); + if (er) { + stream.emit('error', er); + } else if (chunk === null) { + state.reading = false; + onEofChunk(stream, state); + } else if (state.objectMode || chunk && chunk.length > 0) { + if (state.ended && !addToFront) { + var e = new Error('stream.push() after EOF'); + stream.emit('error', e); + } else if (state.endEmitted && addToFront) { + var e = new Error('stream.unshift() after end event'); + stream.emit('error', e); + } else { + if (state.decoder && !addToFront && !encoding) + chunk = state.decoder.write(chunk); + + if (!addToFront) + state.reading = false; + + // if we want the data now, just emit it. + if (state.flowing && state.length === 0 && !state.sync) { + stream.emit('data', chunk); + stream.read(0); + } else { + // update the buffer info. + state.length += state.objectMode ? 1 : chunk.length; + if (addToFront) + state.buffer.unshift(chunk); + else + state.buffer.push(chunk); + + if (state.needReadable) + emitReadable(stream); + } + + maybeReadMore(stream, state); + } + } else if (!addToFront) { + state.reading = false; + } + + return needMoreData(state); +} + + +// if it's past the high water mark, we can push in some more. +// Also, if we have no data yet, we can stand some +// more bytes. This is to work around cases where hwm=0, +// such as the repl. Also, if the push() triggered a +// readable event, and the user called read(largeNumber) such that +// needReadable was set, then we ought to push more, so that another +// 'readable' event will be triggered. +function needMoreData(state) { + return !state.ended && + (state.needReadable || + state.length < state.highWaterMark || + state.length === 0); +} + +// backwards compatibility. +Readable.prototype.setEncoding = function(enc) { + if (!StringDecoder) + StringDecoder = require('string_decoder/').StringDecoder; + this._readableState.decoder = new StringDecoder(enc); + this._readableState.encoding = enc; + return this; +}; + +// Don't raise the hwm > 8MB +var MAX_HWM = 0x800000; +function computeNewHighWaterMark(n) { + if (n >= MAX_HWM) { + n = MAX_HWM; + } else { + // Get the next highest power of 2 + n--; + n |= n >>> 1; + n |= n >>> 2; + n |= n >>> 4; + n |= n >>> 8; + n |= n >>> 16; + n++; + } + return n; +} + +function howMuchToRead(n, state) { + if (state.length === 0 && state.ended) + return 0; + + if (state.objectMode) + return n === 0 ? 0 : 1; + + if (n === null || isNaN(n)) { + // only flow one buffer at a time + if (state.flowing && state.buffer.length) + return state.buffer[0].length; + else + return state.length; + } + + if (n <= 0) + return 0; + + // If we're asking for more than the target buffer level, + // then raise the water mark. Bump up to the next highest + // power of 2, to prevent increasing it excessively in tiny + // amounts. + if (n > state.highWaterMark) + state.highWaterMark = computeNewHighWaterMark(n); + + // don't have that much. return null, unless we've ended. + if (n > state.length) { + if (!state.ended) { + state.needReadable = true; + return 0; + } else { + return state.length; + } + } + + return n; +} + +// you can override either this method, or the async _read(n) below. +Readable.prototype.read = function(n) { + debug('read', n); + var state = this._readableState; + var nOrig = n; + + if (typeof n !== 'number' || n > 0) + state.emittedReadable = false; + + // if we're doing read(0) to trigger a readable event, but we + // already have a bunch of data in the buffer, then just trigger + // the 'readable' event and move on. + if (n === 0 && + state.needReadable && + (state.length >= state.highWaterMark || state.ended)) { + debug('read: emitReadable', state.length, state.ended); + if (state.length === 0 && state.ended) + endReadable(this); + else + emitReadable(this); + return null; + } + + n = howMuchToRead(n, state); + + // if we've ended, and we're now clear, then finish it up. + if (n === 0 && state.ended) { + if (state.length === 0) + endReadable(this); + return null; + } + + // All the actual chunk generation logic needs to be + // *below* the call to _read. The reason is that in certain + // synthetic stream cases, such as passthrough streams, _read + // may be a completely synchronous operation which may change + // the state of the read buffer, providing enough data when + // before there was *not* enough. + // + // So, the steps are: + // 1. Figure out what the state of things will be after we do + // a read from the buffer. + // + // 2. If that resulting state will trigger a _read, then call _read. + // Note that this may be asynchronous, or synchronous. Yes, it is + // deeply ugly to write APIs this way, but that still doesn't mean + // that the Readable class should behave improperly, as streams are + // designed to be sync/async agnostic. + // Take note if the _read call is sync or async (ie, if the read call + // has returned yet), so that we know whether or not it's safe to emit + // 'readable' etc. + // + // 3. Actually pull the requested chunks out of the buffer and return. + + // if we need a readable event, then we need to do some reading. + var doRead = state.needReadable; + debug('need readable', doRead); + + // if we currently have less than the highWaterMark, then also read some + if (state.length === 0 || state.length - n < state.highWaterMark) { + doRead = true; + debug('length less than watermark', doRead); + } + + // however, if we've ended, then there's no point, and if we're already + // reading, then it's unnecessary. + if (state.ended || state.reading) { + doRead = false; + debug('reading or ended', doRead); + } + + if (doRead) { + debug('do read'); + state.reading = true; + state.sync = true; + // if the length is currently zero, then we *need* a readable event. + if (state.length === 0) + state.needReadable = true; + // call internal read method + this._read(state.highWaterMark); + state.sync = false; + } + + // If _read pushed data synchronously, then `reading` will be false, + // and we need to re-evaluate how much data we can return to the user. + if (doRead && !state.reading) + n = howMuchToRead(nOrig, state); + + var ret; + if (n > 0) + ret = fromList(n, state); + else + ret = null; + + if (ret === null) { + state.needReadable = true; + n = 0; + } + + state.length -= n; + + // If we have nothing in the buffer, then we want to know + // as soon as we *do* get something into the buffer. + if (state.length === 0 && !state.ended) + state.needReadable = true; + + // If we tried to read() past the EOF, then emit end on the next tick. + if (nOrig !== n && state.ended && state.length === 0) + endReadable(this); + + if (ret !== null) + this.emit('data', ret); + + return ret; +}; + +function chunkInvalid(state, chunk) { + var er = null; + if (!(Buffer.isBuffer(chunk)) && + typeof chunk !== 'string' && + chunk !== null && + chunk !== undefined && + !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + return er; +} + + +function onEofChunk(stream, state) { + if (state.ended) return; + if (state.decoder) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) { + state.buffer.push(chunk); + state.length += state.objectMode ? 1 : chunk.length; + } + } + state.ended = true; + + // emit 'readable' now to make sure it gets picked up. + emitReadable(stream); +} + +// Don't emit readable right away in sync mode, because this can trigger +// another read() call => stack overflow. This way, it might trigger +// a nextTick recursion warning, but that's not so bad. +function emitReadable(stream) { + var state = stream._readableState; + state.needReadable = false; + if (!state.emittedReadable) { + debug('emitReadable', state.flowing); + state.emittedReadable = true; + if (state.sync) + processNextTick(emitReadable_, stream); + else + emitReadable_(stream); + } +} + +function emitReadable_(stream) { + debug('emit readable'); + stream.emit('readable'); + flow(stream); +} + + +// at this point, the user has presumably seen the 'readable' event, +// and called read() to consume some data. that may have triggered +// in turn another _read(n) call, in which case reading = true if +// it's in progress. +// However, if we're not ended, or reading, and the length < hwm, +// then go ahead and try to read some more preemptively. +function maybeReadMore(stream, state) { + if (!state.readingMore) { + state.readingMore = true; + processNextTick(maybeReadMore_, stream, state); + } +} + +function maybeReadMore_(stream, state) { + var len = state.length; + while (!state.reading && !state.flowing && !state.ended && + state.length < state.highWaterMark) { + debug('maybeReadMore read 0'); + stream.read(0); + if (len === state.length) + // didn't get any data, stop spinning. + break; + else + len = state.length; + } + state.readingMore = false; +} + +// abstract method. to be overridden in specific implementation classes. +// call cb(er, data) where data is <= n in length. +// for virtual (non-string, non-buffer) streams, "length" is somewhat +// arbitrary, and perhaps not very meaningful. +Readable.prototype._read = function(n) { + this.emit('error', new Error('not implemented')); +}; + +Readable.prototype.pipe = function(dest, pipeOpts) { + var src = this; + var state = this._readableState; + + switch (state.pipesCount) { + case 0: + state.pipes = dest; + break; + case 1: + state.pipes = [state.pipes, dest]; + break; + default: + state.pipes.push(dest); + break; + } + state.pipesCount += 1; + debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); + + var doEnd = (!pipeOpts || pipeOpts.end !== false) && + dest !== process.stdout && + dest !== process.stderr; + + var endFn = doEnd ? onend : cleanup; + if (state.endEmitted) + processNextTick(endFn); + else + src.once('end', endFn); + + dest.on('unpipe', onunpipe); + function onunpipe(readable) { + debug('onunpipe'); + if (readable === src) { + cleanup(); + } + } + + function onend() { + debug('onend'); + dest.end(); + } + + // when the dest drains, it reduces the awaitDrain counter + // on the source. This would be more elegant with a .once() + // handler in flow(), but adding and removing repeatedly is + // too slow. + var ondrain = pipeOnDrain(src); + dest.on('drain', ondrain); + + function cleanup() { + debug('cleanup'); + // cleanup event handlers once the pipe is broken + dest.removeListener('close', onclose); + dest.removeListener('finish', onfinish); + dest.removeListener('drain', ondrain); + dest.removeListener('error', onerror); + dest.removeListener('unpipe', onunpipe); + src.removeListener('end', onend); + src.removeListener('end', cleanup); + src.removeListener('data', ondata); + + // if the reader is waiting for a drain event from this + // specific writer, then it would cause it to never start + // flowing again. + // So, if this is awaiting a drain, then we just call it now. + // If we don't know, then assume that we are waiting for one. + if (state.awaitDrain && + (!dest._writableState || dest._writableState.needDrain)) + ondrain(); + } + + src.on('data', ondata); + function ondata(chunk) { + debug('ondata'); + var ret = dest.write(chunk); + if (false === ret) { + debug('false write response, pause', + src._readableState.awaitDrain); + src._readableState.awaitDrain++; + src.pause(); + } + } + + // if the dest has an error, then stop piping into it. + // however, don't suppress the throwing behavior for this. + function onerror(er) { + debug('onerror', er); + unpipe(); + dest.removeListener('error', onerror); + if (EElistenerCount(dest, 'error') === 0) + dest.emit('error', er); + } + // This is a brutally ugly hack to make sure that our error handler + // is attached before any userland ones. NEVER DO THIS. + if (!dest._events || !dest._events.error) + dest.on('error', onerror); + else if (isArray(dest._events.error)) + dest._events.error.unshift(onerror); + else + dest._events.error = [onerror, dest._events.error]; + + + // Both close and finish should trigger unpipe, but only once. + function onclose() { + dest.removeListener('finish', onfinish); + unpipe(); + } + dest.once('close', onclose); + function onfinish() { + debug('onfinish'); + dest.removeListener('close', onclose); + unpipe(); + } + dest.once('finish', onfinish); + + function unpipe() { + debug('unpipe'); + src.unpipe(dest); + } + + // tell the dest that it's being piped to + dest.emit('pipe', src); + + // start the flow if it hasn't been started already. + if (!state.flowing) { + debug('pipe resume'); + src.resume(); + } + + return dest; +}; + +function pipeOnDrain(src) { + return function() { + var state = src._readableState; + debug('pipeOnDrain', state.awaitDrain); + if (state.awaitDrain) + state.awaitDrain--; + if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) { + state.flowing = true; + flow(src); + } + }; +} + + +Readable.prototype.unpipe = function(dest) { + var state = this._readableState; + + // if we're not piping anywhere, then do nothing. + if (state.pipesCount === 0) + return this; + + // just one destination. most common case. + if (state.pipesCount === 1) { + // passed in one, but it's not the right one. + if (dest && dest !== state.pipes) + return this; + + if (!dest) + dest = state.pipes; + + // got a match. + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + if (dest) + dest.emit('unpipe', this); + return this; + } + + // slow case. multiple pipe destinations. + + if (!dest) { + // remove all. + var dests = state.pipes; + var len = state.pipesCount; + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + + for (var i = 0; i < len; i++) + dests[i].emit('unpipe', this); + return this; + } + + // try to find the right one. + var i = indexOf(state.pipes, dest); + if (i === -1) + return this; + + state.pipes.splice(i, 1); + state.pipesCount -= 1; + if (state.pipesCount === 1) + state.pipes = state.pipes[0]; + + dest.emit('unpipe', this); + + return this; +}; + +// set up data events if they are asked for +// Ensure readable listeners eventually get something +Readable.prototype.on = function(ev, fn) { + var res = Stream.prototype.on.call(this, ev, fn); + + // If listening to data, and it has not explicitly been paused, + // then call resume to start the flow of data on the next tick. + if (ev === 'data' && false !== this._readableState.flowing) { + this.resume(); + } + + if (ev === 'readable' && this.readable) { + var state = this._readableState; + if (!state.readableListening) { + state.readableListening = true; + state.emittedReadable = false; + state.needReadable = true; + if (!state.reading) { + processNextTick(nReadingNextTick, this); + } else if (state.length) { + emitReadable(this, state); + } + } + } + + return res; +}; +Readable.prototype.addListener = Readable.prototype.on; + +function nReadingNextTick(self) { + debug('readable nexttick read 0'); + self.read(0); +} + +// pause() and resume() are remnants of the legacy readable stream API +// If the user uses them, then switch into old mode. +Readable.prototype.resume = function() { + var state = this._readableState; + if (!state.flowing) { + debug('resume'); + state.flowing = true; + resume(this, state); + } + return this; +}; + +function resume(stream, state) { + if (!state.resumeScheduled) { + state.resumeScheduled = true; + processNextTick(resume_, stream, state); + } +} + +function resume_(stream, state) { + if (!state.reading) { + debug('resume read 0'); + stream.read(0); + } + + state.resumeScheduled = false; + stream.emit('resume'); + flow(stream); + if (state.flowing && !state.reading) + stream.read(0); +} + +Readable.prototype.pause = function() { + debug('call pause flowing=%j', this._readableState.flowing); + if (false !== this._readableState.flowing) { + debug('pause'); + this._readableState.flowing = false; + this.emit('pause'); + } + return this; +}; + +function flow(stream) { + var state = stream._readableState; + debug('flow', state.flowing); + if (state.flowing) { + do { + var chunk = stream.read(); + } while (null !== chunk && state.flowing); + } +} + +// wrap an old-style stream as the async data source. +// This is *not* part of the readable stream interface. +// It is an ugly unfortunate mess of history. +Readable.prototype.wrap = function(stream) { + var state = this._readableState; + var paused = false; + + var self = this; + stream.on('end', function() { + debug('wrapped end'); + if (state.decoder && !state.ended) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) + self.push(chunk); + } + + self.push(null); + }); + + stream.on('data', function(chunk) { + debug('wrapped data'); + if (state.decoder) + chunk = state.decoder.write(chunk); + + // don't skip over falsy values in objectMode + if (state.objectMode && (chunk === null || chunk === undefined)) + return; + else if (!state.objectMode && (!chunk || !chunk.length)) + return; + + var ret = self.push(chunk); + if (!ret) { + paused = true; + stream.pause(); + } + }); + + // proxy all the other methods. + // important when wrapping filters and duplexes. + for (var i in stream) { + if (this[i] === undefined && typeof stream[i] === 'function') { + this[i] = function(method) { return function() { + return stream[method].apply(stream, arguments); + }; }(i); + } + } + + // proxy certain important events. + var events = ['error', 'close', 'destroy', 'pause', 'resume']; + forEach(events, function(ev) { + stream.on(ev, self.emit.bind(self, ev)); + }); + + // when we try to consume some more bytes, simply unpause the + // underlying stream. + self._read = function(n) { + debug('wrapped _read', n); + if (paused) { + paused = false; + stream.resume(); + } + }; + + return self; +}; + + +// exposed for testing purposes only. +Readable._fromList = fromList; + +// Pluck off n bytes from an array of buffers. +// Length is the combined lengths of all the buffers in the list. +function fromList(n, state) { + var list = state.buffer; + var length = state.length; + var stringMode = !!state.decoder; + var objectMode = !!state.objectMode; + var ret; + + // nothing in the list, definitely empty. + if (list.length === 0) + return null; + + if (length === 0) + ret = null; + else if (objectMode) + ret = list.shift(); + else if (!n || n >= length) { + // read it all, truncate the array. + if (stringMode) + ret = list.join(''); + else + ret = Buffer.concat(list, length); + list.length = 0; + } else { + // read just some of it. + if (n < list[0].length) { + // just take a part of the first list item. + // slice is the same for buffers and strings. + var buf = list[0]; + ret = buf.slice(0, n); + list[0] = buf.slice(n); + } else if (n === list[0].length) { + // first list is a perfect match + ret = list.shift(); + } else { + // complex case. + // we have enough to cover it, but it spans past the first buffer. + if (stringMode) + ret = ''; + else + ret = new Buffer(n); + + var c = 0; + for (var i = 0, l = list.length; i < l && c < n; i++) { + var buf = list[0]; + var cpy = Math.min(n - c, buf.length); + + if (stringMode) + ret += buf.slice(0, cpy); + else + buf.copy(ret, c, 0, cpy); + + if (cpy < buf.length) + list[0] = buf.slice(cpy); + else + list.shift(); + + c += cpy; + } + } + } + + return ret; +} + +function endReadable(stream) { + var state = stream._readableState; + + // If we get here before consuming all the bytes, then that is a + // bug in node. Should never happen. + if (state.length > 0) + throw new Error('endReadable called on non-empty stream'); + + if (!state.endEmitted) { + state.ended = true; + processNextTick(endReadableNT, state, stream); + } +} + +function endReadableNT(state, stream) { + // Check that we didn't get one last unshift. + if (!state.endEmitted && state.length === 0) { + state.endEmitted = true; + stream.readable = false; + stream.emit('end'); + } +} + +function forEach (xs, f) { + for (var i = 0, l = xs.length; i < l; i++) { + f(xs[i], i); + } +} + +function indexOf (xs, x) { + for (var i = 0, l = xs.length; i < l; i++) { + if (xs[i] === x) return i; + } + return -1; +} + +}).call(this,require('_process')) +},{"./_stream_duplex":28,"_process":22,"buffer":13,"core-util-is":33,"events":17,"inherits":19,"isarray":21,"process-nextick-args":34,"string_decoder/":50,"util":12}],31:[function(require,module,exports){ +// a transform stream is a readable/writable stream where you do +// something with the data. Sometimes it's called a "filter", +// but that's not a great name for it, since that implies a thing where +// some bits pass through, and others are simply ignored. (That would +// be a valid example of a transform, of course.) +// +// While the output is causally related to the input, it's not a +// necessarily symmetric or synchronous transformation. For example, +// a zlib stream might take multiple plain-text writes(), and then +// emit a single compressed chunk some time in the future. +// +// Here's how this works: +// +// The Transform stream has all the aspects of the readable and writable +// stream classes. When you write(chunk), that calls _write(chunk,cb) +// internally, and returns false if there's a lot of pending writes +// buffered up. When you call read(), that calls _read(n) until +// there's enough pending readable data buffered up. +// +// In a transform stream, the written data is placed in a buffer. When +// _read(n) is called, it transforms the queued up data, calling the +// buffered _write cb's as it consumes chunks. If consuming a single +// written chunk would result in multiple output chunks, then the first +// outputted bit calls the readcb, and subsequent chunks just go into +// the read buffer, and will cause it to emit 'readable' if necessary. +// +// This way, back-pressure is actually determined by the reading side, +// since _read has to be called to start processing a new chunk. However, +// a pathological inflate type of transform can cause excessive buffering +// here. For example, imagine a stream where every byte of input is +// interpreted as an integer from 0-255, and then results in that many +// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in +// 1kb of data being output. In this case, you could write a very small +// amount of input, and end up with a very large amount of output. In +// such a pathological inflating mechanism, there'd be no way to tell +// the system to stop doing the transform. A single 4MB write could +// cause the system to run out of memory. +// +// However, even in such a pathological case, only a single written chunk +// would be consumed, and then the rest would wait (un-transformed) until +// the results of the previous transformed chunk were consumed. + +'use strict'; + +module.exports = Transform; + +var Duplex = require('./_stream_duplex'); + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +util.inherits(Transform, Duplex); + + +function TransformState(stream) { + this.afterTransform = function(er, data) { + return afterTransform(stream, er, data); + }; + + this.needTransform = false; + this.transforming = false; + this.writecb = null; + this.writechunk = null; +} + +function afterTransform(stream, er, data) { + var ts = stream._transformState; + ts.transforming = false; + + var cb = ts.writecb; + + if (!cb) + return stream.emit('error', new Error('no writecb in Transform class')); + + ts.writechunk = null; + ts.writecb = null; + + if (data !== null && data !== undefined) + stream.push(data); + + if (cb) + cb(er); + + var rs = stream._readableState; + rs.reading = false; + if (rs.needReadable || rs.length < rs.highWaterMark) { + stream._read(rs.highWaterMark); + } +} + + +function Transform(options) { + if (!(this instanceof Transform)) + return new Transform(options); + + Duplex.call(this, options); + + this._transformState = new TransformState(this); + + // when the writable side finishes, then flush out anything remaining. + var stream = this; + + // start out asking for a readable event once data is transformed. + this._readableState.needReadable = true; + + // we have implemented the _read method, and done the other things + // that Readable wants before the first _read call, so unset the + // sync guard flag. + this._readableState.sync = false; + + if (options) { + if (typeof options.transform === 'function') + this._transform = options.transform; + + if (typeof options.flush === 'function') + this._flush = options.flush; + } + + this.once('prefinish', function() { + if (typeof this._flush === 'function') + this._flush(function(er) { + done(stream, er); + }); + else + done(stream); + }); +} + +Transform.prototype.push = function(chunk, encoding) { + this._transformState.needTransform = false; + return Duplex.prototype.push.call(this, chunk, encoding); +}; + +// This is the part where you do stuff! +// override this function in implementation classes. +// 'chunk' is an input chunk. +// +// Call `push(newChunk)` to pass along transformed output +// to the readable side. You may call 'push' zero or more times. +// +// Call `cb(err)` when you are done with this chunk. If you pass +// an error, then that'll put the hurt on the whole operation. If you +// never call cb(), then you'll never get another chunk. +Transform.prototype._transform = function(chunk, encoding, cb) { + throw new Error('not implemented'); +}; + +Transform.prototype._write = function(chunk, encoding, cb) { + var ts = this._transformState; + ts.writecb = cb; + ts.writechunk = chunk; + ts.writeencoding = encoding; + if (!ts.transforming) { + var rs = this._readableState; + if (ts.needTransform || + rs.needReadable || + rs.length < rs.highWaterMark) + this._read(rs.highWaterMark); + } +}; + +// Doesn't matter what the args are here. +// _transform does all the work. +// That we got here means that the readable side wants more data. +Transform.prototype._read = function(n) { + var ts = this._transformState; + + if (ts.writechunk !== null && ts.writecb && !ts.transforming) { + ts.transforming = true; + this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); + } else { + // mark that we need a transform, so that any data that comes in + // will get processed, now that we've asked for it. + ts.needTransform = true; + } +}; + + +function done(stream, er) { + if (er) + return stream.emit('error', er); + + // if there's nothing in the write buffer, then that means + // that nothing more will ever be provided + var ws = stream._writableState; + var ts = stream._transformState; + + if (ws.length) + throw new Error('calling transform done when ws.length != 0'); + + if (ts.transforming) + throw new Error('calling transform done when still transforming'); + + return stream.push(null); +} + +},{"./_stream_duplex":28,"core-util-is":33,"inherits":19}],32:[function(require,module,exports){ +// A bit simpler than readable streams. +// Implement an async ._write(chunk, cb), and it'll handle all +// the drain event emission and buffering. + +'use strict'; + +module.exports = Writable; + +/**/ +var processNextTick = require('process-nextick-args'); +/**/ + + +/**/ +var Buffer = require('buffer').Buffer; +/**/ + +Writable.WritableState = WritableState; + + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + + +/**/ +var internalUtil = { + deprecate: require('util-deprecate') +}; +/**/ + + + +/**/ +var Stream; +(function (){try{ + Stream = require('st' + 'ream'); +}catch(_){}finally{ + if (!Stream) + Stream = require('events').EventEmitter; +}}()) +/**/ + +var Buffer = require('buffer').Buffer; + +util.inherits(Writable, Stream); + +function nop() {} + +function WriteReq(chunk, encoding, cb) { + this.chunk = chunk; + this.encoding = encoding; + this.callback = cb; + this.next = null; +} + +function WritableState(options, stream) { + var Duplex = require('./_stream_duplex'); + + options = options || {}; + + // object stream flag to indicate whether or not this stream + // contains buffers or objects. + this.objectMode = !!options.objectMode; + + if (stream instanceof Duplex) + this.objectMode = this.objectMode || !!options.writableObjectMode; + + // the point at which write() starts returning false + // Note: 0 is a valid value, means that we always return false if + // the entire buffer is not flushed immediately on write() + var hwm = options.highWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + this.highWaterMark = (hwm || hwm === 0) ? hwm : defaultHwm; + + // cast to ints. + this.highWaterMark = ~~this.highWaterMark; + + this.needDrain = false; + // at the start of calling end() + this.ending = false; + // when end() has been called, and returned + this.ended = false; + // when 'finish' is emitted + this.finished = false; + + // should we decode strings into buffers before passing to _write? + // this is here so that some node-core streams can optimize string + // handling at a lower level. + var noDecode = options.decodeStrings === false; + this.decodeStrings = !noDecode; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // not an actual buffer we keep track of, but a measurement + // of how much we're waiting to get pushed to some underlying + // socket or file. + this.length = 0; + + // a flag to see when we're in the middle of a write. + this.writing = false; + + // when true all writes will be buffered until .uncork() call + this.corked = 0; + + // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, because any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + this.sync = true; + + // a flag to know if we're processing previously buffered items, which + // may call the _write() callback in the same tick, so that we don't + // end up in an overlapped onwrite situation. + this.bufferProcessing = false; + + // the callback that's passed to _write(chunk,cb) + this.onwrite = function(er) { + onwrite(stream, er); + }; + + // the callback that the user supplies to write(chunk,encoding,cb) + this.writecb = null; + + // the amount that is being written when _write is called. + this.writelen = 0; + + this.bufferedRequest = null; + this.lastBufferedRequest = null; + + // number of pending user-supplied write callbacks + // this must be 0 before 'finish' can be emitted + this.pendingcb = 0; + + // emit prefinish if the only thing we're waiting for is _write cbs + // This is relevant for synchronous Transform streams + this.prefinished = false; + + // True if the error was already emitted and should not be thrown again + this.errorEmitted = false; +} + +WritableState.prototype.getBuffer = function writableStateGetBuffer() { + var current = this.bufferedRequest; + var out = []; + while (current) { + out.push(current); + current = current.next; + } + return out; +}; + +(function (){try { +Object.defineProperty(WritableState.prototype, 'buffer', { + get: internalUtil.deprecate(function() { + return this.getBuffer(); + }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + + 'instead.') +}); +}catch(_){}}()); + + +function Writable(options) { + var Duplex = require('./_stream_duplex'); + + // Writable ctor is applied to Duplexes, though they're not + // instanceof Writable, they're instanceof Readable. + if (!(this instanceof Writable) && !(this instanceof Duplex)) + return new Writable(options); + + this._writableState = new WritableState(options, this); + + // legacy. + this.writable = true; + + if (options) { + if (typeof options.write === 'function') + this._write = options.write; + + if (typeof options.writev === 'function') + this._writev = options.writev; + } + + Stream.call(this); +} + +// Otherwise people can pipe Writable streams, which is just wrong. +Writable.prototype.pipe = function() { + this.emit('error', new Error('Cannot pipe. Not readable.')); +}; + + +function writeAfterEnd(stream, cb) { + var er = new Error('write after end'); + // TODO: defer error events consistently everywhere, not just the cb + stream.emit('error', er); + processNextTick(cb, er); +} + +// If we get something that is not a buffer, string, null, or undefined, +// and we're not in objectMode, then that's an error. +// Otherwise stream chunks are all considered to be of length=1, and the +// watermarks determine how many objects to keep in the buffer, rather than +// how many bytes or characters. +function validChunk(stream, state, chunk, cb) { + var valid = true; + + if (!(Buffer.isBuffer(chunk)) && + typeof chunk !== 'string' && + chunk !== null && + chunk !== undefined && + !state.objectMode) { + var er = new TypeError('Invalid non-string/buffer chunk'); + stream.emit('error', er); + processNextTick(cb, er); + valid = false; + } + return valid; +} + +Writable.prototype.write = function(chunk, encoding, cb) { + var state = this._writableState; + var ret = false; + + if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (Buffer.isBuffer(chunk)) + encoding = 'buffer'; + else if (!encoding) + encoding = state.defaultEncoding; + + if (typeof cb !== 'function') + cb = nop; + + if (state.ended) + writeAfterEnd(this, cb); + else if (validChunk(this, state, chunk, cb)) { + state.pendingcb++; + ret = writeOrBuffer(this, state, chunk, encoding, cb); + } + + return ret; +}; + +Writable.prototype.cork = function() { + var state = this._writableState; + + state.corked++; +}; + +Writable.prototype.uncork = function() { + var state = this._writableState; + + if (state.corked) { + state.corked--; + + if (!state.writing && + !state.corked && + !state.finished && + !state.bufferProcessing && + state.bufferedRequest) + clearBuffer(this, state); + } +}; + +Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { + // node::ParseEncoding() requires lower case. + if (typeof encoding === 'string') + encoding = encoding.toLowerCase(); + if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', +'ucs2', 'ucs-2','utf16le', 'utf-16le', 'raw'] +.indexOf((encoding + '').toLowerCase()) > -1)) + throw new TypeError('Unknown encoding: ' + encoding); + this._writableState.defaultEncoding = encoding; +}; + +function decodeChunk(state, chunk, encoding) { + if (!state.objectMode && + state.decodeStrings !== false && + typeof chunk === 'string') { + chunk = new Buffer(chunk, encoding); + } + return chunk; +} + +// if we're already writing something, then just put this +// in the queue, and wait our turn. Otherwise, call _write +// If we return false, then we need a drain event, so set that flag. +function writeOrBuffer(stream, state, chunk, encoding, cb) { + chunk = decodeChunk(state, chunk, encoding); + + if (Buffer.isBuffer(chunk)) + encoding = 'buffer'; + var len = state.objectMode ? 1 : chunk.length; + + state.length += len; + + var ret = state.length < state.highWaterMark; + // we must ensure that previous needDrain will not be reset to false. + if (!ret) + state.needDrain = true; + + if (state.writing || state.corked) { + var last = state.lastBufferedRequest; + state.lastBufferedRequest = new WriteReq(chunk, encoding, cb); + if (last) { + last.next = state.lastBufferedRequest; + } else { + state.bufferedRequest = state.lastBufferedRequest; + } + } else { + doWrite(stream, state, false, len, chunk, encoding, cb); + } + + return ret; +} + +function doWrite(stream, state, writev, len, chunk, encoding, cb) { + state.writelen = len; + state.writecb = cb; + state.writing = true; + state.sync = true; + if (writev) + stream._writev(chunk, state.onwrite); + else + stream._write(chunk, encoding, state.onwrite); + state.sync = false; +} + +function onwriteError(stream, state, sync, er, cb) { + --state.pendingcb; + if (sync) + processNextTick(cb, er); + else + cb(er); + + stream._writableState.errorEmitted = true; + stream.emit('error', er); +} + +function onwriteStateUpdate(state) { + state.writing = false; + state.writecb = null; + state.length -= state.writelen; + state.writelen = 0; +} + +function onwrite(stream, er) { + var state = stream._writableState; + var sync = state.sync; + var cb = state.writecb; + + onwriteStateUpdate(state); + + if (er) + onwriteError(stream, state, sync, er, cb); + else { + // Check if we're actually ready to finish, but don't emit yet + var finished = needFinish(state); + + if (!finished && + !state.corked && + !state.bufferProcessing && + state.bufferedRequest) { + clearBuffer(stream, state); + } + + if (sync) { + processNextTick(afterWrite, stream, state, finished, cb); + } else { + afterWrite(stream, state, finished, cb); + } + } +} + +function afterWrite(stream, state, finished, cb) { + if (!finished) + onwriteDrain(stream, state); + state.pendingcb--; + cb(); + finishMaybe(stream, state); +} + +// Must force callback to be called on nextTick, so that we don't +// emit 'drain' before the write() consumer gets the 'false' return +// value, and has a chance to attach a 'drain' listener. +function onwriteDrain(stream, state) { + if (state.length === 0 && state.needDrain) { + state.needDrain = false; + stream.emit('drain'); + } +} + + +// if there's something in the buffer waiting, then process it +function clearBuffer(stream, state) { + state.bufferProcessing = true; + var entry = state.bufferedRequest; + + if (stream._writev && entry && entry.next) { + // Fast case, write everything using _writev() + var buffer = []; + var cbs = []; + while (entry) { + cbs.push(entry.callback); + buffer.push(entry); + entry = entry.next; + } + + // count the one we are adding, as well. + // TODO(isaacs) clean this up + state.pendingcb++; + state.lastBufferedRequest = null; + doWrite(stream, state, true, state.length, buffer, '', function(err) { + for (var i = 0; i < cbs.length; i++) { + state.pendingcb--; + cbs[i](err); + } + }); + + // Clear buffer + } else { + // Slow case, write chunks one-by-one + while (entry) { + var chunk = entry.chunk; + var encoding = entry.encoding; + var cb = entry.callback; + var len = state.objectMode ? 1 : chunk.length; + + doWrite(stream, state, false, len, chunk, encoding, cb); + entry = entry.next; + // if we didn't call the onwrite immediately, then + // it means that we need to wait until it does. + // also, that means that the chunk and cb are currently + // being processed, so move the buffer counter past them. + if (state.writing) { + break; + } + } + + if (entry === null) + state.lastBufferedRequest = null; + } + state.bufferedRequest = entry; + state.bufferProcessing = false; +} + +Writable.prototype._write = function(chunk, encoding, cb) { + cb(new Error('not implemented')); +}; + +Writable.prototype._writev = null; + +Writable.prototype.end = function(chunk, encoding, cb) { + var state = this._writableState; + + if (typeof chunk === 'function') { + cb = chunk; + chunk = null; + encoding = null; + } else if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (chunk !== null && chunk !== undefined) + this.write(chunk, encoding); + + // .end() fully uncorks + if (state.corked) { + state.corked = 1; + this.uncork(); + } + + // ignore unnecessary end() calls. + if (!state.ending && !state.finished) + endWritable(this, state, cb); +}; + + +function needFinish(state) { + return (state.ending && + state.length === 0 && + state.bufferedRequest === null && + !state.finished && + !state.writing); +} + +function prefinish(stream, state) { + if (!state.prefinished) { + state.prefinished = true; + stream.emit('prefinish'); + } +} + +function finishMaybe(stream, state) { + var need = needFinish(state); + if (need) { + if (state.pendingcb === 0) { + prefinish(stream, state); + state.finished = true; + stream.emit('finish'); + } else { + prefinish(stream, state); + } + } + return need; +} + +function endWritable(stream, state, cb) { + state.ending = true; + finishMaybe(stream, state); + if (cb) { + if (state.finished) + processNextTick(cb); + else + stream.once('finish', cb); + } + state.ended = true; +} + +},{"./_stream_duplex":28,"buffer":13,"core-util-is":33,"events":17,"inherits":19,"process-nextick-args":34,"util-deprecate":35}],33:[function(require,module,exports){ +(function (Buffer){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// NOTE: These type checking functions intentionally don't use `instanceof` +// because it is fragile and can be easily faked with `Object.create()`. +function isArray(ar) { + return Array.isArray(ar); +} +exports.isArray = isArray; + +function isBoolean(arg) { + return typeof arg === 'boolean'; +} +exports.isBoolean = isBoolean; + +function isNull(arg) { + return arg === null; +} +exports.isNull = isNull; + +function isNullOrUndefined(arg) { + return arg == null; +} +exports.isNullOrUndefined = isNullOrUndefined; + +function isNumber(arg) { + return typeof arg === 'number'; +} +exports.isNumber = isNumber; + +function isString(arg) { + return typeof arg === 'string'; +} +exports.isString = isString; + +function isSymbol(arg) { + return typeof arg === 'symbol'; +} +exports.isSymbol = isSymbol; + +function isUndefined(arg) { + return arg === void 0; +} +exports.isUndefined = isUndefined; + +function isRegExp(re) { + return isObject(re) && objectToString(re) === '[object RegExp]'; +} +exports.isRegExp = isRegExp; + +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} +exports.isObject = isObject; + +function isDate(d) { + return isObject(d) && objectToString(d) === '[object Date]'; +} +exports.isDate = isDate; + +function isError(e) { + return isObject(e) && + (objectToString(e) === '[object Error]' || e instanceof Error); +} +exports.isError = isError; + +function isFunction(arg) { + return typeof arg === 'function'; +} +exports.isFunction = isFunction; + +function isPrimitive(arg) { + return arg === null || + typeof arg === 'boolean' || + typeof arg === 'number' || + typeof arg === 'string' || + typeof arg === 'symbol' || // ES6 symbol + typeof arg === 'undefined'; +} +exports.isPrimitive = isPrimitive; + +function isBuffer(arg) { + return Buffer.isBuffer(arg); +} +exports.isBuffer = isBuffer; + +function objectToString(o) { + return Object.prototype.toString.call(o); +} +}).call(this,{"isBuffer":require("../../../../insert-module-globals/node_modules/is-buffer/index.js")}) +},{"../../../../insert-module-globals/node_modules/is-buffer/index.js":20}],34:[function(require,module,exports){ +(function (process){ +'use strict'; +module.exports = nextTick; + +function nextTick(fn) { + var args = new Array(arguments.length - 1); + var i = 0; + while (i < args.length) { + args[i++] = arguments[i]; + } + process.nextTick(function afterTick() { + fn.apply(null, args); + }); +} + +}).call(this,require('_process')) +},{"_process":22}],35:[function(require,module,exports){ +(function (global){ + +/** + * Module exports. + */ + +module.exports = deprecate; + +/** + * Mark that a method should not be used. + * Returns a modified function which warns once by default. + * + * If `localStorage.noDeprecation = true` is set, then it is a no-op. + * + * If `localStorage.throwDeprecation = true` is set, then deprecated functions + * will throw an Error when invoked. + * + * If `localStorage.traceDeprecation = true` is set, then deprecated functions + * will invoke `console.trace()` instead of `console.error()`. + * + * @param {Function} fn - the function to deprecate + * @param {String} msg - the string to print to the console when `fn` is invoked + * @returns {Function} a new "deprecated" version of `fn` + * @api public + */ + +function deprecate (fn, msg) { + if (config('noDeprecation')) { + return fn; + } + + var warned = false; + function deprecated() { + if (!warned) { + if (config('throwDeprecation')) { + throw new Error(msg); + } else if (config('traceDeprecation')) { + console.trace(msg); + } else { + console.warn(msg); + } + warned = true; + } + return fn.apply(this, arguments); + } + + return deprecated; +} + +/** + * Checks `localStorage` for boolean values for the given `name`. + * + * @param {String} name + * @returns {Boolean} + * @api private + */ + +function config (name) { + // accessing global.localStorage can trigger a DOMException in sandboxed iframes + try { + if (!global.localStorage) return false; + } catch (_) { + return false; + } + var val = global.localStorage[name]; + if (null == val) return false; + return String(val).toLowerCase() === 'true'; +} + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}],36:[function(require,module,exports){ +module.exports = require("./lib/_stream_passthrough.js") + +},{"./lib/_stream_passthrough.js":29}],37:[function(require,module,exports){ +var Stream = (function (){ + try { + return require('st' + 'ream'); // hack to fix a circular dependency issue when used with browserify + } catch(_){} +}()); +exports = module.exports = require('./lib/_stream_readable.js'); +exports.Stream = Stream || exports; +exports.Readable = exports; +exports.Writable = require('./lib/_stream_writable.js'); +exports.Duplex = require('./lib/_stream_duplex.js'); +exports.Transform = require('./lib/_stream_transform.js'); +exports.PassThrough = require('./lib/_stream_passthrough.js'); + +},{"./lib/_stream_duplex.js":28,"./lib/_stream_passthrough.js":29,"./lib/_stream_readable.js":30,"./lib/_stream_transform.js":31,"./lib/_stream_writable.js":32}],38:[function(require,module,exports){ +module.exports = require("./lib/_stream_transform.js") + +},{"./lib/_stream_transform.js":31}],39:[function(require,module,exports){ +module.exports = require("./lib/_stream_writable.js") + +},{"./lib/_stream_writable.js":32}],40:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +module.exports = Stream; + +var EE = require('events').EventEmitter; +var inherits = require('inherits'); + +inherits(Stream, EE); +Stream.Readable = require('readable-stream/readable.js'); +Stream.Writable = require('readable-stream/writable.js'); +Stream.Duplex = require('readable-stream/duplex.js'); +Stream.Transform = require('readable-stream/transform.js'); +Stream.PassThrough = require('readable-stream/passthrough.js'); + +// Backwards-compat with node 0.4.x +Stream.Stream = Stream; + + + +// old-style streams. Note that the pipe method (the only relevant +// part of this class) is overridden in the Readable class. + +function Stream() { + EE.call(this); +} + +Stream.prototype.pipe = function(dest, options) { + var source = this; + + function ondata(chunk) { + if (dest.writable) { + if (false === dest.write(chunk) && source.pause) { + source.pause(); + } + } + } + + source.on('data', ondata); + + function ondrain() { + if (source.readable && source.resume) { + source.resume(); + } + } + + dest.on('drain', ondrain); + + // If the 'end' option is not supplied, dest.end() will be called when + // source gets the 'end' or 'close' events. Only dest.end() once. + if (!dest._isStdio && (!options || options.end !== false)) { + source.on('end', onend); + source.on('close', onclose); + } + + var didOnEnd = false; + function onend() { + if (didOnEnd) return; + didOnEnd = true; + + dest.end(); + } + + + function onclose() { + if (didOnEnd) return; + didOnEnd = true; + + if (typeof dest.destroy === 'function') dest.destroy(); + } + + // don't leave dangling pipes when there are errors. + function onerror(er) { + cleanup(); + if (EE.listenerCount(this, 'error') === 0) { + throw er; // Unhandled stream error in pipe. + } + } + + source.on('error', onerror); + dest.on('error', onerror); + + // remove all the event listeners that were added. + function cleanup() { + source.removeListener('data', ondata); + dest.removeListener('drain', ondrain); + + source.removeListener('end', onend); + source.removeListener('close', onclose); + + source.removeListener('error', onerror); + dest.removeListener('error', onerror); + + source.removeListener('end', cleanup); + source.removeListener('close', cleanup); + + dest.removeListener('close', cleanup); + } + + source.on('end', cleanup); + source.on('close', cleanup); + + dest.on('close', cleanup); + + dest.emit('pipe', source); + + // Allow for unix-like usage: A.pipe(B).pipe(C) + return dest; +}; + +},{"events":17,"inherits":19,"readable-stream/duplex.js":27,"readable-stream/passthrough.js":36,"readable-stream/readable.js":37,"readable-stream/transform.js":38,"readable-stream/writable.js":39}],41:[function(require,module,exports){ +var ClientRequest = require('./lib/request') +var extend = require('xtend') +var statusCodes = require('builtin-status-codes') +var url = require('url') + +var http = exports + +http.request = function (opts, cb) { + if (typeof opts === 'string') + opts = url.parse(opts) + else + opts = extend(opts) + + var protocol = opts.protocol || '' + var host = opts.hostname || opts.host + var port = opts.port + var path = opts.path || '/' + + // Necessary for IPv6 addresses + if (host && host.indexOf(':') !== -1) + host = '[' + host + ']' + + // This may be a relative url. The browser should always be able to interpret it correctly. + opts.url = (host ? (protocol + '//' + host) : '') + (port ? ':' + port : '') + path + opts.method = (opts.method || 'GET').toUpperCase() + opts.headers = opts.headers || {} + + // Also valid opts.auth, opts.mode + + var req = new ClientRequest(opts) + if (cb) + req.on('response', cb) + return req +} + +http.get = function get (opts, cb) { + var req = http.request(opts, cb) + req.end() + return req +} + +http.Agent = function () {} +http.Agent.defaultMaxSockets = 4 + +http.STATUS_CODES = statusCodes + +http.METHODS = [ + 'CHECKOUT', + 'CONNECT', + 'COPY', + 'DELETE', + 'GET', + 'HEAD', + 'LOCK', + 'M-SEARCH', + 'MERGE', + 'MKACTIVITY', + 'MKCOL', + 'MOVE', + 'NOTIFY', + 'OPTIONS', + 'PATCH', + 'POST', + 'PROPFIND', + 'PROPPATCH', + 'PURGE', + 'PUT', + 'REPORT', + 'SEARCH', + 'SUBSCRIBE', + 'TRACE', + 'UNLOCK', + 'UNSUBSCRIBE' +] +},{"./lib/request":43,"builtin-status-codes":45,"url":52,"xtend":55}],42:[function(require,module,exports){ +(function (global){ +exports.fetch = isFunction(global.fetch) && isFunction(global.ReadableByteStream) + +exports.blobConstructor = false +try { + new Blob([new ArrayBuffer(1)]) + exports.blobConstructor = true +} catch (e) {} + +var xhr = new global.XMLHttpRequest() +// If location.host is empty, e.g. if this page/worker was loaded +// from a Blob, then use example.com to avoid an error +xhr.open('GET', global.location.host ? '/' : 'https://example.com') + +function checkTypeSupport (type) { + try { + xhr.responseType = type + return xhr.responseType === type + } catch (e) {} + return false +} + +// For some strange reason, Safari 7.0 reports typeof global.ArrayBuffer === 'object'. +// Safari 7.1 appears to have fixed this bug. +var haveArrayBuffer = typeof global.ArrayBuffer !== 'undefined' +var haveSlice = haveArrayBuffer && isFunction(global.ArrayBuffer.prototype.slice) + +exports.arraybuffer = haveArrayBuffer && checkTypeSupport('arraybuffer') +// These next two tests unavoidably show warnings in Chrome. Since fetch will always +// be used if it's available, just return false for these to avoid the warnings. +exports.msstream = !exports.fetch && haveSlice && checkTypeSupport('ms-stream') +exports.mozchunkedarraybuffer = !exports.fetch && haveArrayBuffer && + checkTypeSupport('moz-chunked-arraybuffer') +exports.overrideMimeType = isFunction(xhr.overrideMimeType) +exports.vbArray = isFunction(global.VBArray) + +function isFunction (value) { + return typeof value === 'function' +} + +xhr = null // Help gc + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}],43:[function(require,module,exports){ +(function (process,global,Buffer){ +// var Base64 = require('Base64') +var capability = require('./capability') +var foreach = require('foreach') +var indexOf = require('indexof') +var inherits = require('inherits') +var keys = require('object-keys') +var response = require('./response') +var stream = require('stream') + +var IncomingMessage = response.IncomingMessage +var rStates = response.readyStates + +function decideMode (preferBinary) { + if (capability.fetch) { + return 'fetch' + } else if (capability.mozchunkedarraybuffer) { + return 'moz-chunked-arraybuffer' + } else if (capability.msstream) { + return 'ms-stream' + } else if (capability.arraybuffer && preferBinary) { + return 'arraybuffer' + } else if (capability.vbArray && preferBinary) { + return 'text:vbarray' + } else { + return 'text' + } +} + +var ClientRequest = module.exports = function (opts) { + var self = this + stream.Writable.call(self) + + self._opts = opts + self._body = [] + self._headers = {} + if (opts.auth) + self.setHeader('Authorization', 'Basic ' + new Buffer(opts.auth).toString('base64')) + foreach(keys(opts.headers), function (name) { + self.setHeader(name, opts.headers[name]) + }) + + var preferBinary + if (opts.mode === 'prefer-streaming') { + // If streaming is a high priority but binary compatibility and + // the accuracy of the 'content-type' header aren't + preferBinary = false + } else if (opts.mode === 'allow-wrong-content-type') { + // If streaming is more important than preserving the 'content-type' header + preferBinary = !capability.overrideMimeType + } else if (!opts.mode || opts.mode === 'default' || opts.mode === 'prefer-fast') { + // Use binary if text streaming may corrupt data or the content-type header, or for speed + preferBinary = true + } else { + throw new Error('Invalid value for opts.mode') + } + self._mode = decideMode(preferBinary) + + self.on('finish', function () { + self._onFinish() + }) +} + +inherits(ClientRequest, stream.Writable) + +ClientRequest.prototype.setHeader = function (name, value) { + var self = this + var lowerName = name.toLowerCase() + // This check is not necessary, but it prevents warnings from browsers about setting unsafe + // headers. To be honest I'm not entirely sure hiding these warnings is a good thing, but + // http-browserify did it, so I will too. + if (indexOf(unsafeHeaders, lowerName) !== -1) + return + + self._headers[lowerName] = { + name: name, + value: value + } +} + +ClientRequest.prototype.getHeader = function (name) { + var self = this + return self._headers[name.toLowerCase()].value +} + +ClientRequest.prototype.removeHeader = function (name) { + var self = this + delete self._headers[name.toLowerCase()] +} + +ClientRequest.prototype._onFinish = function () { + var self = this + + if (self._destroyed) + return + var opts = self._opts + + var headersObj = self._headers + var body + if (opts.method === 'POST' || opts.method === 'PUT') { + if (capability.blobConstructor) { + body = new global.Blob(self._body.map(function (buffer) { + return buffer.toArrayBuffer() + }), { + type: (headersObj['content-type'] || {}).value || '' + }) + } else { + // get utf8 string + body = Buffer.concat(self._body).toString() + } + } + + if (self._mode === 'fetch') { + var headers = keys(headersObj).map(function (name) { + return [headersObj[name].name, headersObj[name].value] + }) + + global.fetch(self._opts.url, { + method: self._opts.method, + headers: headers, + body: body, + mode: 'cors', + credentials: opts.withCredentials ? 'include' : 'same-origin' + }).then(function (response) { + self._fetchResponse = response + self._connect() + }).then(undefined, function (reason) { + self.emit('error', reason) + }) + } else { + var xhr = self._xhr = new global.XMLHttpRequest() + try { + xhr.open(self._opts.method, self._opts.url, true) + } catch (err) { + process.nextTick(function () { + self.emit('error', err) + }) + return + } + + // Can't set responseType on really old browsers + if ('responseType' in xhr) + xhr.responseType = self._mode.split(':')[0] + + if ('withCredentials' in xhr) + xhr.withCredentials = !!opts.withCredentials + + if (self._mode === 'text' && 'overrideMimeType' in xhr) + xhr.overrideMimeType('text/plain; charset=x-user-defined') + + foreach(keys(headersObj), function (name) { + xhr.setRequestHeader(headersObj[name].name, headersObj[name].value) + }) + + self._response = null + xhr.onreadystatechange = function () { + switch (xhr.readyState) { + case rStates.LOADING: + case rStates.DONE: + self._onXHRProgress() + break + } + } + // Necessary for streaming in Firefox, since xhr.response is ONLY defined + // in onprogress, not in onreadystatechange with xhr.readyState = 3 + if (self._mode === 'moz-chunked-arraybuffer') { + xhr.onprogress = function () { + self._onXHRProgress() + } + } + + xhr.onerror = function () { + if (self._destroyed) + return + self.emit('error', new Error('XHR error')) + } + + try { + xhr.send(body) + } catch (err) { + process.nextTick(function () { + self.emit('error', err) + }) + return + } + } +} + +/** + * Checks if xhr.status is readable. Even though the spec says it should + * be available in readyState 3, accessing it throws an exception in IE8 + */ +function statusValid (xhr) { + try { + return (xhr.status !== null) + } catch (e) { + return false + } +} + +ClientRequest.prototype._onXHRProgress = function () { + var self = this + + if (!statusValid(self._xhr) || self._destroyed) + return + + if (!self._response) + self._connect() + + self._response._onXHRProgress() +} + +ClientRequest.prototype._connect = function () { + var self = this + + if (self._destroyed) + return + + self._response = new IncomingMessage(self._xhr, self._fetchResponse, self._mode) + self.emit('response', self._response) +} + +ClientRequest.prototype._write = function (chunk, encoding, cb) { + var self = this + + self._body.push(chunk) + cb() +} + +ClientRequest.prototype.abort = ClientRequest.prototype.destroy = function () { + var self = this + self._destroyed = true + if (self._response) + self._response._destroyed = true + if (self._xhr) + self._xhr.abort() + // Currently, there isn't a way to truly abort a fetch. + // If you like bikeshedding, see https://github.com/whatwg/fetch/issues/27 +} + +ClientRequest.prototype.end = function (data, encoding, cb) { + var self = this + if (typeof data === 'function') { + cb = data + data = undefined + } + + stream.Writable.prototype.end.call(self, data, encoding, cb) +} + +ClientRequest.prototype.flushHeaders = function () {} +ClientRequest.prototype.setTimeout = function () {} +ClientRequest.prototype.setNoDelay = function () {} +ClientRequest.prototype.setSocketKeepAlive = function () {} + +// Taken from http://www.w3.org/TR/XMLHttpRequest/#the-setrequestheader%28%29-method +var unsafeHeaders = [ + 'accept-charset', + 'accept-encoding', + 'access-control-request-headers', + 'access-control-request-method', + 'connection', + 'content-length', + 'cookie', + 'cookie2', + 'date', + 'dnt', + 'expect', + 'host', + 'keep-alive', + 'origin', + 'referer', + 'te', + 'trailer', + 'transfer-encoding', + 'upgrade', + 'user-agent', + 'via' +] + +}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},require("buffer").Buffer) +},{"./capability":42,"./response":44,"_process":22,"buffer":13,"foreach":46,"indexof":47,"inherits":19,"object-keys":48,"stream":40}],44:[function(require,module,exports){ +(function (process,global,Buffer){ +var capability = require('./capability') +var foreach = require('foreach') +var inherits = require('inherits') +var stream = require('stream') + +var rStates = exports.readyStates = { + UNSENT: 0, + OPENED: 1, + HEADERS_RECEIVED: 2, + LOADING: 3, + DONE: 4 +} + +var IncomingMessage = exports.IncomingMessage = function (xhr, response, mode) { + var self = this + stream.Readable.call(self) + + self._mode = mode + self.headers = {} + self.rawHeaders = [] + self.trailers = {} + self.rawTrailers = [] + + // Fake the 'close' event, but only once 'end' fires + self.on('end', function () { + // The nextTick is necessary to prevent the 'request' module from causing an infinite loop + process.nextTick(function () { + self.emit('close') + }) + }) + + if (mode === 'fetch') { + self._fetchResponse = response + + self.statusCode = response.status + self.statusMessage = response.statusText + // backwards compatible version of for ( of ): + // for (var ,_i,_it = [Symbol.iterator](); = (_i = _it.next()).value,!_i.done;) + for (var header, _i, _it = response.headers[Symbol.iterator](); header = (_i = _it.next()).value, !_i.done;) { + self.headers[header[0].toLowerCase()] = header[1] + self.rawHeaders.push(header[0], header[1]) + } + + // TODO: this doesn't respect backpressure. Once WritableStream is available, this can be fixed + var reader = response.body.getReader() + function read () { + reader.read().then(function (result) { + if (self._destroyed) + return + if (result.done) { + self.push(null) + return + } + self.push(new Buffer(result.value)) + read() + }) + } + read() + + } else { + self._xhr = xhr + self._pos = 0 + + self.statusCode = xhr.status + self.statusMessage = xhr.statusText + var headers = xhr.getAllResponseHeaders().split(/\r?\n/) + foreach(headers, function (header) { + var matches = header.match(/^([^:]+):\s*(.*)/) + if (matches) { + var key = matches[1].toLowerCase() + if (self.headers[key] !== undefined) + self.headers[key] += ', ' + matches[2] + else + self.headers[key] = matches[2] + self.rawHeaders.push(matches[1], matches[2]) + } + }) + + self._charset = 'x-user-defined' + if (!capability.overrideMimeType) { + var mimeType = self.rawHeaders['mime-type'] + if (mimeType) { + var charsetMatch = mimeType.match(/;\s*charset=([^;])(;|$)/) + if (charsetMatch) { + self._charset = charsetMatch[1].toLowerCase() + } + } + if (!self._charset) + self._charset = 'utf-8' // best guess + } + } +} + +inherits(IncomingMessage, stream.Readable) + +IncomingMessage.prototype._read = function () {} + +IncomingMessage.prototype._onXHRProgress = function () { + var self = this + + var xhr = self._xhr + + var response = null + switch (self._mode) { + case 'text:vbarray': // For IE9 + if (xhr.readyState !== rStates.DONE) + break + try { + // This fails in IE8 + response = new global.VBArray(xhr.responseBody).toArray() + } catch (e) {} + if (response !== null) { + self.push(new Buffer(response)) + break + } + // Falls through in IE8 + case 'text': + try { // This will fail when readyState = 3 in IE9. Switch mode and wait for readyState = 4 + response = xhr.responseText + } catch (e) { + self._mode = 'text:vbarray' + break + } + if (response.length > self._pos) { + var newData = response.substr(self._pos) + if (self._charset === 'x-user-defined') { + var buffer = new Buffer(newData.length) + for (var i = 0; i < newData.length; i++) + buffer[i] = newData.charCodeAt(i) & 0xff + + self.push(buffer) + } else { + self.push(newData, self._charset) + } + self._pos = response.length + } + break + case 'arraybuffer': + if (xhr.readyState !== rStates.DONE) + break + response = xhr.response + self.push(new Buffer(new Uint8Array(response))) + break + case 'moz-chunked-arraybuffer': // take whole + response = xhr.response + if (xhr.readyState !== rStates.LOADING || !response) + break + self.push(new Buffer(new Uint8Array(response))) + break + case 'ms-stream': + response = xhr.response + if (xhr.readyState !== rStates.LOADING) + break + var reader = new global.MSStreamReader() + reader.onprogress = function () { + if (reader.result.byteLength > self._pos) { + self.push(new Buffer(new Uint8Array(reader.result.slice(self._pos)))) + self._pos = reader.result.byteLength + } + } + reader.onload = function () { + self.push(null) + } + // reader.onerror = ??? // TODO: this + reader.readAsArrayBuffer(response) + break + } + + // The ms-stream case handles end separately in reader.onload() + if (self._xhr.readyState === rStates.DONE && self._mode !== 'ms-stream') { + self.push(null) + } +} + +}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},require("buffer").Buffer) +},{"./capability":42,"_process":22,"buffer":13,"foreach":46,"inherits":19,"stream":40}],45:[function(require,module,exports){ +module.exports = { + "100": "Continue", + "101": "Switching Protocols", + "102": "Processing", + "200": "OK", + "201": "Created", + "202": "Accepted", + "203": "Non-Authoritative Information", + "204": "No Content", + "205": "Reset Content", + "206": "Partial Content", + "207": "Multi-Status", + "300": "Multiple Choices", + "301": "Moved Permanently", + "302": "Moved Temporarily", + "303": "See Other", + "304": "Not Modified", + "305": "Use Proxy", + "307": "Temporary Redirect", + "308": "Permanent Redirect", + "400": "Bad Request", + "401": "Unauthorized", + "402": "Payment Required", + "403": "Forbidden", + "404": "Not Found", + "405": "Method Not Allowed", + "406": "Not Acceptable", + "407": "Proxy Authentication Required", + "408": "Request Time-out", + "409": "Conflict", + "410": "Gone", + "411": "Length Required", + "412": "Precondition Failed", + "413": "Request Entity Too Large", + "414": "Request-URI Too Large", + "415": "Unsupported Media Type", + "416": "Requested Range Not Satisfiable", + "417": "Expectation Failed", + "418": "I'm a teapot", + "422": "Unprocessable Entity", + "423": "Locked", + "424": "Failed Dependency", + "425": "Unordered Collection", + "426": "Upgrade Required", + "428": "Precondition Required", + "429": "Too Many Requests", + "431": "Request Header Fields Too Large", + "500": "Internal Server Error", + "501": "Not Implemented", + "502": "Bad Gateway", + "503": "Service Unavailable", + "504": "Gateway Time-out", + "505": "HTTP Version Not Supported", + "506": "Variant Also Negotiates", + "507": "Insufficient Storage", + "509": "Bandwidth Limit Exceeded", + "510": "Not Extended", + "511": "Network Authentication Required" +} + +},{}],46:[function(require,module,exports){ + +var hasOwn = Object.prototype.hasOwnProperty; +var toString = Object.prototype.toString; + +module.exports = function forEach (obj, fn, ctx) { + if (toString.call(fn) !== '[object Function]') { + throw new TypeError('iterator must be a function'); + } + var l = obj.length; + if (l === +l) { + for (var i = 0; i < l; i++) { + fn.call(ctx, obj[i], i, obj); + } + } else { + for (var k in obj) { + if (hasOwn.call(obj, k)) { + fn.call(ctx, obj[k], k, obj); + } + } + } +}; + + +},{}],47:[function(require,module,exports){ + +var indexOf = [].indexOf; + +module.exports = function(arr, obj){ + if (indexOf) return arr.indexOf(obj); + for (var i = 0; i < arr.length; ++i) { + if (arr[i] === obj) return i; + } + return -1; +}; +},{}],48:[function(require,module,exports){ +'use strict'; + +// modified from https://github.com/es-shims/es5-shim +var has = Object.prototype.hasOwnProperty; +var toStr = Object.prototype.toString; +var slice = Array.prototype.slice; +var isArgs = require('./isArguments'); +var hasDontEnumBug = !({ toString: null }).propertyIsEnumerable('toString'); +var hasProtoEnumBug = function () {}.propertyIsEnumerable('prototype'); +var dontEnums = [ + 'toString', + 'toLocaleString', + 'valueOf', + 'hasOwnProperty', + 'isPrototypeOf', + 'propertyIsEnumerable', + 'constructor' +]; +var equalsConstructorPrototype = function (o) { + var ctor = o.constructor; + return ctor && ctor.prototype === o; +}; +var blacklistedKeys = { + $console: true, + $frame: true, + $frameElement: true, + $frames: true, + $parent: true, + $self: true, + $webkitIndexedDB: true, + $webkitStorageInfo: true, + $window: true +}; +var hasAutomationEqualityBug = (function () { + /* global window */ + if (typeof window === 'undefined') { return false; } + for (var k in window) { + try { + if (!blacklistedKeys['$' + k] && has.call(window, k) && window[k] !== null && typeof window[k] === 'object') { + try { + equalsConstructorPrototype(window[k]); + } catch (e) { + return true; + } + } + } catch (e) { + return true; + } + } + return false; +}()); +var equalsConstructorPrototypeIfNotBuggy = function (o) { + /* global window */ + if (typeof window === 'undefined' || !hasAutomationEqualityBug) { + return equalsConstructorPrototype(o); + } + try { + return equalsConstructorPrototype(o); + } catch (e) { + return false; + } +}; + +var keysShim = function keys(object) { + var isObject = object !== null && typeof object === 'object'; + var isFunction = toStr.call(object) === '[object Function]'; + var isArguments = isArgs(object); + var isString = isObject && toStr.call(object) === '[object String]'; + var theKeys = []; + + if (!isObject && !isFunction && !isArguments) { + throw new TypeError('Object.keys called on a non-object'); + } + + var skipProto = hasProtoEnumBug && isFunction; + if (isString && object.length > 0 && !has.call(object, 0)) { + for (var i = 0; i < object.length; ++i) { + theKeys.push(String(i)); + } + } + + if (isArguments && object.length > 0) { + for (var j = 0; j < object.length; ++j) { + theKeys.push(String(j)); + } + } else { + for (var name in object) { + if (!(skipProto && name === 'prototype') && has.call(object, name)) { + theKeys.push(String(name)); + } + } + } + + if (hasDontEnumBug) { + var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object); + + for (var k = 0; k < dontEnums.length; ++k) { + if (!(skipConstructor && dontEnums[k] === 'constructor') && has.call(object, dontEnums[k])) { + theKeys.push(dontEnums[k]); + } + } + } + return theKeys; +}; + +keysShim.shim = function shimObjectKeys() { + if (Object.keys) { + var keysWorksWithArguments = (function () { + // Safari 5.0 bug + return (Object.keys(arguments) || '').length === 2; + }(1, 2)); + if (!keysWorksWithArguments) { + var originalKeys = Object.keys; + Object.keys = function keys(object) { + if (isArgs(object)) { + return originalKeys(slice.call(object)); + } else { + return originalKeys(object); + } + }; + } + } else { + Object.keys = keysShim; + } + return Object.keys || keysShim; +}; + +module.exports = keysShim; + +},{"./isArguments":49}],49:[function(require,module,exports){ +'use strict'; + +var toStr = Object.prototype.toString; + +module.exports = function isArguments(value) { + var str = toStr.call(value); + var isArgs = str === '[object Arguments]'; + if (!isArgs) { + isArgs = str !== '[object Array]' && + value !== null && + typeof value === 'object' && + typeof value.length === 'number' && + value.length >= 0 && + toStr.call(value.callee) === '[object Function]'; + } + return isArgs; +}; + +},{}],50:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +var Buffer = require('buffer').Buffer; + +var isBufferEncoding = Buffer.isEncoding + || function(encoding) { + switch (encoding && encoding.toLowerCase()) { + case 'hex': case 'utf8': case 'utf-8': case 'ascii': case 'binary': case 'base64': case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': case 'raw': return true; + default: return false; + } + } + + +function assertEncoding(encoding) { + if (encoding && !isBufferEncoding(encoding)) { + throw new Error('Unknown encoding: ' + encoding); + } +} + +// StringDecoder provides an interface for efficiently splitting a series of +// buffers into a series of JS strings without breaking apart multi-byte +// characters. CESU-8 is handled as part of the UTF-8 encoding. +// +// @TODO Handling all encodings inside a single object makes it very difficult +// to reason about this code, so it should be split up in the future. +// @TODO There should be a utf8-strict encoding that rejects invalid UTF-8 code +// points as used by CESU-8. +var StringDecoder = exports.StringDecoder = function(encoding) { + this.encoding = (encoding || 'utf8').toLowerCase().replace(/[-_]/, ''); + assertEncoding(encoding); + switch (this.encoding) { + case 'utf8': + // CESU-8 represents each of Surrogate Pair by 3-bytes + this.surrogateSize = 3; + break; + case 'ucs2': + case 'utf16le': + // UTF-16 represents each of Surrogate Pair by 2-bytes + this.surrogateSize = 2; + this.detectIncompleteChar = utf16DetectIncompleteChar; + break; + case 'base64': + // Base-64 stores 3 bytes in 4 chars, and pads the remainder. + this.surrogateSize = 3; + this.detectIncompleteChar = base64DetectIncompleteChar; + break; + default: + this.write = passThroughWrite; + return; + } + + // Enough space to store all bytes of a single character. UTF-8 needs 4 + // bytes, but CESU-8 may require up to 6 (3 bytes per surrogate). + this.charBuffer = new Buffer(6); + // Number of bytes received for the current incomplete multi-byte character. + this.charReceived = 0; + // Number of bytes expected for the current incomplete multi-byte character. + this.charLength = 0; +}; + + +// write decodes the given buffer and returns it as JS string that is +// guaranteed to not contain any partial multi-byte characters. Any partial +// character found at the end of the buffer is buffered up, and will be +// returned when calling write again with the remaining bytes. +// +// Note: Converting a Buffer containing an orphan surrogate to a String +// currently works, but converting a String to a Buffer (via `new Buffer`, or +// Buffer#write) will replace incomplete surrogates with the unicode +// replacement character. See https://codereview.chromium.org/121173009/ . +StringDecoder.prototype.write = function(buffer) { + var charStr = ''; + // if our last write ended with an incomplete multibyte character + while (this.charLength) { + // determine how many remaining bytes this buffer has to offer for this char + var available = (buffer.length >= this.charLength - this.charReceived) ? + this.charLength - this.charReceived : + buffer.length; + + // add the new bytes to the char buffer + buffer.copy(this.charBuffer, this.charReceived, 0, available); + this.charReceived += available; + + if (this.charReceived < this.charLength) { + // still not enough chars in this buffer? wait for more ... + return ''; + } + + // remove bytes belonging to the current character from the buffer + buffer = buffer.slice(available, buffer.length); + + // get the character that was split + charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding); + + // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character + var charCode = charStr.charCodeAt(charStr.length - 1); + if (charCode >= 0xD800 && charCode <= 0xDBFF) { + this.charLength += this.surrogateSize; + charStr = ''; + continue; + } + this.charReceived = this.charLength = 0; + + // if there are no more bytes in this buffer, just emit our char + if (buffer.length === 0) { + return charStr; + } + break; + } + + // determine and set charLength / charReceived + this.detectIncompleteChar(buffer); + + var end = buffer.length; + if (this.charLength) { + // buffer the incomplete character bytes we got + buffer.copy(this.charBuffer, 0, buffer.length - this.charReceived, end); + end -= this.charReceived; + } + + charStr += buffer.toString(this.encoding, 0, end); + + var end = charStr.length - 1; + var charCode = charStr.charCodeAt(end); + // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character + if (charCode >= 0xD800 && charCode <= 0xDBFF) { + var size = this.surrogateSize; + this.charLength += size; + this.charReceived += size; + this.charBuffer.copy(this.charBuffer, size, 0, size); + buffer.copy(this.charBuffer, 0, 0, size); + return charStr.substring(0, end); + } + + // or just emit the charStr + return charStr; +}; + +// detectIncompleteChar determines if there is an incomplete UTF-8 character at +// the end of the given buffer. If so, it sets this.charLength to the byte +// length that character, and sets this.charReceived to the number of bytes +// that are available for this character. +StringDecoder.prototype.detectIncompleteChar = function(buffer) { + // determine how many bytes we have to check at the end of this buffer + var i = (buffer.length >= 3) ? 3 : buffer.length; + + // Figure out if one of the last i bytes of our buffer announces an + // incomplete char. + for (; i > 0; i--) { + var c = buffer[buffer.length - i]; + + // See http://en.wikipedia.org/wiki/UTF-8#Description + + // 110XXXXX + if (i == 1 && c >> 5 == 0x06) { + this.charLength = 2; + break; + } + + // 1110XXXX + if (i <= 2 && c >> 4 == 0x0E) { + this.charLength = 3; + break; + } + + // 11110XXX + if (i <= 3 && c >> 3 == 0x1E) { + this.charLength = 4; + break; + } + } + this.charReceived = i; +}; + +StringDecoder.prototype.end = function(buffer) { + var res = ''; + if (buffer && buffer.length) + res = this.write(buffer); + + if (this.charReceived) { + var cr = this.charReceived; + var buf = this.charBuffer; + var enc = this.encoding; + res += buf.slice(0, cr).toString(enc); + } + + return res; +}; + +function passThroughWrite(buffer) { + return buffer.toString(this.encoding); +} + +function utf16DetectIncompleteChar(buffer) { + this.charReceived = buffer.length % 2; + this.charLength = this.charReceived ? 2 : 0; +} + +function base64DetectIncompleteChar(buffer) { + this.charReceived = buffer.length % 3; + this.charLength = this.charReceived ? 3 : 0; +} + +},{"buffer":13}],51:[function(require,module,exports){ +var nextTick = require('process/browser.js').nextTick; +var apply = Function.prototype.apply; +var slice = Array.prototype.slice; +var immediateIds = {}; +var nextImmediateId = 0; + +// DOM APIs, for completeness + +exports.setTimeout = function() { + return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout); +}; +exports.setInterval = function() { + return new Timeout(apply.call(setInterval, window, arguments), clearInterval); +}; +exports.clearTimeout = +exports.clearInterval = function(timeout) { timeout.close(); }; + +function Timeout(id, clearFn) { + this._id = id; + this._clearFn = clearFn; +} +Timeout.prototype.unref = Timeout.prototype.ref = function() {}; +Timeout.prototype.close = function() { + this._clearFn.call(window, this._id); +}; + +// Does not start the time, just sets up the members needed. +exports.enroll = function(item, msecs) { + clearTimeout(item._idleTimeoutId); + item._idleTimeout = msecs; +}; + +exports.unenroll = function(item) { + clearTimeout(item._idleTimeoutId); + item._idleTimeout = -1; +}; + +exports._unrefActive = exports.active = function(item) { + clearTimeout(item._idleTimeoutId); + + var msecs = item._idleTimeout; + if (msecs >= 0) { + item._idleTimeoutId = setTimeout(function onTimeout() { + if (item._onTimeout) + item._onTimeout(); + }, msecs); + } +}; + +// That's not how node.js implements it but the exposed api is the same. +exports.setImmediate = typeof setImmediate === "function" ? setImmediate : function(fn) { + var id = nextImmediateId++; + var args = arguments.length < 2 ? false : slice.call(arguments, 1); + + immediateIds[id] = true; + + nextTick(function onNextTick() { + if (immediateIds[id]) { + // fn.call() is faster so we optimize for the common use-case + // @see http://jsperf.com/call-apply-segu + if (args) { + fn.apply(null, args); + } else { + fn.call(null); + } + // Prevent ids from leaking + exports.clearImmediate(id); + } + }); + + return id; +}; + +exports.clearImmediate = typeof clearImmediate === "function" ? clearImmediate : function(id) { + delete immediateIds[id]; +}; +},{"process/browser.js":22}],52:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +var punycode = require('punycode'); + +exports.parse = urlParse; +exports.resolve = urlResolve; +exports.resolveObject = urlResolveObject; +exports.format = urlFormat; + +exports.Url = Url; + +function Url() { + this.protocol = null; + this.slashes = null; + this.auth = null; + this.host = null; + this.port = null; + this.hostname = null; + this.hash = null; + this.search = null; + this.query = null; + this.pathname = null; + this.path = null; + this.href = null; +} + +// Reference: RFC 3986, RFC 1808, RFC 2396 + +// define these here so at least they only have to be +// compiled once on the first module load. +var protocolPattern = /^([a-z0-9.+-]+:)/i, + portPattern = /:[0-9]*$/, + + // RFC 2396: characters reserved for delimiting URLs. + // We actually just auto-escape these. + delims = ['<', '>', '"', '`', ' ', '\r', '\n', '\t'], + + // RFC 2396: characters not allowed for various reasons. + unwise = ['{', '}', '|', '\\', '^', '`'].concat(delims), + + // Allowed by RFCs, but cause of XSS attacks. Always escape these. + autoEscape = ['\''].concat(unwise), + // Characters that are never ever allowed in a hostname. + // Note that any invalid chars are also handled, but these + // are the ones that are *expected* to be seen, so we fast-path + // them. + nonHostChars = ['%', '/', '?', ';', '#'].concat(autoEscape), + hostEndingChars = ['/', '?', '#'], + hostnameMaxLen = 255, + hostnamePartPattern = /^[a-z0-9A-Z_-]{0,63}$/, + hostnamePartStart = /^([a-z0-9A-Z_-]{0,63})(.*)$/, + // protocols that can allow "unsafe" and "unwise" chars. + unsafeProtocol = { + 'javascript': true, + 'javascript:': true + }, + // protocols that never have a hostname. + hostlessProtocol = { + 'javascript': true, + 'javascript:': true + }, + // protocols that always contain a // bit. + slashedProtocol = { + 'http': true, + 'https': true, + 'ftp': true, + 'gopher': true, + 'file': true, + 'http:': true, + 'https:': true, + 'ftp:': true, + 'gopher:': true, + 'file:': true + }, + querystring = require('querystring'); + +function urlParse(url, parseQueryString, slashesDenoteHost) { + if (url && isObject(url) && url instanceof Url) return url; + + var u = new Url; + u.parse(url, parseQueryString, slashesDenoteHost); + return u; +} + +Url.prototype.parse = function(url, parseQueryString, slashesDenoteHost) { + if (!isString(url)) { + throw new TypeError("Parameter 'url' must be a string, not " + typeof url); + } + + var rest = url; + + // trim before proceeding. + // This is to support parse stuff like " http://foo.com \n" + rest = rest.trim(); + + var proto = protocolPattern.exec(rest); + if (proto) { + proto = proto[0]; + var lowerProto = proto.toLowerCase(); + this.protocol = lowerProto; + rest = rest.substr(proto.length); + } + + // figure out if it's got a host + // user@server is *always* interpreted as a hostname, and url + // resolution will treat //foo/bar as host=foo,path=bar because that's + // how the browser resolves relative URLs. + if (slashesDenoteHost || proto || rest.match(/^\/\/[^@\/]+@[^@\/]+/)) { + var slashes = rest.substr(0, 2) === '//'; + if (slashes && !(proto && hostlessProtocol[proto])) { + rest = rest.substr(2); + this.slashes = true; + } + } + + if (!hostlessProtocol[proto] && + (slashes || (proto && !slashedProtocol[proto]))) { + + // there's a hostname. + // the first instance of /, ?, ;, or # ends the host. + // + // If there is an @ in the hostname, then non-host chars *are* allowed + // to the left of the last @ sign, unless some host-ending character + // comes *before* the @-sign. + // URLs are obnoxious. + // + // ex: + // http://a@b@c/ => user:a@b host:c + // http://a@b?@c => user:a host:c path:/?@c + + // v0.12 TODO(isaacs): This is not quite how Chrome does things. + // Review our test case against browsers more comprehensively. + + // find the first instance of any hostEndingChars + var hostEnd = -1; + for (var i = 0; i < hostEndingChars.length; i++) { + var hec = rest.indexOf(hostEndingChars[i]); + if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) + hostEnd = hec; + } + + // at this point, either we have an explicit point where the + // auth portion cannot go past, or the last @ char is the decider. + var auth, atSign; + if (hostEnd === -1) { + // atSign can be anywhere. + atSign = rest.lastIndexOf('@'); + } else { + // atSign must be in auth portion. + // http://a@b/c@d => host:b auth:a path:/c@d + atSign = rest.lastIndexOf('@', hostEnd); + } + + // Now we have a portion which is definitely the auth. + // Pull that off. + if (atSign !== -1) { + auth = rest.slice(0, atSign); + rest = rest.slice(atSign + 1); + this.auth = decodeURIComponent(auth); + } + + // the host is the remaining to the left of the first non-host char + hostEnd = -1; + for (var i = 0; i < nonHostChars.length; i++) { + var hec = rest.indexOf(nonHostChars[i]); + if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) + hostEnd = hec; + } + // if we still have not hit it, then the entire thing is a host. + if (hostEnd === -1) + hostEnd = rest.length; + + this.host = rest.slice(0, hostEnd); + rest = rest.slice(hostEnd); + + // pull out port. + this.parseHost(); + + // we've indicated that there is a hostname, + // so even if it's empty, it has to be present. + this.hostname = this.hostname || ''; + + // if hostname begins with [ and ends with ] + // assume that it's an IPv6 address. + var ipv6Hostname = this.hostname[0] === '[' && + this.hostname[this.hostname.length - 1] === ']'; + + // validate a little. + if (!ipv6Hostname) { + var hostparts = this.hostname.split(/\./); + for (var i = 0, l = hostparts.length; i < l; i++) { + var part = hostparts[i]; + if (!part) continue; + if (!part.match(hostnamePartPattern)) { + var newpart = ''; + for (var j = 0, k = part.length; j < k; j++) { + if (part.charCodeAt(j) > 127) { + // we replace non-ASCII char with a temporary placeholder + // we need this to make sure size of hostname is not + // broken by replacing non-ASCII by nothing + newpart += 'x'; + } else { + newpart += part[j]; + } + } + // we test again with ASCII char only + if (!newpart.match(hostnamePartPattern)) { + var validParts = hostparts.slice(0, i); + var notHost = hostparts.slice(i + 1); + var bit = part.match(hostnamePartStart); + if (bit) { + validParts.push(bit[1]); + notHost.unshift(bit[2]); + } + if (notHost.length) { + rest = '/' + notHost.join('.') + rest; + } + this.hostname = validParts.join('.'); + break; + } + } + } + } + + if (this.hostname.length > hostnameMaxLen) { + this.hostname = ''; + } else { + // hostnames are always lower case. + this.hostname = this.hostname.toLowerCase(); + } + + if (!ipv6Hostname) { + // IDNA Support: Returns a puny coded representation of "domain". + // It only converts the part of the domain name that + // has non ASCII characters. I.e. it dosent matter if + // you call it with a domain that already is in ASCII. + var domainArray = this.hostname.split('.'); + var newOut = []; + for (var i = 0; i < domainArray.length; ++i) { + var s = domainArray[i]; + newOut.push(s.match(/[^A-Za-z0-9_-]/) ? + 'xn--' + punycode.encode(s) : s); + } + this.hostname = newOut.join('.'); + } + + var p = this.port ? ':' + this.port : ''; + var h = this.hostname || ''; + this.host = h + p; + this.href += this.host; + + // strip [ and ] from the hostname + // the host field still retains them, though + if (ipv6Hostname) { + this.hostname = this.hostname.substr(1, this.hostname.length - 2); + if (rest[0] !== '/') { + rest = '/' + rest; + } + } + } + + // now rest is set to the post-host stuff. + // chop off any delim chars. + if (!unsafeProtocol[lowerProto]) { + + // First, make 100% sure that any "autoEscape" chars get + // escaped, even if encodeURIComponent doesn't think they + // need to be. + for (var i = 0, l = autoEscape.length; i < l; i++) { + var ae = autoEscape[i]; + var esc = encodeURIComponent(ae); + if (esc === ae) { + esc = escape(ae); + } + rest = rest.split(ae).join(esc); + } + } + + + // chop off from the tail first. + var hash = rest.indexOf('#'); + if (hash !== -1) { + // got a fragment string. + this.hash = rest.substr(hash); + rest = rest.slice(0, hash); + } + var qm = rest.indexOf('?'); + if (qm !== -1) { + this.search = rest.substr(qm); + this.query = rest.substr(qm + 1); + if (parseQueryString) { + this.query = querystring.parse(this.query); + } + rest = rest.slice(0, qm); + } else if (parseQueryString) { + // no query string, but parseQueryString still requested + this.search = ''; + this.query = {}; + } + if (rest) this.pathname = rest; + if (slashedProtocol[lowerProto] && + this.hostname && !this.pathname) { + this.pathname = '/'; + } + + //to support http.request + if (this.pathname || this.search) { + var p = this.pathname || ''; + var s = this.search || ''; + this.path = p + s; + } + + // finally, reconstruct the href based on what has been validated. + this.href = this.format(); + return this; +}; + +// format a parsed object into a url string +function urlFormat(obj) { + // ensure it's an object, and not a string url. + // If it's an obj, this is a no-op. + // this way, you can call url_format() on strings + // to clean up potentially wonky urls. + if (isString(obj)) obj = urlParse(obj); + if (!(obj instanceof Url)) return Url.prototype.format.call(obj); + return obj.format(); +} + +Url.prototype.format = function() { + var auth = this.auth || ''; + if (auth) { + auth = encodeURIComponent(auth); + auth = auth.replace(/%3A/i, ':'); + auth += '@'; + } + + var protocol = this.protocol || '', + pathname = this.pathname || '', + hash = this.hash || '', + host = false, + query = ''; + + if (this.host) { + host = auth + this.host; + } else if (this.hostname) { + host = auth + (this.hostname.indexOf(':') === -1 ? + this.hostname : + '[' + this.hostname + ']'); + if (this.port) { + host += ':' + this.port; + } + } + + if (this.query && + isObject(this.query) && + Object.keys(this.query).length) { + query = querystring.stringify(this.query); + } + + var search = this.search || (query && ('?' + query)) || ''; + + if (protocol && protocol.substr(-1) !== ':') protocol += ':'; + + // only the slashedProtocols get the //. Not mailto:, xmpp:, etc. + // unless they had them to begin with. + if (this.slashes || + (!protocol || slashedProtocol[protocol]) && host !== false) { + host = '//' + (host || ''); + if (pathname && pathname.charAt(0) !== '/') pathname = '/' + pathname; + } else if (!host) { + host = ''; + } + + if (hash && hash.charAt(0) !== '#') hash = '#' + hash; + if (search && search.charAt(0) !== '?') search = '?' + search; + + pathname = pathname.replace(/[?#]/g, function(match) { + return encodeURIComponent(match); + }); + search = search.replace('#', '%23'); + + return protocol + host + pathname + search + hash; +}; + +function urlResolve(source, relative) { + return urlParse(source, false, true).resolve(relative); +} + +Url.prototype.resolve = function(relative) { + return this.resolveObject(urlParse(relative, false, true)).format(); +}; + +function urlResolveObject(source, relative) { + if (!source) return relative; + return urlParse(source, false, true).resolveObject(relative); +} + +Url.prototype.resolveObject = function(relative) { + if (isString(relative)) { + var rel = new Url(); + rel.parse(relative, false, true); + relative = rel; + } + + var result = new Url(); + Object.keys(this).forEach(function(k) { + result[k] = this[k]; + }, this); + + // hash is always overridden, no matter what. + // even href="" will remove it. + result.hash = relative.hash; + + // if the relative url is empty, then there's nothing left to do here. + if (relative.href === '') { + result.href = result.format(); + return result; + } + + // hrefs like //foo/bar always cut to the protocol. + if (relative.slashes && !relative.protocol) { + // take everything except the protocol from relative + Object.keys(relative).forEach(function(k) { + if (k !== 'protocol') + result[k] = relative[k]; + }); + + //urlParse appends trailing / to urls like http://www.example.com + if (slashedProtocol[result.protocol] && + result.hostname && !result.pathname) { + result.path = result.pathname = '/'; + } + + result.href = result.format(); + return result; + } + + if (relative.protocol && relative.protocol !== result.protocol) { + // if it's a known url protocol, then changing + // the protocol does weird things + // first, if it's not file:, then we MUST have a host, + // and if there was a path + // to begin with, then we MUST have a path. + // if it is file:, then the host is dropped, + // because that's known to be hostless. + // anything else is assumed to be absolute. + if (!slashedProtocol[relative.protocol]) { + Object.keys(relative).forEach(function(k) { + result[k] = relative[k]; + }); + result.href = result.format(); + return result; + } + + result.protocol = relative.protocol; + if (!relative.host && !hostlessProtocol[relative.protocol]) { + var relPath = (relative.pathname || '').split('/'); + while (relPath.length && !(relative.host = relPath.shift())); + if (!relative.host) relative.host = ''; + if (!relative.hostname) relative.hostname = ''; + if (relPath[0] !== '') relPath.unshift(''); + if (relPath.length < 2) relPath.unshift(''); + result.pathname = relPath.join('/'); + } else { + result.pathname = relative.pathname; + } + result.search = relative.search; + result.query = relative.query; + result.host = relative.host || ''; + result.auth = relative.auth; + result.hostname = relative.hostname || relative.host; + result.port = relative.port; + // to support http.request + if (result.pathname || result.search) { + var p = result.pathname || ''; + var s = result.search || ''; + result.path = p + s; + } + result.slashes = result.slashes || relative.slashes; + result.href = result.format(); + return result; + } + + var isSourceAbs = (result.pathname && result.pathname.charAt(0) === '/'), + isRelAbs = ( + relative.host || + relative.pathname && relative.pathname.charAt(0) === '/' + ), + mustEndAbs = (isRelAbs || isSourceAbs || + (result.host && relative.pathname)), + removeAllDots = mustEndAbs, + srcPath = result.pathname && result.pathname.split('/') || [], + relPath = relative.pathname && relative.pathname.split('/') || [], + psychotic = result.protocol && !slashedProtocol[result.protocol]; + + // if the url is a non-slashed url, then relative + // links like ../.. should be able + // to crawl up to the hostname, as well. This is strange. + // result.protocol has already been set by now. + // Later on, put the first path part into the host field. + if (psychotic) { + result.hostname = ''; + result.port = null; + if (result.host) { + if (srcPath[0] === '') srcPath[0] = result.host; + else srcPath.unshift(result.host); + } + result.host = ''; + if (relative.protocol) { + relative.hostname = null; + relative.port = null; + if (relative.host) { + if (relPath[0] === '') relPath[0] = relative.host; + else relPath.unshift(relative.host); + } + relative.host = null; + } + mustEndAbs = mustEndAbs && (relPath[0] === '' || srcPath[0] === ''); + } + + if (isRelAbs) { + // it's absolute. + result.host = (relative.host || relative.host === '') ? + relative.host : result.host; + result.hostname = (relative.hostname || relative.hostname === '') ? + relative.hostname : result.hostname; + result.search = relative.search; + result.query = relative.query; + srcPath = relPath; + // fall through to the dot-handling below. + } else if (relPath.length) { + // it's relative + // throw away the existing file, and take the new path instead. + if (!srcPath) srcPath = []; + srcPath.pop(); + srcPath = srcPath.concat(relPath); + result.search = relative.search; + result.query = relative.query; + } else if (!isNullOrUndefined(relative.search)) { + // just pull out the search. + // like href='?foo'. + // Put this after the other two cases because it simplifies the booleans + if (psychotic) { + result.hostname = result.host = srcPath.shift(); + //occationaly the auth can get stuck only in host + //this especialy happens in cases like + //url.resolveObject('mailto:local1@domain1', 'local2@domain2') + var authInHost = result.host && result.host.indexOf('@') > 0 ? + result.host.split('@') : false; + if (authInHost) { + result.auth = authInHost.shift(); + result.host = result.hostname = authInHost.shift(); + } + } + result.search = relative.search; + result.query = relative.query; + //to support http.request + if (!isNull(result.pathname) || !isNull(result.search)) { + result.path = (result.pathname ? result.pathname : '') + + (result.search ? result.search : ''); + } + result.href = result.format(); + return result; + } + + if (!srcPath.length) { + // no path at all. easy. + // we've already handled the other stuff above. + result.pathname = null; + //to support http.request + if (result.search) { + result.path = '/' + result.search; + } else { + result.path = null; + } + result.href = result.format(); + return result; + } + + // if a url ENDs in . or .., then it must get a trailing slash. + // however, if it ends in anything else non-slashy, + // then it must NOT get a trailing slash. + var last = srcPath.slice(-1)[0]; + var hasTrailingSlash = ( + (result.host || relative.host) && (last === '.' || last === '..') || + last === ''); + + // strip single dots, resolve double dots to parent dir + // if the path tries to go above the root, `up` ends up > 0 + var up = 0; + for (var i = srcPath.length; i >= 0; i--) { + last = srcPath[i]; + if (last == '.') { + srcPath.splice(i, 1); + } else if (last === '..') { + srcPath.splice(i, 1); + up++; + } else if (up) { + srcPath.splice(i, 1); + up--; + } + } + + // if the path is allowed to go above the root, restore leading ..s + if (!mustEndAbs && !removeAllDots) { + for (; up--; up) { + srcPath.unshift('..'); + } + } + + if (mustEndAbs && srcPath[0] !== '' && + (!srcPath[0] || srcPath[0].charAt(0) !== '/')) { + srcPath.unshift(''); + } + + if (hasTrailingSlash && (srcPath.join('/').substr(-1) !== '/')) { + srcPath.push(''); + } + + var isAbsolute = srcPath[0] === '' || + (srcPath[0] && srcPath[0].charAt(0) === '/'); + + // put the host back + if (psychotic) { + result.hostname = result.host = isAbsolute ? '' : + srcPath.length ? srcPath.shift() : ''; + //occationaly the auth can get stuck only in host + //this especialy happens in cases like + //url.resolveObject('mailto:local1@domain1', 'local2@domain2') + var authInHost = result.host && result.host.indexOf('@') > 0 ? + result.host.split('@') : false; + if (authInHost) { + result.auth = authInHost.shift(); + result.host = result.hostname = authInHost.shift(); + } + } + + mustEndAbs = mustEndAbs || (result.host && srcPath.length); + + if (mustEndAbs && !isAbsolute) { + srcPath.unshift(''); + } + + if (!srcPath.length) { + result.pathname = null; + result.path = null; + } else { + result.pathname = srcPath.join('/'); + } + + //to support request.http + if (!isNull(result.pathname) || !isNull(result.search)) { + result.path = (result.pathname ? result.pathname : '') + + (result.search ? result.search : ''); + } + result.auth = relative.auth || result.auth; + result.slashes = result.slashes || relative.slashes; + result.href = result.format(); + return result; +}; + +Url.prototype.parseHost = function() { + var host = this.host; + var port = portPattern.exec(host); + if (port) { + port = port[0]; + if (port !== ':') { + this.port = port.substr(1); + } + host = host.substr(0, host.length - port.length); + } + if (host) this.hostname = host; +}; + +function isString(arg) { + return typeof arg === "string"; +} + +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} + +function isNull(arg) { + return arg === null; +} +function isNullOrUndefined(arg) { + return arg == null; +} + +},{"punycode":23,"querystring":26}],53:[function(require,module,exports){ +module.exports = function isBuffer(arg) { + return arg && typeof arg === 'object' + && typeof arg.copy === 'function' + && typeof arg.fill === 'function' + && typeof arg.readUInt8 === 'function'; +} +},{}],54:[function(require,module,exports){ +(function (process,global){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +var formatRegExp = /%[sdj%]/g; +exports.format = function(f) { + if (!isString(f)) { + var objects = []; + for (var i = 0; i < arguments.length; i++) { + objects.push(inspect(arguments[i])); + } + return objects.join(' '); + } + + var i = 1; + var args = arguments; + var len = args.length; + var str = String(f).replace(formatRegExp, function(x) { + if (x === '%%') return '%'; + if (i >= len) return x; + switch (x) { + case '%s': return String(args[i++]); + case '%d': return Number(args[i++]); + case '%j': + try { + return JSON.stringify(args[i++]); + } catch (_) { + return '[Circular]'; + } + default: + return x; + } + }); + for (var x = args[i]; i < len; x = args[++i]) { + if (isNull(x) || !isObject(x)) { + str += ' ' + x; + } else { + str += ' ' + inspect(x); + } + } + return str; +}; + + +// Mark that a method should not be used. +// Returns a modified function which warns once by default. +// If --no-deprecation is set, then it is a no-op. +exports.deprecate = function(fn, msg) { + // Allow for deprecating things in the process of starting up. + if (isUndefined(global.process)) { + return function() { + return exports.deprecate(fn, msg).apply(this, arguments); + }; + } + + if (process.noDeprecation === true) { + return fn; + } + + var warned = false; + function deprecated() { + if (!warned) { + if (process.throwDeprecation) { + throw new Error(msg); + } else if (process.traceDeprecation) { + console.trace(msg); + } else { + console.error(msg); + } + warned = true; + } + return fn.apply(this, arguments); + } + + return deprecated; +}; + + +var debugs = {}; +var debugEnviron; +exports.debuglog = function(set) { + if (isUndefined(debugEnviron)) + debugEnviron = process.env.NODE_DEBUG || ''; + set = set.toUpperCase(); + if (!debugs[set]) { + if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { + var pid = process.pid; + debugs[set] = function() { + var msg = exports.format.apply(exports, arguments); + console.error('%s %d: %s', set, pid, msg); + }; + } else { + debugs[set] = function() {}; + } + } + return debugs[set]; +}; + + +/** + * Echos the value of a value. Trys to print the value out + * in the best way possible given the different types. + * + * @param {Object} obj The object to print out. + * @param {Object} opts Optional options object that alters the output. + */ +/* legacy: obj, showHidden, depth, colors*/ +function inspect(obj, opts) { + // default options + var ctx = { + seen: [], + stylize: stylizeNoColor + }; + // legacy... + if (arguments.length >= 3) ctx.depth = arguments[2]; + if (arguments.length >= 4) ctx.colors = arguments[3]; + if (isBoolean(opts)) { + // legacy... + ctx.showHidden = opts; + } else if (opts) { + // got an "options" object + exports._extend(ctx, opts); + } + // set default options + if (isUndefined(ctx.showHidden)) ctx.showHidden = false; + if (isUndefined(ctx.depth)) ctx.depth = 2; + if (isUndefined(ctx.colors)) ctx.colors = false; + if (isUndefined(ctx.customInspect)) ctx.customInspect = true; + if (ctx.colors) ctx.stylize = stylizeWithColor; + return formatValue(ctx, obj, ctx.depth); +} +exports.inspect = inspect; + + +// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics +inspect.colors = { + 'bold' : [1, 22], + 'italic' : [3, 23], + 'underline' : [4, 24], + 'inverse' : [7, 27], + 'white' : [37, 39], + 'grey' : [90, 39], + 'black' : [30, 39], + 'blue' : [34, 39], + 'cyan' : [36, 39], + 'green' : [32, 39], + 'magenta' : [35, 39], + 'red' : [31, 39], + 'yellow' : [33, 39] +}; + +// Don't use 'blue' not visible on cmd.exe +inspect.styles = { + 'special': 'cyan', + 'number': 'yellow', + 'boolean': 'yellow', + 'undefined': 'grey', + 'null': 'bold', + 'string': 'green', + 'date': 'magenta', + // "name": intentionally not styling + 'regexp': 'red' +}; + + +function stylizeWithColor(str, styleType) { + var style = inspect.styles[styleType]; + + if (style) { + return '\u001b[' + inspect.colors[style][0] + 'm' + str + + '\u001b[' + inspect.colors[style][1] + 'm'; + } else { + return str; + } +} + + +function stylizeNoColor(str, styleType) { + return str; +} + + +function arrayToHash(array) { + var hash = {}; + + array.forEach(function(val, idx) { + hash[val] = true; + }); + + return hash; +} + + +function formatValue(ctx, value, recurseTimes) { + // Provide a hook for user-specified inspect functions. + // Check that value is an object with an inspect function on it + if (ctx.customInspect && + value && + isFunction(value.inspect) && + // Filter out the util module, it's inspect function is special + value.inspect !== exports.inspect && + // Also filter out any prototype objects using the circular check. + !(value.constructor && value.constructor.prototype === value)) { + var ret = value.inspect(recurseTimes, ctx); + if (!isString(ret)) { + ret = formatValue(ctx, ret, recurseTimes); + } + return ret; + } + + // Primitive types cannot have properties + var primitive = formatPrimitive(ctx, value); + if (primitive) { + return primitive; + } + + // Look up the keys of the object. + var keys = Object.keys(value); + var visibleKeys = arrayToHash(keys); + + if (ctx.showHidden) { + keys = Object.getOwnPropertyNames(value); + } + + // IE doesn't make error fields non-enumerable + // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx + if (isError(value) + && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) { + return formatError(value); + } + + // Some type of object without properties can be shortcutted. + if (keys.length === 0) { + if (isFunction(value)) { + var name = value.name ? ': ' + value.name : ''; + return ctx.stylize('[Function' + name + ']', 'special'); + } + if (isRegExp(value)) { + return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); + } + if (isDate(value)) { + return ctx.stylize(Date.prototype.toString.call(value), 'date'); + } + if (isError(value)) { + return formatError(value); + } + } + + var base = '', array = false, braces = ['{', '}']; + + // Make Array say that they are Array + if (isArray(value)) { + array = true; + braces = ['[', ']']; + } + + // Make functions say that they are functions + if (isFunction(value)) { + var n = value.name ? ': ' + value.name : ''; + base = ' [Function' + n + ']'; + } + + // Make RegExps say that they are RegExps + if (isRegExp(value)) { + base = ' ' + RegExp.prototype.toString.call(value); + } + + // Make dates with properties first say the date + if (isDate(value)) { + base = ' ' + Date.prototype.toUTCString.call(value); + } + + // Make error with message first say the error + if (isError(value)) { + base = ' ' + formatError(value); + } + + if (keys.length === 0 && (!array || value.length == 0)) { + return braces[0] + base + braces[1]; + } + + if (recurseTimes < 0) { + if (isRegExp(value)) { + return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); + } else { + return ctx.stylize('[Object]', 'special'); + } + } + + ctx.seen.push(value); + + var output; + if (array) { + output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); + } else { + output = keys.map(function(key) { + return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); + }); + } + + ctx.seen.pop(); + + return reduceToSingleString(output, base, braces); +} + + +function formatPrimitive(ctx, value) { + if (isUndefined(value)) + return ctx.stylize('undefined', 'undefined'); + if (isString(value)) { + var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') + .replace(/'/g, "\\'") + .replace(/\\"/g, '"') + '\''; + return ctx.stylize(simple, 'string'); + } + if (isNumber(value)) + return ctx.stylize('' + value, 'number'); + if (isBoolean(value)) + return ctx.stylize('' + value, 'boolean'); + // For some reason typeof null is "object", so special case here. + if (isNull(value)) + return ctx.stylize('null', 'null'); +} + + +function formatError(value) { + return '[' + Error.prototype.toString.call(value) + ']'; +} + + +function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { + var output = []; + for (var i = 0, l = value.length; i < l; ++i) { + if (hasOwnProperty(value, String(i))) { + output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, + String(i), true)); + } else { + output.push(''); + } + } + keys.forEach(function(key) { + if (!key.match(/^\d+$/)) { + output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, + key, true)); + } + }); + return output; +} + + +function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { + var name, str, desc; + desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; + if (desc.get) { + if (desc.set) { + str = ctx.stylize('[Getter/Setter]', 'special'); + } else { + str = ctx.stylize('[Getter]', 'special'); + } + } else { + if (desc.set) { + str = ctx.stylize('[Setter]', 'special'); + } + } + if (!hasOwnProperty(visibleKeys, key)) { + name = '[' + key + ']'; + } + if (!str) { + if (ctx.seen.indexOf(desc.value) < 0) { + if (isNull(recurseTimes)) { + str = formatValue(ctx, desc.value, null); + } else { + str = formatValue(ctx, desc.value, recurseTimes - 1); + } + if (str.indexOf('\n') > -1) { + if (array) { + str = str.split('\n').map(function(line) { + return ' ' + line; + }).join('\n').substr(2); + } else { + str = '\n' + str.split('\n').map(function(line) { + return ' ' + line; + }).join('\n'); + } + } + } else { + str = ctx.stylize('[Circular]', 'special'); + } + } + if (isUndefined(name)) { + if (array && key.match(/^\d+$/)) { + return str; + } + name = JSON.stringify('' + key); + if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { + name = name.substr(1, name.length - 2); + name = ctx.stylize(name, 'name'); + } else { + name = name.replace(/'/g, "\\'") + .replace(/\\"/g, '"') + .replace(/(^"|"$)/g, "'"); + name = ctx.stylize(name, 'string'); + } + } + + return name + ': ' + str; +} + + +function reduceToSingleString(output, base, braces) { + var numLinesEst = 0; + var length = output.reduce(function(prev, cur) { + numLinesEst++; + if (cur.indexOf('\n') >= 0) numLinesEst++; + return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; + }, 0); + + if (length > 60) { + return braces[0] + + (base === '' ? '' : base + '\n ') + + ' ' + + output.join(',\n ') + + ' ' + + braces[1]; + } + + return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; +} + + +// NOTE: These type checking functions intentionally don't use `instanceof` +// because it is fragile and can be easily faked with `Object.create()`. +function isArray(ar) { + return Array.isArray(ar); +} +exports.isArray = isArray; + +function isBoolean(arg) { + return typeof arg === 'boolean'; +} +exports.isBoolean = isBoolean; + +function isNull(arg) { + return arg === null; +} +exports.isNull = isNull; + +function isNullOrUndefined(arg) { + return arg == null; +} +exports.isNullOrUndefined = isNullOrUndefined; + +function isNumber(arg) { + return typeof arg === 'number'; +} +exports.isNumber = isNumber; + +function isString(arg) { + return typeof arg === 'string'; +} +exports.isString = isString; + +function isSymbol(arg) { + return typeof arg === 'symbol'; +} +exports.isSymbol = isSymbol; + +function isUndefined(arg) { + return arg === void 0; +} +exports.isUndefined = isUndefined; + +function isRegExp(re) { + return isObject(re) && objectToString(re) === '[object RegExp]'; +} +exports.isRegExp = isRegExp; + +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} +exports.isObject = isObject; + +function isDate(d) { + return isObject(d) && objectToString(d) === '[object Date]'; +} +exports.isDate = isDate; + +function isError(e) { + return isObject(e) && + (objectToString(e) === '[object Error]' || e instanceof Error); +} +exports.isError = isError; + +function isFunction(arg) { + return typeof arg === 'function'; +} +exports.isFunction = isFunction; + +function isPrimitive(arg) { + return arg === null || + typeof arg === 'boolean' || + typeof arg === 'number' || + typeof arg === 'string' || + typeof arg === 'symbol' || // ES6 symbol + typeof arg === 'undefined'; +} +exports.isPrimitive = isPrimitive; + +exports.isBuffer = require('./support/isBuffer'); + +function objectToString(o) { + return Object.prototype.toString.call(o); +} + + +function pad(n) { + return n < 10 ? '0' + n.toString(10) : n.toString(10); +} + + +var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', + 'Oct', 'Nov', 'Dec']; + +// 26 Feb 16:19:34 +function timestamp() { + var d = new Date(); + var time = [pad(d.getHours()), + pad(d.getMinutes()), + pad(d.getSeconds())].join(':'); + return [d.getDate(), months[d.getMonth()], time].join(' '); +} + + +// log is just a thin wrapper to console.log that prepends a timestamp +exports.log = function() { + console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments)); +}; + + +/** + * Inherit the prototype methods from one constructor into another. + * + * The Function.prototype.inherits from lang.js rewritten as a standalone + * function (not on Function.prototype). NOTE: If this file is to be loaded + * during bootstrapping this function needs to be rewritten using some native + * functions as prototype setup using normal JavaScript does not work as + * expected during bootstrapping (see mirror.js in r114903). + * + * @param {function} ctor Constructor function which needs to inherit the + * prototype. + * @param {function} superCtor Constructor function to inherit prototype from. + */ +exports.inherits = require('inherits'); + +exports._extend = function(origin, add) { + // Don't do anything if add isn't an object + if (!add || !isObject(add)) return origin; + + var keys = Object.keys(add); + var i = keys.length; + while (i--) { + origin[keys[i]] = add[keys[i]]; + } + return origin; +}; + +function hasOwnProperty(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); +} + +}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"./support/isBuffer":53,"_process":22,"inherits":19}],55:[function(require,module,exports){ +module.exports = extend + +function extend() { + var target = {} + + for (var i = 0; i < arguments.length; i++) { + var source = arguments[i] + + for (var key in source) { + if (source.hasOwnProperty(key)) { + target[key] = source[key] + } + } + } + + return target +} + +},{}],56:[function(require,module,exports){ +// Generated by CoffeeScript 1.10.0 +(function() { + "use strict"; + var xml2js; + + xml2js = require('../lib/xml2js'); + + exports.stripBOM = function(str) { + if (str[0] === '\uFEFF') { + return str.substring(1); + } else { + return str; + } + }; + +}).call(this); + +},{"../lib/xml2js":58}],57:[function(require,module,exports){ +// Generated by CoffeeScript 1.10.0 +(function() { + "use strict"; + var prefixMatch; + + prefixMatch = new RegExp(/(?!xmlns)^.*:/); + + exports.normalize = function(str) { + return str.toLowerCase(); + }; + + exports.firstCharLowerCase = function(str) { + return str.charAt(0).toLowerCase() + str.slice(1); + }; + + exports.stripPrefix = function(str) { + return str.replace(prefixMatch, ''); + }; + + exports.parseNumbers = function(str) { + if (!isNaN(str)) { + str = str % 1 === 0 ? parseInt(str, 10) : parseFloat(str); + } + return str; + }; + + exports.parseBooleans = function(str) { + if (/^(?:true|false)$/i.test(str)) { + str = str.toLowerCase() === 'true'; + } + return str; + }; + +}).call(this); + +},{}],58:[function(require,module,exports){ +// Generated by CoffeeScript 1.10.0 +(function() { + "use strict"; + var bom, builder, escapeCDATA, events, isEmpty, processName, processors, requiresCDATA, sax, setImmediate, wrapCDATA, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty, + bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; + + sax = require('sax'); + + events = require('events'); + + builder = require('xmlbuilder'); + + bom = require('./bom'); + + processors = require('./processors'); + + setImmediate = require('timers').setImmediate; + + isEmpty = function(thing) { + return typeof thing === "object" && (thing != null) && Object.keys(thing).length === 0; + }; + + processName = function(processors, processedName) { + var i, len, process; + for (i = 0, len = processors.length; i < len; i++) { + process = processors[i]; + processedName = process(processedName); + } + return processedName; + }; + + requiresCDATA = function(entry) { + return entry.indexOf('&') >= 0 || entry.indexOf('>') >= 0 || entry.indexOf('<') >= 0; + }; + + wrapCDATA = function(entry) { + return ""; + }; + + escapeCDATA = function(entry) { + return entry.replace(']]>', ']]]]>'); + }; + + exports.processors = processors; + + exports.defaults = { + "0.1": { + explicitCharkey: false, + trim: true, + normalize: true, + normalizeTags: false, + attrkey: "@", + charkey: "#", + explicitArray: false, + ignoreAttrs: false, + mergeAttrs: false, + explicitRoot: false, + validator: null, + xmlns: false, + explicitChildren: false, + childkey: '@@', + charsAsChildren: false, + async: false, + strict: true, + attrNameProcessors: null, + tagNameProcessors: null, + valueProcessors: null, + emptyTag: '' + }, + "0.2": { + explicitCharkey: false, + trim: false, + normalize: false, + normalizeTags: false, + attrkey: "$", + charkey: "_", + explicitArray: true, + ignoreAttrs: false, + mergeAttrs: false, + explicitRoot: true, + validator: null, + xmlns: false, + explicitChildren: false, + preserveChildrenOrder: false, + childkey: '$$', + charsAsChildren: false, + async: false, + strict: true, + attrNameProcessors: null, + tagNameProcessors: null, + valueProcessors: null, + rootName: 'root', + xmldec: { + 'version': '1.0', + 'encoding': 'UTF-8', + 'standalone': true + }, + doctype: null, + renderOpts: { + 'pretty': true, + 'indent': ' ', + 'newline': '\n' + }, + headless: false, + chunkSize: 10000, + emptyTag: '', + cdata: false + } + }; + + exports.ValidationError = (function(superClass) { + extend(ValidationError, superClass); + + function ValidationError(message) { + this.message = message; + } + + return ValidationError; + + })(Error); + + exports.Builder = (function() { + function Builder(opts) { + var key, ref, value; + this.options = {}; + ref = exports.defaults["0.2"]; + for (key in ref) { + if (!hasProp.call(ref, key)) continue; + value = ref[key]; + this.options[key] = value; + } + for (key in opts) { + if (!hasProp.call(opts, key)) continue; + value = opts[key]; + this.options[key] = value; + } + } + + Builder.prototype.buildObject = function(rootObj) { + var attrkey, charkey, render, rootElement, rootName; + attrkey = this.options.attrkey; + charkey = this.options.charkey; + if ((Object.keys(rootObj).length === 1) && (this.options.rootName === exports.defaults['0.2'].rootName)) { + rootName = Object.keys(rootObj)[0]; + rootObj = rootObj[rootName]; + } else { + rootName = this.options.rootName; + } + render = (function(_this) { + return function(element, obj) { + var attr, child, entry, index, key, value; + if (typeof obj !== 'object') { + if (_this.options.cdata && requiresCDATA(obj)) { + element.raw(wrapCDATA(obj)); + } else { + element.txt(obj); + } + } else { + for (key in obj) { + if (!hasProp.call(obj, key)) continue; + child = obj[key]; + if (key === attrkey) { + if (typeof child === "object") { + for (attr in child) { + value = child[attr]; + element = element.att(attr, value); + } + } + } else if (key === charkey) { + if (_this.options.cdata && requiresCDATA(child)) { + element = element.raw(wrapCDATA(child)); + } else { + element = element.txt(child); + } + } else if (Array.isArray(child)) { + for (index in child) { + if (!hasProp.call(child, index)) continue; + entry = child[index]; + if (typeof entry === 'string') { + if (_this.options.cdata && requiresCDATA(entry)) { + element = element.ele(key).raw(wrapCDATA(entry)).up(); + } else { + element = element.ele(key, entry).up(); + } + } else { + element = render(element.ele(key), entry).up(); + } + } + } else if (typeof child === "object") { + element = render(element.ele(key), child).up(); + } else { + if (typeof child === 'string' && _this.options.cdata && requiresCDATA(child)) { + element = element.ele(key).raw(wrapCDATA(child)).up(); + } else { + element = element.ele(key, child.toString()).up(); + } + } + } + } + return element; + }; + })(this); + rootElement = builder.create(rootName, this.options.xmldec, this.options.doctype, { + headless: this.options.headless + }); + return render(rootElement, rootObj).end(this.options.renderOpts); + }; + + return Builder; + + })(); + + exports.Parser = (function(superClass) { + extend(Parser, superClass); + + function Parser(opts) { + this.parseString = bind(this.parseString, this); + this.reset = bind(this.reset, this); + this.assignOrPush = bind(this.assignOrPush, this); + this.processAsync = bind(this.processAsync, this); + var key, ref, value; + if (!(this instanceof exports.Parser)) { + return new exports.Parser(opts); + } + this.options = {}; + ref = exports.defaults["0.2"]; + for (key in ref) { + if (!hasProp.call(ref, key)) continue; + value = ref[key]; + this.options[key] = value; + } + for (key in opts) { + if (!hasProp.call(opts, key)) continue; + value = opts[key]; + this.options[key] = value; + } + if (this.options.xmlns) { + this.options.xmlnskey = this.options.attrkey + "ns"; + } + if (this.options.normalizeTags) { + if (!this.options.tagNameProcessors) { + this.options.tagNameProcessors = []; + } + this.options.tagNameProcessors.unshift(processors.normalize); + } + this.reset(); + } + + Parser.prototype.processAsync = function() { + var chunk, err, error1; + try { + if (this.remaining.length <= this.options.chunkSize) { + chunk = this.remaining; + this.remaining = ''; + this.saxParser = this.saxParser.write(chunk); + return this.saxParser.close(); + } else { + chunk = this.remaining.substr(0, this.options.chunkSize); + this.remaining = this.remaining.substr(this.options.chunkSize, this.remaining.length); + this.saxParser = this.saxParser.write(chunk); + return setImmediate(this.processAsync); + } + } catch (error1) { + err = error1; + if (!this.saxParser.errThrown) { + this.saxParser.errThrown = true; + return this.emit(err); + } + } + }; + + Parser.prototype.assignOrPush = function(obj, key, newValue) { + if (!(key in obj)) { + if (!this.options.explicitArray) { + return obj[key] = newValue; + } else { + return obj[key] = [newValue]; + } + } else { + if (!(obj[key] instanceof Array)) { + obj[key] = [obj[key]]; + } + return obj[key].push(newValue); + } + }; + + Parser.prototype.reset = function() { + var attrkey, charkey, ontext, stack; + this.removeAllListeners(); + this.saxParser = sax.parser(this.options.strict, { + trim: false, + normalize: false, + xmlns: this.options.xmlns + }); + this.saxParser.errThrown = false; + this.saxParser.onerror = (function(_this) { + return function(error) { + _this.saxParser.resume(); + if (!_this.saxParser.errThrown) { + _this.saxParser.errThrown = true; + return _this.emit("error", error); + } + }; + })(this); + this.saxParser.onend = (function(_this) { + return function() { + if (!_this.saxParser.ended) { + _this.saxParser.ended = true; + return _this.emit("end", _this.resultObject); + } + }; + })(this); + this.saxParser.ended = false; + this.EXPLICIT_CHARKEY = this.options.explicitCharkey; + this.resultObject = null; + stack = []; + attrkey = this.options.attrkey; + charkey = this.options.charkey; + this.saxParser.onopentag = (function(_this) { + return function(node) { + var key, newValue, obj, processedKey, ref; + obj = {}; + obj[charkey] = ""; + if (!_this.options.ignoreAttrs) { + ref = node.attributes; + for (key in ref) { + if (!hasProp.call(ref, key)) continue; + if (!(attrkey in obj) && !_this.options.mergeAttrs) { + obj[attrkey] = {}; + } + newValue = node.attributes[key]; + processedKey = _this.options.attrNameProcessors ? processName(_this.options.attrNameProcessors, key) : key; + if (_this.options.mergeAttrs) { + _this.assignOrPush(obj, processedKey, newValue); + } else { + obj[attrkey][processedKey] = newValue; + } + } + } + obj["#name"] = _this.options.tagNameProcessors ? processName(_this.options.tagNameProcessors, node.name) : node.name; + if (_this.options.xmlns) { + obj[_this.options.xmlnskey] = { + uri: node.uri, + local: node.local + }; + } + return stack.push(obj); + }; + })(this); + this.saxParser.onclosetag = (function(_this) { + return function() { + var cdata, emptyStr, err, error1, key, node, nodeName, obj, objClone, old, s, xpath; + obj = stack.pop(); + nodeName = obj["#name"]; + if (!_this.options.explicitChildren || !_this.options.preserveChildrenOrder) { + delete obj["#name"]; + } + if (obj.cdata === true) { + cdata = obj.cdata; + delete obj.cdata; + } + s = stack[stack.length - 1]; + if (obj[charkey].match(/^\s*$/) && !cdata) { + emptyStr = obj[charkey]; + delete obj[charkey]; + } else { + if (_this.options.trim) { + obj[charkey] = obj[charkey].trim(); + } + if (_this.options.normalize) { + obj[charkey] = obj[charkey].replace(/\s{2,}/g, " ").trim(); + } + obj[charkey] = _this.options.valueProcessors ? processName(_this.options.valueProcessors, obj[charkey]) : obj[charkey]; + if (Object.keys(obj).length === 1 && charkey in obj && !_this.EXPLICIT_CHARKEY) { + obj = obj[charkey]; + } + } + if (isEmpty(obj)) { + obj = _this.options.emptyTag !== '' ? _this.options.emptyTag : emptyStr; + } + if (_this.options.validator != null) { + xpath = "/" + ((function() { + var i, len, results; + results = []; + for (i = 0, len = stack.length; i < len; i++) { + node = stack[i]; + results.push(node["#name"]); + } + return results; + })()).concat(nodeName).join("/"); + try { + obj = _this.options.validator(xpath, s && s[nodeName], obj); + } catch (error1) { + err = error1; + _this.emit("error", err); + } + } + if (_this.options.explicitChildren && !_this.options.mergeAttrs && typeof obj === 'object') { + if (!_this.options.preserveChildrenOrder) { + node = {}; + if (_this.options.attrkey in obj) { + node[_this.options.attrkey] = obj[_this.options.attrkey]; + delete obj[_this.options.attrkey]; + } + if (!_this.options.charsAsChildren && _this.options.charkey in obj) { + node[_this.options.charkey] = obj[_this.options.charkey]; + delete obj[_this.options.charkey]; + } + if (Object.getOwnPropertyNames(obj).length > 0) { + node[_this.options.childkey] = obj; + } + obj = node; + } else if (s) { + s[_this.options.childkey] = s[_this.options.childkey] || []; + objClone = {}; + for (key in obj) { + if (!hasProp.call(obj, key)) continue; + objClone[key] = obj[key]; + } + s[_this.options.childkey].push(objClone); + delete obj["#name"]; + if (Object.keys(obj).length === 1 && charkey in obj && !_this.EXPLICIT_CHARKEY) { + obj = obj[charkey]; + } + } + } + if (stack.length > 0) { + return _this.assignOrPush(s, nodeName, obj); + } else { + if (_this.options.explicitRoot) { + old = obj; + obj = {}; + obj[nodeName] = old; + } + _this.resultObject = obj; + _this.saxParser.ended = true; + return _this.emit("end", _this.resultObject); + } + }; + })(this); + ontext = (function(_this) { + return function(text) { + var charChild, s; + s = stack[stack.length - 1]; + if (s) { + s[charkey] += text; + if (_this.options.explicitChildren && _this.options.preserveChildrenOrder && _this.options.charsAsChildren && text.replace(/\\n/g, '').trim() !== '') { + s[_this.options.childkey] = s[_this.options.childkey] || []; + charChild = { + '#name': '__text__' + }; + charChild[charkey] = text; + s[_this.options.childkey].push(charChild); + } + return s; + } + }; + })(this); + this.saxParser.ontext = ontext; + return this.saxParser.oncdata = (function(_this) { + return function(text) { + var s; + s = ontext(text); + if (s) { + return s.cdata = true; + } + }; + })(this); + }; + + Parser.prototype.parseString = function(str, cb) { + var err, error1; + if ((cb != null) && typeof cb === "function") { + this.on("end", function(result) { + this.reset(); + return cb(null, result); + }); + this.on("error", function(err) { + this.reset(); + return cb(err); + }); + } + try { + str = str.toString(); + if (str.trim() === '') { + this.emit("end", null); + return true; + } + str = bom.stripBOM(str); + if (this.options.async) { + this.remaining = str; + setImmediate(this.processAsync); + return this.saxParser; + } + return this.saxParser.write(str).close(); + } catch (error1) { + err = error1; + if (!(this.saxParser.errThrown || this.saxParser.ended)) { + this.emit('error', err); + return this.saxParser.errThrown = true; + } else if (this.saxParser.ended) { + throw err; + } + } + }; + + return Parser; + + })(events.EventEmitter); + + exports.parseString = function(str, a, b) { + var cb, options, parser; + if (b != null) { + if (typeof b === 'function') { + cb = b; + } + if (typeof a === 'object') { + options = a; + } + } else { + if (typeof a === 'function') { + cb = a; + } + options = {}; + } + parser = new exports.Parser(options); + return parser.parseString(str, cb); + }; + +}).call(this); + +},{"./bom":56,"./processors":57,"events":17,"sax":59,"timers":51,"xmlbuilder":76}],59:[function(require,module,exports){ +(function (Buffer){ +;(function (sax) { // wrapper for non-node envs + sax.parser = function (strict, opt) { return new SAXParser(strict, opt) } + sax.SAXParser = SAXParser + sax.SAXStream = SAXStream + sax.createStream = createStream + + // When we pass the MAX_BUFFER_LENGTH position, start checking for buffer overruns. + // When we check, schedule the next check for MAX_BUFFER_LENGTH - (max(buffer lengths)), + // since that's the earliest that a buffer overrun could occur. This way, checks are + // as rare as required, but as often as necessary to ensure never crossing this bound. + // Furthermore, buffers are only tested at most once per write(), so passing a very + // large string into write() might have undesirable effects, but this is manageable by + // the caller, so it is assumed to be safe. Thus, a call to write() may, in the extreme + // edge case, result in creating at most one complete copy of the string passed in. + // Set to Infinity to have unlimited buffers. + sax.MAX_BUFFER_LENGTH = 64 * 1024 + + var buffers = [ + 'comment', 'sgmlDecl', 'textNode', 'tagName', 'doctype', + 'procInstName', 'procInstBody', 'entity', 'attribName', + 'attribValue', 'cdata', 'script' + ] + + sax.EVENTS = [ + 'text', + 'processinginstruction', + 'sgmldeclaration', + 'doctype', + 'comment', + 'attribute', + 'opentag', + 'closetag', + 'opencdata', + 'cdata', + 'closecdata', + 'error', + 'end', + 'ready', + 'script', + 'opennamespace', + 'closenamespace' + ] + + function SAXParser (strict, opt) { + if (!(this instanceof SAXParser)) { + return new SAXParser(strict, opt) + } + + var parser = this + clearBuffers(parser) + parser.q = parser.c = '' + parser.bufferCheckPosition = sax.MAX_BUFFER_LENGTH + parser.opt = opt || {} + parser.opt.lowercase = parser.opt.lowercase || parser.opt.lowercasetags + parser.looseCase = parser.opt.lowercase ? 'toLowerCase' : 'toUpperCase' + parser.tags = [] + parser.closed = parser.closedRoot = parser.sawRoot = false + parser.tag = parser.error = null + parser.strict = !!strict + parser.noscript = !!(strict || parser.opt.noscript) + parser.state = S.BEGIN + parser.strictEntities = parser.opt.strictEntities + parser.ENTITIES = parser.strictEntities ? Object.create(sax.XML_ENTITIES) : Object.create(sax.ENTITIES) + parser.attribList = [] + + // namespaces form a prototype chain. + // it always points at the current tag, + // which protos to its parent tag. + if (parser.opt.xmlns) { + parser.ns = Object.create(rootNS) + } + + // mostly just for error reporting + parser.trackPosition = parser.opt.position !== false + if (parser.trackPosition) { + parser.position = parser.line = parser.column = 0 + } + emit(parser, 'onready') + } + + if (!Object.create) { + Object.create = function (o) { + function F () {} + F.prototype = o + var newf = new F() + return newf + } + } + + if (!Object.keys) { + Object.keys = function (o) { + var a = [] + for (var i in o) if (o.hasOwnProperty(i)) a.push(i) + return a + } + } + + function checkBufferLength (parser) { + var maxAllowed = Math.max(sax.MAX_BUFFER_LENGTH, 10) + var maxActual = 0 + for (var i = 0, l = buffers.length; i < l; i++) { + var len = parser[buffers[i]].length + if (len > maxAllowed) { + // Text/cdata nodes can get big, and since they're buffered, + // we can get here under normal conditions. + // Avoid issues by emitting the text node now, + // so at least it won't get any bigger. + switch (buffers[i]) { + case 'textNode': + closeText(parser) + break + + case 'cdata': + emitNode(parser, 'oncdata', parser.cdata) + parser.cdata = '' + break + + case 'script': + emitNode(parser, 'onscript', parser.script) + parser.script = '' + break + + default: + error(parser, 'Max buffer length exceeded: ' + buffers[i]) + } + } + maxActual = Math.max(maxActual, len) + } + // schedule the next check for the earliest possible buffer overrun. + var m = sax.MAX_BUFFER_LENGTH - maxActual + parser.bufferCheckPosition = m + parser.position + } + + function clearBuffers (parser) { + for (var i = 0, l = buffers.length; i < l; i++) { + parser[buffers[i]] = '' + } + } + + function flushBuffers (parser) { + closeText(parser) + if (parser.cdata !== '') { + emitNode(parser, 'oncdata', parser.cdata) + parser.cdata = '' + } + if (parser.script !== '') { + emitNode(parser, 'onscript', parser.script) + parser.script = '' + } + } + + SAXParser.prototype = { + end: function () { end(this) }, + write: write, + resume: function () { this.error = null; return this }, + close: function () { return this.write(null) }, + flush: function () { flushBuffers(this) } + } + + var Stream + try { + Stream = require('stream').Stream + } catch (ex) { + Stream = function () {} + } + + var streamWraps = sax.EVENTS.filter(function (ev) { + return ev !== 'error' && ev !== 'end' + }) + + function createStream (strict, opt) { + return new SAXStream(strict, opt) + } + + function SAXStream (strict, opt) { + if (!(this instanceof SAXStream)) { + return new SAXStream(strict, opt) + } + + Stream.apply(this) + + this._parser = new SAXParser(strict, opt) + this.writable = true + this.readable = true + + var me = this + + this._parser.onend = function () { + me.emit('end') + } + + this._parser.onerror = function (er) { + me.emit('error', er) + + // if didn't throw, then means error was handled. + // go ahead and clear error, so we can write again. + me._parser.error = null + } + + this._decoder = null + + streamWraps.forEach(function (ev) { + Object.defineProperty(me, 'on' + ev, { + get: function () { + return me._parser['on' + ev] + }, + set: function (h) { + if (!h) { + me.removeAllListeners(ev) + me._parser['on' + ev] = h + return h + } + me.on(ev, h) + }, + enumerable: true, + configurable: false + }) + }) + } + + SAXStream.prototype = Object.create(Stream.prototype, { + constructor: { + value: SAXStream + } + }) + + SAXStream.prototype.write = function (data) { + if (typeof Buffer === 'function' && + typeof Buffer.isBuffer === 'function' && + Buffer.isBuffer(data)) { + if (!this._decoder) { + var SD = require('string_decoder').StringDecoder + this._decoder = new SD('utf8') + } + data = this._decoder.write(data) + } + + this._parser.write(data.toString()) + this.emit('data', data) + return true + } + + SAXStream.prototype.end = function (chunk) { + if (chunk && chunk.length) { + this.write(chunk) + } + this._parser.end() + return true + } + + SAXStream.prototype.on = function (ev, handler) { + var me = this + if (!me._parser['on' + ev] && streamWraps.indexOf(ev) !== -1) { + me._parser['on' + ev] = function () { + var args = arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments) + args.splice(0, 0, ev) + me.emit.apply(me, args) + } + } + + return Stream.prototype.on.call(me, ev, handler) + } + + // character classes and tokens + var whitespace = '\r\n\t ' + + // this really needs to be replaced with character classes. + // XML allows all manner of ridiculous numbers and digits. + var number = '0124356789' + var letter = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' + + // (Letter | "_" | ":") + var quote = '\'"' + var attribEnd = whitespace + '>' + var CDATA = '[CDATA[' + var DOCTYPE = 'DOCTYPE' + var XML_NAMESPACE = 'http://www.w3.org/XML/1998/namespace' + var XMLNS_NAMESPACE = 'http://www.w3.org/2000/xmlns/' + var rootNS = { xml: XML_NAMESPACE, xmlns: XMLNS_NAMESPACE } + + // turn all the string character sets into character class objects. + whitespace = charClass(whitespace) + number = charClass(number) + letter = charClass(letter) + + // http://www.w3.org/TR/REC-xml/#NT-NameStartChar + // This implementation works on strings, a single character at a time + // as such, it cannot ever support astral-plane characters (10000-EFFFF) + // without a significant breaking change to either this parser, or the + // JavaScript language. Implementation of an emoji-capable xml parser + // is left as an exercise for the reader. + var nameStart = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/ + + var nameBody = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040\.\d-]/ + + var entityStart = /[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/ + var entityBody = /[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040\.\d-]/ + + quote = charClass(quote) + attribEnd = charClass(attribEnd) + + function charClass (str) { + return str.split('').reduce(function (s, c) { + s[c] = true + return s + }, {}) + } + + function isRegExp (c) { + return Object.prototype.toString.call(c) === '[object RegExp]' + } + + function is (charclass, c) { + return isRegExp(charclass) ? !!c.match(charclass) : charclass[c] + } + + function not (charclass, c) { + return !is(charclass, c) + } + + var S = 0 + sax.STATE = { + BEGIN: S++, // leading byte order mark or whitespace + BEGIN_WHITESPACE: S++, // leading whitespace + TEXT: S++, // general stuff + TEXT_ENTITY: S++, // & and such. + OPEN_WAKA: S++, // < + SGML_DECL: S++, // + SCRIPT: S++, // + + + + + + + + +
+ +

Class: GpxExtent

+ + + + + +
+ +
+

+ GpxExtent +

+ +
Stores an extent.
+ +
+ +
+
+ + + + +
+

new GpxExtent(minx, miny, maxx, miny)

+ + +
+
+ + +
+ Contructor for gpx extent +
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
minx + + +number + + + + The minimum x value
miny + + +number + + + + The minimum y value
maxx + + +number + + + + The maximum x value
miny + + +number + + + + The maximum y value
+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + + +
+ +
+ Documentation generated by JSDoc 3.2.2 on Wed Aug 13 2014 09:19:33 GMT+0100 (BST) +
+ + + + + \ No newline at end of file diff --git a/www/js/gpx-parse/doc/GpxMetaData.html b/www/js/gpx-parse/doc/GpxMetaData.html new file mode 100644 index 0000000..f8bcfb7 --- /dev/null +++ b/www/js/gpx-parse/doc/GpxMetaData.html @@ -0,0 +1,223 @@ + + + + + JSDoc: Class: GpxMetaData + + + + + + + + + + +
+ +

Class: GpxMetaData

+ + + + + +
+ +
+

+ GpxMetaData +

+ +
Stores all the metadata associated with the gpx file.
+ +
+ +
+
+ + + + +
+

new GpxMetaData(creator, time)

+ + +
+
+ + +
+ Contructor for the gpx metadata class +
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
creator + + +string + + + + The creator of the gpx file.
time + + +string + + + + The string representation of the datetime from the file.
+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + + +
+ +
+ Documentation generated by JSDoc 3.2.2 on Wed Aug 13 2014 09:19:33 GMT+0100 (BST) +
+ + + + + \ No newline at end of file diff --git a/www/js/gpx-parse/doc/GpxResult.html b/www/js/gpx-parse/doc/GpxResult.html new file mode 100644 index 0000000..6606827 --- /dev/null +++ b/www/js/gpx-parse/doc/GpxResult.html @@ -0,0 +1,269 @@ + + + + + JSDoc: Class: GpxResult + + + + + + + + + + +
+ +

Class: GpxResult

+ + + + + +
+ +
+

+ GpxResult +

+ +
Holds the results of the gpx parse
+ +
+ +
+
+ + + + +
+

new GpxResult(metadata, waypoints, routes, tracks)

+ + +
+
+ + +
+ Constructor for GpxResult +
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
metadata + + +GpxMetaData + + + + The metadata associated with the gpx trace
waypoints + + +Array.<GpxWaypoint> + + + + An array of waypoints.
routes + + +Array.<GpxRoute> + + + + An array of routes.
tracks + + +Array.<GpxTrack> + + + + An array of tracks.
+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + + +
+ +
+ Documentation generated by JSDoc 3.2.2 on Wed Aug 13 2014 09:19:33 GMT+0100 (BST) +
+ + + + + \ No newline at end of file diff --git a/www/js/gpx-parse/doc/GpxRoute.html b/www/js/gpx-parse/doc/GpxRoute.html new file mode 100644 index 0000000..b74dfe1 --- /dev/null +++ b/www/js/gpx-parse/doc/GpxRoute.html @@ -0,0 +1,269 @@ + + + + + JSDoc: Class: GpxRoute + + + + + + + + + + +
+ +

Class: GpxRoute

+ + + + + +
+ +
+

+ GpxRoute +

+ +
represents a route, an ordered list of waypoints representing a series of turn points leading to a destination.
+ +
+ +
+
+ + + + +
+

new GpxRoute(name, cmt, desc, points)

+ + +
+
+ + +
+ Constructs a gpx route. +
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
name + + +string + + + + The name of the route.
cmt + + +string + + + + A comment regarding the route.
desc + + +string + + + + A description of the route.
points + + +object[] + + + + An array of waypoints representing the route.
+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + + +
+ +
+ Documentation generated by JSDoc 3.2.2 on Wed Aug 13 2014 09:19:33 GMT+0100 (BST) +
+ + + + + \ No newline at end of file diff --git a/www/js/gpx-parse/doc/GpxTrack.html b/www/js/gpx-parse/doc/GpxTrack.html new file mode 100644 index 0000000..0900dbc --- /dev/null +++ b/www/js/gpx-parse/doc/GpxTrack.html @@ -0,0 +1,365 @@ + + + + + JSDoc: Class: GpxTrack + + + + + + + + + + +
+ +

Class: GpxTrack

+ + + + + +
+ +
+

+ GpxTrack +

+ +
Holds an instance of a gpx track
+ +
+ +
+
+ + + + +
+

new GpxTrack(segments, name)

+ + +
+
+ + +
+ Constructs a gpx track. +
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
segments + + +object[] + + + + The segments of the track
name + + +String + + + + The name of the Track
+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+

length()

+ + +
+
+ + +
+ Calculates the total length of all the segments within the track +
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + +
+ + + +
+

segment()

+ + +
+
+ + +
+ Gets a segment of the track. +
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ +
+ Documentation generated by JSDoc 3.2.2 on Wed Aug 13 2014 09:19:33 GMT+0100 (BST) +
+ + + + + \ No newline at end of file diff --git a/www/js/gpx-parse/doc/GpxWaypoint.html b/www/js/gpx-parse/doc/GpxWaypoint.html new file mode 100644 index 0000000..170a58e --- /dev/null +++ b/www/js/gpx-parse/doc/GpxWaypoint.html @@ -0,0 +1,928 @@ + + + + + JSDoc: Class: GpxWaypoint + + + + + + + + + + +
+ +

Class: GpxWaypoint

+ + + + + +
+ +
+

+ GpxWaypoint +

+ +
Represents a waypoint, point of interest, or named feature on a map.
+ +
+ +
+
+ + + + +
+

new GpxWaypoint(lat, lon, elevation, time, magvar, geoidheight, name, cmt, desc, src, links, sym, type)

+ + +
+
+ + +
+ Constructs a gpx waypoint. +
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
lat + + +number + + + + The latitude of the waypoint.
lon + + +number + + + + The longtitude of the waypoint.
elevation + + +number + + + + of the waypoint.
time + + +string + + + + The time at the waypoint.
magvar + + +number + + + + The magnetic variation at the waypoint.
geoidheight + + +number + + + + The geoid height at the waypoint.
name + + +string + + + + The name of the waypoint.
cmt + + +string + + + + A comment regarding the waypoint.
desc + + +string + + + + A description of the waypoint.
src + + +string + + + + The source of the waypoint.
links + + +string[] + + + + An array of links for the waypoint.
sym + + +string + + + + The symbol of the waypoint.
type + + +string + + + + The type of waypoint.
+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + +

Members

+ +
+ +
+

cmt :string

+ + +
+
+ +
+ cmt of the Waypoint +
+ + + +
Type:
+
    +
  • + +string + + +
  • +
+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + +
+ + + +
+

desc :string

+ + +
+
+ +
+ Description of the Waypoint +
+ + + +
Type:
+
    +
  • + +string + + +
  • +
+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + +
+ + + +
+

elevation :Number

+ + +
+
+ +
+ Elevation at the Waypoint +
+ + + +
Type:
+
    +
  • + +Number + + +
  • +
+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + +
+ + + +
+

lat :Number

+ + +
+
+ +
+ Latitude of the Waypoint +
+ + + +
Type:
+
    +
  • + +Number + + +
  • +
+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + +
+ + + +
+

lon :Number

+ + +
+
+ +
+ Longtitude of the Waypoint +
+ + + +
Type:
+
    +
  • + +Number + + +
  • +
+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + +
+ + + +
+

name :string

+ + +
+
+ +
+ Name of the Waypoint +
+ + + +
Type:
+
    +
  • + +string + + +
  • +
+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + +
+ + + +
+

time :Date

+ + +
+
+ +
+ Time associated with the Waypoint +
+ + + +
Type:
+
    +
  • + +Date + + +
  • +
+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + +
+ +
+ + + + + + + +
+ +
+ + + + +
+ + + +
+ +
+ Documentation generated by JSDoc 3.2.2 on Wed Aug 13 2014 09:19:33 GMT+0100 (BST) +
+ + + + + \ No newline at end of file diff --git a/www/js/gpx-parse/doc/geomUtils.js.html b/www/js/gpx-parse/doc/geomUtils.js.html new file mode 100644 index 0000000..cc5e86d --- /dev/null +++ b/www/js/gpx-parse/doc/geomUtils.js.html @@ -0,0 +1,104 @@ + + + + + JSDoc: Source: geomUtils.js + + + + + + + + + + +
+ +

Source: geomUtils.js

+ + + + + +
+
+
/**
+ * @module geomutils
+**/
+
+//File for geom utils
+if (!Number.prototype.toRad) {
+	Number.prototype.toRad = function() {
+		return this * Math.PI / 180;
+	};
+
+}
+
+var greatCircleRadius = {
+	miles: 3956,
+	km: 6367
+};
+
+/**
+ * Calculates the distance between the two points using the haversine method.
+ * @param {number} lat1 The latitude of the first point.
+ * @param {number} lon1 The longtitude of the first point.
+ * @param {number} lat2 The latitude of the first point.
+ * @param {number} lon2 The longtitude of the first point.
+ * @returns {number} The distance in miles between the two points.
+**/
+exports.calculateDistance = function(lat1, lon1, lat2, lon2) {
+	var dLat = (lat2 - lat1).toRad(),
+		dLon = (lon2 - lon1).toRad();
+
+	lat1 = lat1.toRad();
+	lat2 = lat2.toRad();
+
+	var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
+		Math.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(lat1) * Math.cos(lat2);
+	var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
+	return greatCircleRadius.miles * c;
+};
+
+/**
+ * Calcuates the midpoint between the two points passed in.
+ */
+exports.calculateMidpoint = function(lat1, lon1, lat2, lon2) {
+	var dLat = (lat2 - lat1).toRad(),
+		dLon = (lon2 - lon1).toRad();
+
+	lat1 = lat1.toRad();
+	lat2 = lat2.toRad();
+
+	var Bx = Math.cos(lat2) * Math.cos(dLon);
+	var By = Math.cos(lat2) * Math.sin(dLon);
+	var lat3 = Math.atan2(Math.sin(lat1) + Math.sin(lat2),
+		Math.sqrt((Math.cos(lat1) + Bx) * (Math.cos(lat1) + Bx) + By * By));
+	var lon3 = lon1 + Math.atan2(By, Math.cos(lat1) + Bx);
+};
+
+
+
+ + + + +
+ + + +
+ +
+ Documentation generated by JSDoc 3.2.2 on Wed Aug 13 2014 09:19:33 GMT+0100 (BST) +
+ + + + + diff --git a/www/js/gpx-parse/doc/global.html b/www/js/gpx-parse/doc/global.html new file mode 100644 index 0000000..b997ada --- /dev/null +++ b/www/js/gpx-parse/doc/global.html @@ -0,0 +1,259 @@ + + + + + JSDoc: Global + + + + + + + + + + +
+ +

Global

+ + + + + +
+ +
+

+ +

+ +
+ +
+
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + +

Type Definitions

+ +
+ +
+

gpxParseCompleteCallback(error, response)

+ + +
+
+ + +
+ Callback when gpx result has been processed. +
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
error + + +Object + + + + If an error has occurred the error otherwise null
response + + +GpxResult + + + + The parsed gpx file object
+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+ + + + +
+ + + +
+ +
+ Documentation generated by JSDoc 3.2.2 on Wed Aug 13 2014 09:19:33 GMT+0100 (BST) +
+ + + + + \ No newline at end of file diff --git a/www/js/gpx-parse/doc/gpx-parse.js.html b/www/js/gpx-parse/doc/gpx-parse.js.html new file mode 100644 index 0000000..9f66c47 --- /dev/null +++ b/www/js/gpx-parse/doc/gpx-parse.js.html @@ -0,0 +1,278 @@ + + + + + JSDoc: Source: gpx-parse.js + + + + + + + + + + +
+ +

Source: gpx-parse.js

+ + + + + +
+
+
/**
+* @module gpx-parse
+**/
+
+var assert = require("assert"),
+    fs = require("fs"),
+    url = require("url"),
+    http = require("http"),
+    https = require("https"),
+	GpxResult = require('./gpxResult'),
+	GpxExtent = require('./gpxExtent'),
+	GpxWaypoint = require('./gpxWaypoint'),
+	GpxTrack = require('./gpxTrack'),
+	GpxMetaData = require('./gpxMetaData'),
+	GpxRoute = require('./gpxRoute'),
+	geomUtils = require('./geomUtils');
+
+
+/**
+ * Parses the waypoints into an array of waypoints.
+ */
+var _getWayPoints = function(gpxWaypoints) {
+
+	var waypoints = [],
+		currentWaypoint = null,
+		point = null;
+	if (gpxWaypoints !== null && gpxWaypoints !== undefined) {
+		//grab waypoints
+		for (var i = 0, il = gpxWaypoints.length; i < il; i++) {
+			currentWaypoint = gpxWaypoints[i];
+			point = new GpxWaypoint(currentWaypoint.$.lat, currentWaypoint.$.lon, currentWaypoint.ele, currentWaypoint.time);
+			waypoints.push(point);
+		}
+	}
+
+	return waypoints;
+};
+
+/**
+ * Parses routes into an array of route objects
+ */
+var _getRoutes = function(gpxRoutes) {
+	//grab routes
+	var routes = [],
+		route = null;
+	if (gpxRoutes !== null && gpxRoutes !== undefined) {
+		for (var i = 0, il = gpxRoutes.length; i < il; i++) {
+			//clear out route points
+			var routePoints = [],
+			currentRoute = gpxRoutes[i];
+
+			for (var j = 0, jl = currentRoute.rtept.length; j < jl; j++) {
+				routePoints.push(new GpxWaypoint(currentRoute.rtept[j].$.lat, currentRoute.rtept[j].$.lon));
+			}
+
+			route = new GpxRoute(gpxRoutes.name, gpxRoutes.cmt, gpxRoutes.desc, routePoints);
+
+
+			routes.push(route);
+		}
+	}
+
+	return routes;
+};
+
+var _getTracks = function(gpxTracks) {
+	//grab tracks
+	var tracks = [];
+
+	for (var i = 0, il = gpxTracks.length; i < il; i++) {
+
+		var trackSegments = [],
+			currentTrack = gpxTracks[i],
+			trackName = null;
+
+		if (currentTrack.name) {
+			trackName = currentTrack.name[0];
+		}
+
+		for (var j = 0, jl = currentTrack.trkseg.length; j < jl; j++) {
+
+			var trackSegement = [],
+				currentSegment = currentTrack.trkseg[j],
+				time;
+
+			for (var k = 0, kl = currentSegment.trkpt.length; k < kl; k++) {
+
+				var trackPoint = currentSegment.trkpt[k],
+					elevation = trackPoint.ele;
+				time = trackPoint.hasOwnProperty('time') ? trackPoint.time :null;
+				trackSegement.push(new GpxWaypoint(trackPoint.$.lat, trackPoint.$.lon, elevation, time));
+			}
+
+			trackSegments.push(trackSegement);
+		}
+
+		tracks.push(new GpxTrack(trackSegments, trackName));
+	}
+
+	return tracks;
+};
+
+/**
+ * Parses v1.0 data into data structure
+ */
+var _ParseV10 = function(gpx) {
+
+	var extent = null,
+		metadata = null;
+
+	extent = new GpxExtent();
+	metadata = new GpxMetaData(gpx.$.creator, gpx.time, extent);
+
+	return new GpxResult(metadata, _getWayPoints(gpx.wpt), _getRoutes(gpx.rte), _getTracks(gpx.trk));
+};
+
+var _ParseV11 = function(gpx) {
+	var metadata,
+			time;
+	if (gpx.metadata && gpx.metadata[0]) {
+		if (gpx.metadata[0].time) {
+			time = gpx.metadata[0].time[0];
+		}
+		metadata = new GpxMetaData(gpx.$.creator, time);
+	} else {
+		metadata = new GpxMetaData();
+	}
+
+	return new GpxResult(metadata, _getWayPoints(gpx.wpt), _getRoutes(gpx.rte), _getTracks(gpx.trk));
+};
+
+/**
+ * Parses gpx passed in as String
+ * @param {string} gpxString gpxData passed in as string
+ * @param {gpxParseCompleteCallback} callback Callback function to call when parse has completed.
+ */
+exports.parseGpx = function(gpxString, callback) {
+
+	var parseString = require('xml2js').parseString,
+		gpxResult = null,
+		version = null;
+
+	parseString(gpxString, function(error, data) {
+		if (error) {
+			callback(error, null);
+			return;
+		}
+
+		version = data.gpx.$.version;
+		if (version === "1.0") {
+			gpxResult = _ParseV10(data.gpx);
+		} else if (version === "1.1") {
+			gpxResult = _ParseV11(data.gpx);
+		} else {
+			callback(new Error("version not supported"), null);
+			return;
+		}
+
+		callback(null, gpxResult);
+	});
+};
+
+
+/**
+ * Parse gpx from a file
+ * @param {string} gpxFile Path to gpx file you want to parse
+ * @param {gpxParseCompleteCallback} callback Callback function to call when parse has completed.
+ */
+exports.parseGpxFromFile = function(gpxFile, callback) {
+
+	fs.readFile(gpxFile, function(error, file) {
+
+		if (error) {
+			console.log("error");
+			callback(error, null);
+			return;
+		}
+
+		exports.parseGpx(file, callback);
+	});
+};
+
+/**
+ * Fetch a remote GPX file via HTTP(S) and parse it.
+ * @param {string} uri The URI of the remote gpx file.
+ * @param {gpxParseCompleteCallback} callback Callback function to call when parse has completed.
+ *
+ */
+exports.parseRemoteGpxFile = function parseRemoteGpxFile (uri, callback) {
+    assert.equal(typeof uri, 'string', 'uri should be a string');
+    assert.equal(typeof callback, 'function', 'callback should be a function');
+
+    function onError (err) {
+        return callback(new Error('failed to fetch gpx file: ' + err.toString()));
+    }
+
+    function onResponse (res) {
+        var body = '';
+
+        res.on('data', function (data) {
+            body = body + data;
+        });
+
+        res.once('end', function () {
+            exports.parseGpx(body, callback);
+        });
+    }
+
+    (('https:' === url.parse(uri).protocol) ? https : http)
+        .get(uri, onResponse)
+        .once('error', onError);
+};
+
+//expose objects
+exports.GpxResult = GpxResult;
+exports.GpxExtent = GpxExtent;
+exports.GpxWaypoint = GpxWaypoint;
+exports.GpxTrack = GpxTrack;
+exports.GpxMetaData = GpxMetaData;
+exports.GpxRoute = GpxRoute;
+exports.utils = geomUtils;
+
+/**
+ * Callback when gpx result has been processed.
+ * @callback gpxParseCompleteCallback
+ * @param {Object} error If an error has occurred the error otherwise null
+ * @param {GpxResult} response The parsed gpx file object
+ */
+
+
+
+ + + + +
+ + + +
+ +
+ Documentation generated by JSDoc 3.2.2 on Wed Aug 13 2014 09:19:33 GMT+0100 (BST) +
+ + + + + diff --git a/www/js/gpx-parse/doc/gpxExtent.js.html b/www/js/gpx-parse/doc/gpxExtent.js.html new file mode 100644 index 0000000..dac9974 --- /dev/null +++ b/www/js/gpx-parse/doc/gpxExtent.js.html @@ -0,0 +1,84 @@ + + + + + JSDoc: Source: gpxExtent.js + + + + + + + + + + +
+ +

Source: gpxExtent.js

+ + + + + +
+
+
/**
+* Contructor for gpx extent
+* @classdesc Stores an extent.
+* @class
+* @param {number} minx The minimum x value
+* @param {number} miny The minimum y value
+* @param {number} maxx The maximum x value
+* @param {number} miny The maximum y value
+*/
+function GpxExtent(minx, miny, maxx, maxy) {
+
+	minx = minx || -1;
+	miny = miny || -1;
+	maxx = maxx || -1;
+	maxy = maxy || -1;
+
+	this.__defineGetter__("minx", function() {
+		return minx;
+	});
+
+	this.__defineGetter__("miny", function() {
+		return miny;
+	});
+
+	this.__defineGetter__("maxx", function() {
+		return maxx;
+	});
+
+	this.__defineGetter__("maxy", function() {
+		return maxy;
+	});
+}
+
+module.exports = GpxExtent;
+
+
+
+ + + + +
+ + + +
+ +
+ Documentation generated by JSDoc 3.2.2 on Wed Aug 13 2014 09:19:33 GMT+0100 (BST) +
+ + + + + diff --git a/www/js/gpx-parse/doc/gpxMetaData.js.html b/www/js/gpx-parse/doc/gpxMetaData.js.html new file mode 100644 index 0000000..aa61078 --- /dev/null +++ b/www/js/gpx-parse/doc/gpxMetaData.js.html @@ -0,0 +1,103 @@ + + + + + JSDoc: Source: gpxMetaData.js + + + + + + + + + + +
+ +

Source: gpxMetaData.js

+ + + + + +
+
+
/**
+ * Contructor for the gpx metadata class
+ * @class
+ * @classdesc Stores all the metadata associated with the gpx file.
+ * @param {string} creator The creator of the gpx file.
+ * @param {string} time The string representation of the datetime from the file.
+ */
+function GpxMetaData(creator, time, bounds, name, desc, author, copyright, links, keywords) {
+
+	creator = creator || null;
+	time = new Date(time) || null;
+	bounds = bounds || null;
+	name = name || "";
+	desc = desc || "";
+
+	this.__defineGetter__("creator", function() {
+		return creator;
+	});
+
+	this.__defineGetter__("time", function() {
+		return time;
+	});
+
+	this.__defineGetter__("bounds", function() {
+		return bounds;
+	});
+
+	this.__defineGetter__("name", function() {
+		return name;
+	});
+
+	this.__defineGetter__("description", function() {
+		return desc;
+	});
+
+	this.__defineGetter__("author", function() {
+		return author;
+	});
+
+	this.__defineGetter__("copyright", function() {
+		return copyright;
+	});
+
+	this.__defineGetter__("links", function() {
+		return links;
+	});
+
+	this.__defineGetter__("keywords", function() {
+		return keywords;
+	});
+}
+
+module.exports = GpxMetaData;
+
+
+
+ + + + +
+ + + +
+ +
+ Documentation generated by JSDoc 3.2.2 on Wed Aug 13 2014 09:19:33 GMT+0100 (BST) +
+ + + + + diff --git a/www/js/gpx-parse/doc/gpxResult.js.html b/www/js/gpx-parse/doc/gpxResult.js.html new file mode 100644 index 0000000..01bac49 --- /dev/null +++ b/www/js/gpx-parse/doc/gpxResult.js.html @@ -0,0 +1,87 @@ + + + + + JSDoc: Source: gpxResult.js + + + + + + + + + + +
+ +

Source: gpxResult.js

+ + + + + +
+
+
/**
+ * Constructor for GpxResult
+ * @class
+ * @classdesc Holds the results of the gpx parse
+ * @param {GpxMetaData} metadata The metadata associated with the gpx trace
+ * @param {Array.<GpxWaypoint>} waypoints An array of waypoints.
+ * @param {Array.<GpxRoute>} routes An array of routes.
+ * @param {Array.<GpxTrack>} tracks An array of tracks.
+ */
+function GpxResult(metadata, waypoints, routes, tracks) {
+
+	metadata = metadata || null;
+	waypoints = waypoints || null;
+	routes = routes || null;
+	tracks = tracks || null;
+
+
+	this.__defineGetter__("metadata", function() {
+		return metadata;
+	});
+
+	this.__defineGetter__("waypoints", function() {
+		return waypoints;
+	});
+
+	this.__defineGetter__("routes", function() {
+		return routes;
+	});
+
+	this.__defineGetter__("tracks", function() {
+		return tracks;
+	});
+}
+
+
+
+module.exports = GpxResult;
+
+
+
+ + + + +
+ + + +
+ +
+ Documentation generated by JSDoc 3.2.2 on Wed Aug 13 2014 09:19:33 GMT+0100 (BST) +
+ + + + + diff --git a/www/js/gpx-parse/doc/gpxRoute.js.html b/www/js/gpx-parse/doc/gpxRoute.js.html new file mode 100644 index 0000000..8bb0da7 --- /dev/null +++ b/www/js/gpx-parse/doc/gpxRoute.js.html @@ -0,0 +1,90 @@ + + + + + JSDoc: Source: gpxRoute.js + + + + + + + + + + +
+ +

Source: gpxRoute.js

+ + + + + +
+
+

+/**
+* Constructs a gpx route.
+* @class
+* @classdesc represents a route, an ordered list of waypoints representing a series of turn points leading to a destination.
+* @param {string} name The name of the route.
+* @param {string} cmt A comment regarding the route.
+* @param {string} desc A description of the route.
+* @param {object[]} points An array of waypoints representing the route.
+**/
+function GpxRoute(name, cmt, desc, points) {
+
+	name = name || "";
+	desc = desc || "";
+	cmt = cmt || "";
+	points = points || [];
+
+	this.__defineGetter__("name", function() {
+		return name;
+	});
+
+	this.__defineGetter__("cmt", function() {
+		return cmt;
+	});
+
+	this.__defineGetter__("description", function() {
+		return desc;
+	});
+
+	this.__defineGetter__("points", function() {
+		return points;
+	});
+
+	this.point = function(index) {
+		return points[index];
+	};
+
+}
+
+module.exports = GpxRoute;
+
+
+
+ + + + +
+ + + +
+ +
+ Documentation generated by JSDoc 3.2.2 on Wed Aug 13 2014 09:19:33 GMT+0100 (BST) +
+ + + + + diff --git a/www/js/gpx-parse/doc/gpxTrack.js.html b/www/js/gpx-parse/doc/gpxTrack.js.html new file mode 100644 index 0000000..7690119 --- /dev/null +++ b/www/js/gpx-parse/doc/gpxTrack.js.html @@ -0,0 +1,103 @@ + + + + + JSDoc: Source: gpxTrack.js + + + + + + + + + + +
+ +

Source: gpxTrack.js

+ + + + + +
+
+
var geomUtils = require('./geomUtils');
+
+/**
+* Constructs a gpx track.
+* @class
+* @classdesc Holds an instance of a gpx track
+* @param {object[]} segments The segments of the track
+* @param {String} name The name of the Track
+**/
+function GpxTrack(segments, name) {
+
+	segments = segments || [];
+	name = name || "";
+
+
+	this.__defineGetter__("name", function() {
+		return name;
+	});
+
+	this.__defineGetter__("segments", function() {
+		return segments;
+	});
+
+	/**
+	 * Gets a segment of the track.
+	**/
+	this.segment = function(index) {
+		return segments[index];
+	};
+
+	/**
+	 * Calculates the total length of all the segments within the track
+	**/
+	this.length = function() {
+		var total = 0,
+				currentSegment = null;
+
+		for (var i=0, il= segments.length; i<il; i++) {
+			currentSegment = segments[i];
+			if (currentSegment.length > 1) {
+				for (var j=0, jl = currentSegment.length -1; j<jl; j++) {
+					console.log("points", currentSegment.length);
+					total += geomUtils.calculateDistance(currentSegment[j].lat,currentSegment[j].lon,currentSegment[j+1].lat,currentSegment[j+1].lon );
+				}
+			}
+		}
+
+		return total;
+	};
+
+}
+
+module.exports = GpxTrack;
+
+
+
+ + + + +
+ + + +
+ +
+ Documentation generated by JSDoc 3.2.2 on Wed Aug 13 2014 09:19:33 GMT+0100 (BST) +
+ + + + + diff --git a/www/js/gpx-parse/doc/gpxWaypoint.js.html b/www/js/gpx-parse/doc/gpxWaypoint.js.html new file mode 100644 index 0000000..db9da67 --- /dev/null +++ b/www/js/gpx-parse/doc/gpxWaypoint.js.html @@ -0,0 +1,169 @@ + + + + + JSDoc: Source: gpxWaypoint.js + + + + + + + + + + +
+ +

Source: gpxWaypoint.js

+ + + + + +
+
+
/**
+ * Constructs a gpx waypoint.
+ * @class
+ * @classdesc Represents a waypoint, point of interest, or named feature on a map.
+ * @param {number} lat The latitude of the waypoint.
+ * @param {number} lon The longtitude of the waypoint.
+ * @param {number} elevation of the waypoint.
+ * @param {string} time The time at the waypoint.
+ * @param {number} magvar The magnetic variation at the waypoint.
+ * @param {number} geoidheight The geoid height at the waypoint.
+ * @param {string} name The name of the waypoint.
+ * @param {string} cmt A comment regarding the waypoint.
+ * @param {string} desc A description of the waypoint.
+ * @param {string} src The source of the waypoint.
+ * @param {string[]} links An array of links for the waypoint.
+ * @param {string} sym The symbol of the waypoint.
+ * @param {string} type The type of waypoint.
+ **/
+function GpxWaypoint(lat, lon, elevation, time, magvar, geoidheight, name, cmt, desc, src, links, sym, type) {
+
+	lat = parseFloat(lat) || -1;
+	lon = parseFloat(lon) || -1;
+	elevation = elevation || -1;
+	time = new Date(time) || null;
+	name = name || "";
+	cmt = cmt || "";
+	desc = desc || "";
+	src = src || "";
+	type = type || "";
+
+	/**
+	 * Name of the Waypoint
+	 * @name name
+	 * @memberOf GpxWaypoint
+	 * @instance
+	 * @type {string}
+	**/
+	this.__defineGetter__("name", function() {
+		return name;
+	});
+
+	/**
+	* cmt of the Waypoint
+	* @name cmt
+	* @memberOf GpxWaypoint
+	* @instance
+	* @type {string}
+	**/
+	this.__defineGetter__("cmt", function() {
+		return cmt;
+	});
+
+	/**
+	* Description of the Waypoint
+	* @name desc
+	* @memberOf GpxWaypoint
+	* @instance
+	* @type {string}
+	**/
+	this.__defineGetter__("desc", function() {
+		return desc;
+	});
+
+	this.__defineGetter__("src", function() {
+		return src;
+	});
+
+	this.__defineGetter__("type", function() {
+		return type;
+	});
+
+	/**
+	* Latitude of the Waypoint
+	* @name lat
+	* @memberOf GpxWaypoint
+	* @instance
+	* @type {Number}
+	**/
+	this.__defineGetter__("lat", function() {
+		return lat;
+	});
+
+	/**
+	* Longtitude of the Waypoint
+	* @name lon
+	* @memberOf GpxWaypoint
+	* @instance
+	* @type {Number}
+	**/
+	this.__defineGetter__("lon", function() {
+		return lon;
+	});
+
+
+	/**
+	* Elevation at the Waypoint
+	* @name elevation
+	* @memberOf GpxWaypoint
+	* @instance
+	* @type {Number}
+	**/
+	this.__defineGetter__("elevation", function() {
+		return elevation;
+	});
+
+
+	/**
+	* Time associated with the Waypoint
+	* @name time
+	* @memberOf GpxWaypoint
+	* @instance
+	* @type {Date}
+	**/
+	this.__defineGetter__("time", function() {
+		return time;
+	});
+}
+
+module.exports = GpxWaypoint;
+
+
+
+ + + + +
+ + + +
+ +
+ Documentation generated by JSDoc 3.2.2 on Wed Aug 13 2014 09:19:33 GMT+0100 (BST) +
+ + + + + diff --git a/www/js/gpx-parse/doc/index.html b/www/js/gpx-parse/doc/index.html new file mode 100644 index 0000000..8467abb --- /dev/null +++ b/www/js/gpx-parse/doc/index.html @@ -0,0 +1,91 @@ + + + + + JSDoc: Index + + + + + + + + + + +
+ +

Index

+ + + + + + + +

+ + + + + + + + + + + + + + +
+

gpx-parse NPM Version Build Status Coverage Status Code Climate

+

A library for parsing gpx data. Still in its infancy. Works against most/some of the Gpx v1.0 spec and Gpx v1.1. Looking to support whole spec eventually. Feel free to fork if you need something specific.

+

More information available on the Project Page

+

Installation

+
$ npm install gpx-parse
+

Usage

+
var gpxParse = require("gpx-parse");
+
+//from file
+gpxParse.parseGpxFromFile("/path/to/gpxFile", function(error, data) {
+    //do stuff
+});
+
+//or from string
+gpxParse.parseGpx("<gpx></gpx>", function(error, data) {
+    //do stuff
+});
+
+// or an external file via HTTP(S)
+gpxParse.parseRemoteGpxFile("http://host.tld/my.gpx", function(error, data) {
+    //do stuff
+});
+

Tests

+

Tests are written with nodeunit. To test make sure you have the dev dependencies installed and just run:

+
$ npm test
+
+ + + + + + +
+ + + +
+ +
+ Documentation generated by JSDoc 3.2.2 on Wed Aug 13 2014 09:19:33 GMT+0100 (BST) +
+ + + + + \ No newline at end of file diff --git a/www/js/gpx-parse/doc/module-geomutils.html b/www/js/gpx-parse/doc/module-geomutils.html new file mode 100644 index 0000000..f4ff83b --- /dev/null +++ b/www/js/gpx-parse/doc/module-geomutils.html @@ -0,0 +1,401 @@ + + + + + JSDoc: Module: geomutils + + + + + + + + + + +
+ +

Module: geomutils

+ + + + + +
+ +
+

+ geomutils +

+ +
+ +
+
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+

<static> calculateDistance(lat1, lon1, lat2, lon2) → {number}

+ + +
+
+ + +
+ Calculates the distance between the two points using the haversine method. +
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
lat1 + + +number + + + + The latitude of the first point.
lon1 + + +number + + + + The longtitude of the first point.
lat2 + + +number + + + + The latitude of the first point.
lon2 + + +number + + + + The longtitude of the first point.
+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + +
Returns:
+ + +
+ The distance in miles between the two points. +
+ + + +
+
+ Type +
+
+ +number + + +
+
+ + + + +
+ + + +
+

<static> calculateMidpoint()

+ + +
+
+ + +
+ Calcuates the midpoint between the two points passed in. +
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ +
+ Documentation generated by JSDoc 3.2.2 on Wed Aug 13 2014 09:19:33 GMT+0100 (BST) +
+ + + + + \ No newline at end of file diff --git a/www/js/gpx-parse/doc/module-gpx-parse.html b/www/js/gpx-parse/doc/module-gpx-parse.html new file mode 100644 index 0000000..e7f256b --- /dev/null +++ b/www/js/gpx-parse/doc/module-gpx-parse.html @@ -0,0 +1,751 @@ + + + + + JSDoc: Module: gpx-parse + + + + + + + + + + +
+ +

Module: gpx-parse

+ + + + + +
+ +
+

+ gpx-parse +

+ +
+ +
+
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+

<static> parseGpx(gpxString, callback)

+ + +
+
+ + +
+ Parses gpx passed in as String +
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
gpxString + + +string + + + + gpxData passed in as string
callback + + +gpxParseCompleteCallback + + + + Callback function to call when parse has completed.
+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + +
+ + + +
+

<static> parseGpxFromFile(gpxFile, callback)

+ + +
+
+ + +
+ Parse gpx from a file +
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
gpxFile + + +string + + + + Path to gpx file you want to parse
callback + + +gpxParseCompleteCallback + + + + Callback function to call when parse has completed.
+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + +
+ + + +
+

<static> parseRemoteGpxFile(uri, callback)

+ + +
+
+ + +
+ Fetch a remote GPX file via HTTP(S) and parse it. +
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
uri + + +string + + + + The URI of the remote gpx file.
callback + + +gpxParseCompleteCallback + + + + Callback function to call when parse has completed.
+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + +
+ + + +
+

<inner> _getRoutes()

+ + +
+
+ + +
+ Parses routes into an array of route objects +
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + +
+ + + +
+

<inner> _getWayPoints()

+ + +
+
+ + +
+ Parses the waypoints into an array of waypoints. +
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + +
+ + + +
+

<inner> _ParseV10()

+ + +
+
+ + +
+ Parses v1.0 data into data structure +
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ +
+ Documentation generated by JSDoc 3.2.2 on Wed Aug 13 2014 09:19:33 GMT+0100 (BST) +
+ + + + + \ No newline at end of file diff --git a/www/js/gpx-parse/doc/scripts/linenumber.js b/www/js/gpx-parse/doc/scripts/linenumber.js new file mode 100644 index 0000000..613865d --- /dev/null +++ b/www/js/gpx-parse/doc/scripts/linenumber.js @@ -0,0 +1,17 @@ +(function() { + var counter = 0; + var numbered; + var source = document.getElementsByClassName('prettyprint source'); + + if (source && source[0]) { + source = source[0].getElementsByTagName('code')[0]; + + numbered = source.innerHTML.split('\n'); + numbered = numbered.map(function(item) { + counter++; + return '' + item; + }); + + source.innerHTML = numbered.join('\n'); + } +})(); diff --git a/www/js/gpx-parse/doc/scripts/prettify/Apache-License-2.0.txt b/www/js/gpx-parse/doc/scripts/prettify/Apache-License-2.0.txt new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/www/js/gpx-parse/doc/scripts/prettify/Apache-License-2.0.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/www/js/gpx-parse/doc/scripts/prettify/lang-css.js b/www/js/gpx-parse/doc/scripts/prettify/lang-css.js new file mode 100644 index 0000000..041e1f5 --- /dev/null +++ b/www/js/gpx-parse/doc/scripts/prettify/lang-css.js @@ -0,0 +1,2 @@ +PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\f\r ]+/,null," \t\r\n "]],[["str",/^"(?:[^\n\f\r"\\]|\\(?:\r\n?|\n|\f)|\\[\S\s])*"/,null],["str",/^'(?:[^\n\f\r'\\]|\\(?:\r\n?|\n|\f)|\\[\S\s])*'/,null],["lang-css-str",/^url\(([^"')]*)\)/i],["kwd",/^(?:url|rgb|!important|@import|@page|@media|@charset|inherit)(?=[^\w-]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*)\s*:/i],["com",/^\/\*[^*]*\*+(?:[^*/][^*]*\*+)*\//],["com", +/^(?:<\!--|--\>)/],["lit",/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],["lit",/^#[\da-f]{3,6}/i],["pln",/^-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*/i],["pun",/^[^\s\w"']+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[["kwd",/^-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[["str",/^[^"')]+/]]),["css-str"]); diff --git a/www/js/gpx-parse/doc/scripts/prettify/prettify.js b/www/js/gpx-parse/doc/scripts/prettify/prettify.js new file mode 100644 index 0000000..eef5ad7 --- /dev/null +++ b/www/js/gpx-parse/doc/scripts/prettify/prettify.js @@ -0,0 +1,28 @@ +var q=null;window.PR_SHOULD_USE_CONTINUATION=!0; +(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),a= +[],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;ci[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m), +l=[],p={},d=0,g=e.length;d=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/, +q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com",/^#[^\n\r]*/, +q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]);a=(""+a.keywords).replace(/^ | $/g, +"");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("BR"===a.nodeName)h(a), +a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e} +for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"], +"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"], +H=[G,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"], +J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+ +I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]), +["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css", +/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}), +["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes", +hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p=0){var k=k.match(g),f,b;if(b= +!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&"CODE"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName==="pre"||o.tagName==="code"||o.tagName==="xmp")&&o.className&&o.className.indexOf("prettyprint")>=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p} gpxWaypoints - The array of points from the xml + */ +var _getWayPoints = function(gpxWaypoints) { + var waypoints = []; + if (gpxWaypoints && gpxWaypoints.length) { + gpxWaypoints.forEach(function(wayPoint) { + var point = new GpxWaypoint(wayPoint.$.lat, wayPoint.$.lon, getFloat(wayPoint.ele), wayPoint.time, null, null, getString(wayPoint.name), null, getString(wayPoint.desc)); + waypoints.push(point); + }); + } + + return waypoints; +}; + +/** + * Parses routes into an array of route objects + */ +var _getRoutes = function(gpxRoutes) { + var routes = []; + + if (gpxRoutes && gpxRoutes.length) { + gpxRoutes.forEach(function(currentRoute) { + var routePoints = []; + + currentRoute.rtept.forEach(function(routePoint) { + routePoints.push(new GpxWaypoint(routePoint.$.lat, routePoint.$.lon)); + }); + + var route = new GpxRoute(gpxRoutes.name, gpxRoutes.cmt, gpxRoutes.desc, routePoints); + routes.push(route); + }); + } + + return routes; +}; + +/** + * Gets a float from an element + **/ +var getFloat = function(item) { + var value = null; + if (item && Array.isArray(item) && item.length > 0) { + value = parseFloat(item[0]); + } + return value; +}; + +/** + * Gets a string from an element + **/ +var getString = function(item) { + var value = null; + if (item && Array.isArray(item) && item.length > 0) { + value = item[0].toString(); + } + return value; +}; + +/** + * Grabs any tracks contained within the gpx + * @params {Object} gpxTracks - THe gpcx tracks from the file + **/ +var _getTracks = function(gpxTracks) { + var tracks = []; + + if (gpxTracks && gpxTracks.length) { + + gpxTracks.forEach(function(currentTrack) { + + var trackSegments = []; + + currentTrack.trkseg.forEach(function(currentSegment) { + var trackSegement = []; + + currentSegment.trkpt.forEach(function(trackPoint) { + var elevation = getFloat(trackPoint.ele); + trackSegement.push(new GpxWaypoint(trackPoint.$.lat, trackPoint.$.lon, elevation, trackPoint.time)); + }); + + trackSegments.push(trackSegement); + }); + + tracks.push(new GpxTrack(trackSegments, getString(currentTrack.name))); + }); + } + + return tracks; +}; + +/** + * Parses v1.0 data into data structure + */ +var _ParseV10 = function(gpx) { + + var extent = null, + metadata = null; + + extent = new GpxExtent(); + metadata = new GpxMetaData(gpx.$.creator, gpx.time, extent); + + return new GpxResult(metadata, _getWayPoints(gpx.wpt), _getRoutes(gpx.rte), _getTracks(gpx.trk)); +}; + +/** + * Parses v1.1 data into data structure + */ +var _ParseV11 = function(gpx) { + var metadata; + + if (gpx.metadata && gpx.metadata.length > 0) { + metadata = new GpxMetaData(gpx.$.creator, getString(gpx.metadata[0].time)); + } else { + metadata = new GpxMetaData(); + } + + return new GpxResult(metadata, _getWayPoints(gpx.wpt), _getRoutes(gpx.rte), _getTracks(gpx.trk)); +}; + +/** + * Parses gpx passed in as String + * @param {string} gpxString gpxData passed in as string + * @param {gpxParseCompleteCallback} callback Callback function to call when parse has completed. + */ +exports.parseGpx = function(gpxString, callback) { + + var parseString = require('xml2js').parseString, + gpxResult = null, + version = null; + + parseString(gpxString, function(error, data) { + if (error) { + callback(error, null); + return; + } + + try { + if (!data.gpx) return callback(new Error("version not specified"), null); + + version = data.gpx.$.version; + + switch (version) { + case "1.0": + gpxResult = _ParseV10(data.gpx); + break; + case "1.1": + gpxResult = _ParseV11(data.gpx); + break; + default: + return callback(new Error("version not supported"), null); + } + + callback(null, gpxResult); + + } catch (error) { + return callback(error); + } + }); +}; + + +/** + * Parse gpx from a file + * @param {string} gpxFile Path to gpx file you want to parse + * @param {gpxParseCompleteCallback} callback Callback function to call when parse has completed. + */ +exports.parseGpxFromFile = function(gpxFile, callback) { + + fs.readFile(gpxFile, function(error, file) { + + if (error) { + console.log("error"); + callback(error, null); + return; + } + + exports.parseGpx(file, callback); + }); +}; + +/** + * Fetch a remote GPX file via HTTP(S) and parse it. + * @param {string} uri The URI of the remote gpx file. + * @param {gpxParseCompleteCallback} callback Callback function to call when parse has completed. + * + */ +exports.parseRemoteGpxFile = function parseRemoteGpxFile (uri, callback) { + assert.equal(typeof uri, 'string', 'uri should be a string'); + assert.equal(typeof callback, 'function', 'callback should be a function'); + + function onError (err) { + return callback(new Error('failed to fetch gpx file: ' + err.toString())); + } + + function onResponse (res) { + var body = ''; + + res.on('data', function (data) { + body = body + data; + }); + + res.once('end', function () { + exports.parseGpx(body, callback); + }); + } + + (('https:' === url.parse(uri).protocol) ? https : http) + .get(uri, onResponse) + .once('error', onError); +}; + +//expose objects +exports.GpxResult = GpxResult; +exports.GpxExtent = GpxExtent; +exports.GpxWaypoint = GpxWaypoint; +exports.GpxTrack = GpxTrack; +exports.GpxMetaData = GpxMetaData; +exports.GpxRoute = GpxRoute; +exports.utils = geomUtils; + +/** + * Callback when gpx result has been processed. + * @callback gpxParseCompleteCallback + * @param {Object} error If an error has occurred the error otherwise null + * @param {GpxResult} response The parsed gpx file object + */ diff --git a/www/js/gpx-parse/lib/gpxExtent.js b/www/js/gpx-parse/lib/gpxExtent.js new file mode 100644 index 0000000..ea8f97c --- /dev/null +++ b/www/js/gpx-parse/lib/gpxExtent.js @@ -0,0 +1,34 @@ +/** +* Contructor for gpx extent +* @classdesc Stores an extent. +* @class +* @param {number} minx The minimum x value +* @param {number} miny The minimum y value +* @param {number} maxx The maximum x value +* @param {number} miny The maximum y value +*/ +function GpxExtent(minx, miny, maxx, maxy) { + + minx = minx || -1; + miny = miny || -1; + maxx = maxx || -1; + maxy = maxy || -1; + + this.__defineGetter__("minx", function() { + return minx; + }); + + this.__defineGetter__("miny", function() { + return miny; + }); + + this.__defineGetter__("maxx", function() { + return maxx; + }); + + this.__defineGetter__("maxy", function() { + return maxy; + }); +} + +module.exports = GpxExtent; diff --git a/www/js/gpx-parse/lib/gpxMetaData.js b/www/js/gpx-parse/lib/gpxMetaData.js new file mode 100644 index 0000000..2e393d9 --- /dev/null +++ b/www/js/gpx-parse/lib/gpxMetaData.js @@ -0,0 +1,53 @@ +/** + * Contructor for the gpx metadata class + * @class + * @classdesc Stores all the metadata associated with the gpx file. + * @param {string} creator The creator of the gpx file. + * @param {string} time The string representation of the datetime from the file. + */ +function GpxMetaData(creator, time, bounds, name, desc, author, copyright, links, keywords) { + + creator = creator || null; + time = new Date(time) || null; + bounds = bounds || null; + name = name || ""; + desc = desc || ""; + + this.__defineGetter__("creator", function() { + return creator; + }); + + this.__defineGetter__("time", function() { + return time; + }); + + this.__defineGetter__("bounds", function() { + return bounds; + }); + + this.__defineGetter__("name", function() { + return name; + }); + + this.__defineGetter__("description", function() { + return desc; + }); + + this.__defineGetter__("author", function() { + return author; + }); + + this.__defineGetter__("copyright", function() { + return copyright; + }); + + this.__defineGetter__("links", function() { + return links; + }); + + this.__defineGetter__("keywords", function() { + return keywords; + }); +} + +module.exports = GpxMetaData; diff --git a/www/js/gpx-parse/lib/gpxResult.js b/www/js/gpx-parse/lib/gpxResult.js new file mode 100644 index 0000000..7d68254 --- /dev/null +++ b/www/js/gpx-parse/lib/gpxResult.js @@ -0,0 +1,37 @@ +/** + * Constructor for GpxResult + * @class + * @classdesc Holds the results of the gpx parse + * @param {GpxMetaData} metadata The metadata associated with the gpx trace + * @param {Array.} waypoints An array of waypoints. + * @param {Array.} routes An array of routes. + * @param {Array.} tracks An array of tracks. + */ +function GpxResult(metadata, waypoints, routes, tracks) { + + metadata = metadata || null; + waypoints = waypoints || null; + routes = routes || null; + tracks = tracks || null; + + + this.__defineGetter__("metadata", function() { + return metadata; + }); + + this.__defineGetter__("waypoints", function() { + return waypoints; + }); + + this.__defineGetter__("routes", function() { + return routes; + }); + + this.__defineGetter__("tracks", function() { + return tracks; + }); +} + + + +module.exports = GpxResult; diff --git a/www/js/gpx-parse/lib/gpxRoute.js b/www/js/gpx-parse/lib/gpxRoute.js new file mode 100644 index 0000000..b015fea --- /dev/null +++ b/www/js/gpx-parse/lib/gpxRoute.js @@ -0,0 +1,54 @@ +var geomUtils = require('./geomUtils'); + +/** +* Constructs a gpx route. +* @class +* @classdesc represents a route, an ordered list of waypoints representing a series of turn points leading to a destination. +* @param {string} name The name of the route. +* @param {string} cmt A comment regarding the route. +* @param {string} desc A description of the route. +* @param {object[]} points An array of waypoints representing the route. +**/ +function GpxRoute(name, cmt, desc, points) { + + name = name || ""; + desc = desc || ""; + cmt = cmt || ""; + points = points || []; + + this.__defineGetter__("name", function() { + return name; + }); + + this.__defineGetter__("cmt", function() { + return cmt; + }); + + this.__defineGetter__("description", function() { + return desc; + }); + + this.__defineGetter__("points", function() { + return points; + }); + + this.point = function(index) { + return points[index]; + }; + + /** + * Calculates the length of the route + **/ + this.length = function() { + var total = 0; + + for (var j=0, jl = points.length -1; j 1) { + for (var j=0, jl = currentSegment.length -1; j', + '', + '', + '', + 'Garmin International', + '', + '', + '', + '', + 'Example GPX Document', + '', + '', + '4.46', + '', + '', + '', + '4.94', + '', + '', + '', + '6.87', + '', + '', + '', + '', + '' + ].join("\n"); + +module.exports = { + setUp: function(callback) { + + //mock the file system + this.fsMock = {}; + this.gpxParse = SandboxedModule.require("../", { + "requires": { + "fs": this.fsMock + } + + }); + + callback(); + }, + + tearDown: function(callback) { + // clean up + callback(); + }, + + "Should error returned when invalid gpx version": function(test) { + this.gpxParse.parseGpx(errorGpx, function(error, result) { + test.notEqual(error, null); + test.equal(error.message, "version not supported"); + test.done(); + }); + }, + + "Should error gracefully with malformed gpx" : function(test) { + this.gpxParse.parseGpx(" <<", function(error, result) { + test.notEqual(error, null); + test.done(); + }); + } +}; \ No newline at end of file diff --git a/www/js/gpx-parse/tests/gpx-v1.0-tests.js b/www/js/gpx-parse/tests/gpx-v1.0-tests.js new file mode 100644 index 0000000..49c8005 --- /dev/null +++ b/www/js/gpx-parse/tests/gpx-v1.0-tests.js @@ -0,0 +1,149 @@ +var gpxParse = require("../"), + errorGpx = "", + successfulGpx = ['', + '', + '', + '', + '', + '44.586548', + '', + '5066', + '', + 'Crossing', + '', + '', + '', + '57.607200', + '', + '5067', + '', + 'Dot', + '', + '', + '', + 'BELLEVUE', + '', + '1', + '', + '23.469600', + '', + 'BELLEVUE', + 'BELLEVUE', + '', + 'Parking Area', + '', + '', + '', + '26.561890', + '', + 'GATE6', + '', + 'Trailhead', + '', + '', + '', + ' 45.307495', + ' ', + 'PANTHRCAVE', + '', + 'Tunnel', + '', + '', + '', + '37.616943', + '', + '6014MEADOW', + '', + 'Dot', + '', + '', + '', + '', + 'Example Track', + '', + '', + '4.46', + '', + '', + '', + '4.94', + '', + '', + '', + '6.87', + '', + '', + '', + '', + '' + ].join('\n'); + + + +module.exports = { + setUp: function(callback) { + callback(); + }, + tearDown: function(callback) { + // clean up + callback(); + }, + + + "Test that valid gpx string is parsed successfully": function(test) { + gpxParse.parseGpx(successfulGpx, function(error, result) { + + test.equal(error, null); + test.equal(result.metadata.creator, "ExpertGPS 1.1 - http://www.topografix.com"); + test.equal(result.metadata.time.getTime(), 1014830313000); + test.equal(result.waypoints.length, 2); + test.equal(result.waypoints[0].lat, 42.438878); + test.equal(result.waypoints[1].lon, -71.119689); + test.equal(result.routes.length, 1); + test.equal(result.routes[0].points.length, 4); + test.equal(result.routes[0].point(0).lat, 42.43095); + test.equal(result.routes[0].point(0).lon, -71.107628); + test.equal(result.tracks.length, 1); + test.equal(result.tracks[0].segments.length, 1); + test.equal(result.tracks[0].segments[0].length, 3); + test.equal(result.tracks[0].length(), 0.026086132059687486); + test.equal(result.routes[0].length(), 0.8891610318632928); + test.done(); + }); + + }, + + "Test that you can load in just waypoints": function(test) { + var wayPointGpx = ['', + '', + '', + '', + '', + '44.586548', + '', + '5066', + '', + 'Crossing', + '', + '', + ''].join(''); + + gpxParse.parseGpx(wayPointGpx, function(err, result) { + + test.equal(err, null); + test.equal(result.tracks.length, 0); + test.equal(result.routes.length, 0); + test.equal(result.waypoints.length, 1); + test.equal(result.waypoints[0].name, "5066"); + test.done(); + }); + } +}; diff --git a/www/js/gpx-parse/tests/gpx-v1.1-tests.js b/www/js/gpx-parse/tests/gpx-v1.1-tests.js new file mode 100644 index 0000000..89774d7 --- /dev/null +++ b/www/js/gpx-parse/tests/gpx-v1.1-tests.js @@ -0,0 +1,83 @@ +var gpxParse = require("../"), + successfulGpx = ['', + '', + '', + '', + 'Garmin International', + '', + '', + '', + '', + 'Example GPX Document', + '', + '', + '4.46', + '', + '', + '', + '4.94', + '', + '', + '', + '6.87', + '', + '', + '', + '', + '' + ].join("\n"); + +module.exports = { + setUp: function(callback) { + + //mock the file syste + + callback(); + }, + + tearDown: function(callback) { + // clean up + callback(); + }, + + + + "Test that valid gpx string is parsed successfully": function(test) { + gpxParse.parseGpx(successfulGpx, function(error, result) { + test.equal(result.metadata.creator, "Oregon 400t"); + test.equal(result.metadata.time.getTime(), 1255820323000); + test.equal(result.tracks.length, 1); + test.equal(result.tracks[0].name, 'Example GPX Document'); + test.equal(result.tracks[0].segments[0][0].time, new Date('2009-10-17T18:37:26Z').toString()); + test.equal(result.tracks[0].segments[0][0].elevation, 4.46); + test.done(); + }); + + }, + + "Should return an error when file does not exist" : function(test) { + gpxParse.parseGpxFromFile("/path/to/incorrect/gpxFile.gpx", function(error, result) { + test.notEqual(null, error); + test.equal(error.message.indexOf('ENOENT'), 0); + test.done(); + }); + }, + + "Test that valid gpx file is parsed successfully": function(test) { + + //this.fsMock.open = function(path, flags, callback) { + // callback(null, successfulGpx); + //} + + //this.gpxParse.parseGpxFromFile("/path/to/gpxFile.gpx", function(error, result) { + test.done(); + //}); + + } +}; diff --git a/www/js/gpx-parse/tests/integration/data/route-1.1.gpx b/www/js/gpx-parse/tests/integration/data/route-1.1.gpx new file mode 100644 index 0000000..18f9c80 --- /dev/null +++ b/www/js/gpx-parse/tests/integration/data/route-1.1.gpx @@ -0,0 +1,30991 @@ + + + + 2014-05-10 Running_08-21-55.gpx + + + RUNNING + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 3 + + + + 4 + + + + 4 + + + + 3 + + + + 4 + + + + 4 + + + + 3 + + + + 4 + + + + 4 + + + + 4 + + + + 3 + + + + 4 + + + + 3 + + + + 4 + + + + 3 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 1 + + + + 1 + + + + 1 + + + + 0 + + + + 1 + + + + 1 + + + + 0 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 0 + + + + 1 + + + + 1 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 23 + + + + 23 + + + + 23 + + + + 23 + + + + 23 + + + + 23 + + + + 23 + + + + 23 + + + + 23 + + + + 23 + + + + 23 + + + + 24 + + + + 24 + + + + 24 + + + + 24 + + + + 24 + + + + 24 + + + + 24 + + + + 24 + + + + 24 + + + + 24 + + + + 24 + + + + 24 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 27 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 27 + + + + 28 + + + + 27 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 26 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 29 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 38 + + + + 38 + + + + 38 + + + + 38 + + + + 38 + + + + 38 + + + + 38 + + + + 38 + + + + 38 + + + + 38 + + + + 38 + + + + 38 + + + + 38 + + + + 38 + + + + 38 + + + + 38 + + + + 38 + + + + 38 + + + + 38 + + + + 38 + + + + 38 + + + + 38 + + + + 38 + + + + 38 + + + + 38 + + + + 38 + + + + 38 + + + + 38 + + + + 38 + + + + 38 + + + + 38 + + + + 38 + + + + 38 + + + + 38 + + + + 38 + + + + 38 + + + + 38 + + + + 38 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 37 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 36 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 35 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 34 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 33 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 32 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 31 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 30 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 29 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 28 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 27 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 26 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 25 + + + + 24 + + + + 24 + + + + 24 + + + + 24 + + + + 24 + + + + 24 + + + + 24 + + + + 24 + + + + 24 + + + + 24 + + + + 24 + + + + 24 + + + + 24 + + + + 24 + + + + 24 + + + + 24 + + + + 24 + + + + 24 + + + + 24 + + + + 23 + + + + 23 + + + + 23 + + + + 23 + + + + 23 + + + + 23 + + + + 23 + + + + 23 + + + + 23 + + + + 23 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 22 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 15 + + + + 15 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 7 + + + + 7 + + + + 8 + + + + 7 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 10 + + + + 10 + + + + 10 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 12 + + + + 12 + + + + 12 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 21 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 19 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 20 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 19 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 18 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 17 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 16 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 15 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 8 + + + + 7 + + + + 7 + + + + 8 + + + + 8 + + + + 7 + + + + 7 + + + + 8 + + + + 7 + + + + 8 + + + + 8 + + + + 7 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 8 + + + + 7 + + + + 7 + + + + 8 + + + + 7 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 7 + + + + 7 + + + + 6 + + + + 7 + + + + 7 + + + + 6 + + + + 6 + + + + 7 + + + + 6 + + + + 6 + + + + 6 + + + + 7 + + + + 7 + + + + 6 + + + + 7 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 3 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 4 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 5 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 6 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 7 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 11 + + + + 10 + + + + 11 + + + + 10 + + + + 10 + + + + 10 + + + + 11 + + + + 10 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 10 + + + + 11 + + + + 11 + + + + 11 + + + + 10 + + + + 10 + + + + 11 + + + + 10 + + + + 10 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 14 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 13 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 12 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 11 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 10 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 9 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + 8 + + + + + diff --git a/www/js/gpx-parse/tests/integration/gxx-integration-tests.js b/www/js/gpx-parse/tests/integration/gxx-integration-tests.js new file mode 100644 index 0000000..43a17ee --- /dev/null +++ b/www/js/gpx-parse/tests/integration/gxx-integration-tests.js @@ -0,0 +1,22 @@ +var gpxParse = require("../../"); + +module.exports = { + + setUp: function(callback) { + callback(); + }, + tearDown: function(callback) { + // clean up + callback(); + }, + + "Test that a gpx file can be loaded": function(test) { + gpxParse.parseGpxFromFile(__dirname + '/data/route-1.1.gpx', function(err, data) { + test.equal(data.metadata.time.toString(), 'Invalid Date'); + test.equal(data.metadata.creator, 'TomTom'); + test.equal(data.tracks.length, 1); + test.equal(data.tracks[0].name, 'RUNNING'); + test.done(); + }); + } +}; diff --git a/www/js/gpx-parse/tests/object-tests.js b/www/js/gpx-parse/tests/object-tests.js new file mode 100644 index 0000000..9947aaa --- /dev/null +++ b/www/js/gpx-parse/tests/object-tests.js @@ -0,0 +1,95 @@ +var gpxParse = require("../"), + GpxResult = gpxParse.GpxResult, + GpxWaypoint = gpxParse.GpxWaypoint, + GpxExtent = gpxParse.GpxExtent, + GpxMetaData = gpxParse.GpxMetaData, + GpxRoute = gpxParse.GpxRoute, + GpxTrack = gpxParse.GpxTrack; + +module.exports = { + + setUp: function(callback) { + callback(); + }, + tearDown: function(callback) { + // clean up + callback(); + }, + + "Test that the gpx result class can be initialized": function(test) { + + var gpxResult = null, + waypoints = [], + extent = new GpxExtent(1, 2, 3, 4), + routes = [ + [] + ], + tracks = [], + links = [], + metadata = new GpxMetaData("creator", "2002-02-27T17:18:33Z", extent, "name", "desc", "author", "copyright", links, "keywords"); + + gpxResult = new GpxResult(metadata, waypoints, routes, tracks); + + test.equal(gpxResult.metadata.creator, "creator"); + test.equal(gpxResult.metadata.time.getTime(), 1014830313000); + test.equal(gpxResult.metadata.bounds.minx, "1"); + test.done(); + }, + + "Should be able to create an instance of the metadata class": function(test) { + var extent = new GpxExtent(1, 2, 3, 4), + links = ["http://alink.com"]; + + var metadata = new GpxMetaData("creator", "2002-02-27T17:18:33Z", extent, "name", "desc", "author", "copyright", links, "keywords"); + + test.equal(metadata.creator, "creator"); + test.equal(metadata.time.getTime(), 1014830313000); + test.equal(metadata.bounds.minx, 1); + test.equal(metadata.name, "name"); + test.equal(metadata.description, "desc"); + test.equal(metadata.author, "author"); + test.equal(metadata.copyright, "copyright"); + test.equal(metadata.links.length, 1); + test.equal(metadata.links[0], "http://alink.com"); + test.equal(metadata.keywords, "keywords"); + test.done(); + }, + + "Test that the gpxWaypoint can be initialized": function(test) { + var gpxPoint = new GpxWaypoint(1, 2, 3, "2002-02-27T17:18:33Z",1,1,"name","cmt", "description"); + test.equal(gpxPoint.lat, 1); + test.equal(gpxPoint.lon, 2); + test.equal(gpxPoint.elevation, 3); + test.equal(gpxPoint.time.getTime(),1014830313000 ); + test.equal(gpxPoint.name, "name"); + test.equal(gpxPoint.cmt, "cmt"); + test.equal(gpxPoint.description, "description"); + test.done(); + }, + + "Test that the gpxRoute can be initialized": function(test) { + var gpxRoute = new GpxRoute("name", "cmt", "description", [new GpxWaypoint(1, 2), new GpxWaypoint(3, 4)]); + test.equal(gpxRoute.name, "name"); + test.equal(gpxRoute.cmt, "cmt"); + test.equal(gpxRoute.description, "description"); + test.done(); + }, + + "Test that the gpxTrack can be initialized": function(test) { + var gpxTrack = new GpxTrack([[new GpxWaypoint(1, 2), new GpxWaypoint(3, 4)],[new GpxWaypoint(5, 6), new GpxWaypoint(7, 8)]], "name"); + test.equal(gpxTrack.name, "name"); + test.equal(gpxTrack.segments.length, 2); + test.equal(gpxTrack.segment(0).length, 2); + test.done(); + }, + + "Test that the gpxExtent can be initialized": function(test) { + var gpxExtent = new GpxExtent(1, 2, 3, 4); + + test.equal(gpxExtent.minx, 1); + test.equal(gpxExtent.miny, 2); + test.equal(gpxExtent.maxx, 3); + test.equal(gpxExtent.maxy, 4); + test.done(); + } +}; diff --git a/www/js/gpx-parse/tests/utils-tests.js b/www/js/gpx-parse/tests/utils-tests.js new file mode 100644 index 0000000..494f45f --- /dev/null +++ b/www/js/gpx-parse/tests/utils-tests.js @@ -0,0 +1,23 @@ +var gpxParse = require("../"), + geomUtils = gpxParse.utils; + +module.exports = { + setUp: function(callback) { + callback(); + }, + tearDown: function(callback) { + // clean up + callback(); + }, + + "Should calculate the distance between two points": function(test) { + var distance = geomUtils.calculateDistance(4.367, 5.6745, -40.4556, 39.34345); + test.equal(distance, 6045.97811789512); + test.done(); + }, + + "Should calculate the midpoint between two points" : function(test) { + geomUtils.calculateMidpoint(4.367, 5.6745, -40.4556, 39.34345); + test.done(); + } +}; diff --git a/www/js/hammerjs/.bowerrc b/www/js/hammerjs/.bowerrc new file mode 100644 index 0000000..a3731bd --- /dev/null +++ b/www/js/hammerjs/.bowerrc @@ -0,0 +1,3 @@ +{ + "json": "bower.json" +} \ No newline at end of file diff --git a/www/js/hammerjs/.jscsrc b/www/js/hammerjs/.jscsrc new file mode 100644 index 0000000..168677b --- /dev/null +++ b/www/js/hammerjs/.jscsrc @@ -0,0 +1,95 @@ +{ + "excludeFiles": [ + "*.js", + "tests/**/assets", + "node_modules/**" + ], + "requireCurlyBraces": [ + "if", + "else", + "for", + "while", + "do", + "try", + "catch" + ], + "requireOperatorBeforeLineBreak": true, + "requireCamelCaseOrUpperCaseIdentifiers": true, + "maximumLineLength": { + "value": 120, + "allowComments": true, + "allowRegex": true + }, + "validateIndentation": 4, + "validateQuoteMarks": "'", + "disallowMultipleLineStrings": true, + "disallowMixedSpacesAndTabs": true, + "disallowTrailingWhitespace": true, + "disallowSpaceAfterPrefixUnaryOperators": true, + "requireSpaceAfterKeywords": [ + "if", + "else", + "for", + "while", + "do", + "switch", + "return", + "try", + "catch" + ], + "requireSpaceBeforeBinaryOperators": [ + "=", + "+=", + "-=", + "*=", + "/=", + "%=", + "<<=", + ">>=", + ">>>=", + "&=", + "|=", + "^=", + "+=", + "+", + "-", + "*", + "/", + "%", + "<<", + ">>", + ">>>", + "&", + "|", + "^", + "&&", + "||", + "===", + "==", + ">=", + "<=", + "<", + ">", + "!=", + "!==" + ], + "requireSpaceAfterBinaryOperators": true, + "requireSpacesInConditionalExpression": true, + "requireSpaceBeforeBlockStatements": true, + "requireLineFeedAtFileEnd": true, + "requireSpacesInFunctionExpression": { + "beforeOpeningCurlyBrace": true + }, + "disallowSpacesInAnonymousFunctionExpression": { + "beforeOpeningRoundBrace": true + }, + "disallowSpacesInsideObjectBrackets": "all", + "disallowSpacesInsideArrayBrackets": "all", + "disallowSpacesInsideParentheses": true, + "validateJSDoc": { + "checkParamNames": true, + "requireParamTypes": true + }, + "disallowMultipleLineBreaks": true, + "disallowNewlineBeforeBlockStatements": true +} \ No newline at end of file diff --git a/www/js/hammerjs/.jshintrc b/www/js/hammerjs/.jshintrc new file mode 100644 index 0000000..925e528 --- /dev/null +++ b/www/js/hammerjs/.jshintrc @@ -0,0 +1,22 @@ +{ + "browser": true, + "curly": true, + "eqnull": true, + "expr": true, + "maxerr": 100, + "freeze": true, + "newcap": true, + "node": true, + "quotmark": "single", + "strict": true, + "sub": true, + "trailing": true, + "undef": true, + "unused": true, + "camelcase": true, + "indent": 4, + "validthis": true, + "globals": { + "define": false + } +} diff --git a/www/js/hammerjs/.npmignore b/www/js/hammerjs/.npmignore new file mode 100644 index 0000000..391688f --- /dev/null +++ b/www/js/hammerjs/.npmignore @@ -0,0 +1,21 @@ +# ide +.idea +.iml + +# node +lib-cov +*.seed +*.log +*.csv +*.dat +*.out +*.pid +*.gz + +pids +logs +results +tests/build.js + +npm-debug.log +node_modules diff --git a/www/js/hammerjs/.travis.yml b/www/js/hammerjs/.travis.yml new file mode 100644 index 0000000..308d9a6 --- /dev/null +++ b/www/js/hammerjs/.travis.yml @@ -0,0 +1,11 @@ +language: node_js +node_js: + - "0.10" + +sudo: false + +before_script: + - npm install -g grunt-cli + +script: + - grunt test-travis \ No newline at end of file diff --git a/www/js/hammerjs/CHANGELOG.md b/www/js/hammerjs/CHANGELOG.md new file mode 100644 index 0000000..d3bc17d --- /dev/null +++ b/www/js/hammerjs/CHANGELOG.md @@ -0,0 +1,54 @@ +# Changelog + +### 2.0.6, 2015-12-23 +- Add Assign method and deprecate merge and extend ([#895](https://github.com/hammerjs/hammer.js/pull/895)[fc01eae](https://github.com/hammerjs/hammer.js/commit/fc01eaea678acc430c664eb374555fbe3d403bdd)) +- Expose Hammer on window or self if either is defined to avoid issues when AMD is present but not used. ( [356f795](https://github.com/hammerjs/hammer.js/commit/356f7955b01f3679c29d6c45931679256b45036e)) +- Add support for PointerEvent instead of MSPointerEvent if supported. ([#754](https://github.com/hammerjs/hammer.js/issues/754), [439c7a6](https://github.com/hammerjs/hammer.js/commit/439c7a6c46978ab387b4b8289399e904d1c49535)) +- Fixed moz-prefix, prefix should be Moz not moz. ([3ea47f3](https://github.com/hammerjs/hammer.js/commit/3ea47f3aebadc9d3bb6bf52bc8402cad135ef8a9)) +- Removed non-existant recognizer ([f1c2d3b](https://github.com/hammerjs/hammer.js/commit/f1c2d3bf05f530ae092ecfc2335fceeff0e9eec9)) +- Fixed config leaking between instances([189098f](https://github.com/hammerjs/hammer.js/commit/189098ff7736f6ed2fce9a3d3e1f5a3afee085ba)) +- Fixed gaps in gesture configs and update tests to match ([70c2902](https://github.com/hammerjs/hammer.js/commit/70c2902d773a750e92ce8c423f8a4165c07eab97)) +- Fixed Manager off method ([#768](https://github.com/hammerjs/hammer.js/issues/768), [da49a27](https://github.com/hammerjs/hammer.js/commit/da49a2730779ecc3b4dd147cc418a0df7c70fad9)) +- Added compatibility with requirejs optimizer namespaces ( [70075f2](https://github.com/hammerjs/hammer.js/commit/70075f2df1b855f7c6d8d3caac49b9276b88c8d6)) +- Made touchaction test zoomable ( [50264a7](https://github.com/hammerjs/hammer.js/commit/50264a70251ca88bbaf7b666401e527eee616de5)) +- Fixed preventing default when for `pan-x pan-y` case ( [95eaafa](https://github.com/hammerjs/hammer.js/commit/95eaafadad27bd1b25d20cf976811a451922f1c4)) +- Fixed incorrect touch action pan direction ( [a81da57](https://github.com/hammerjs/hammer.js/commit/a81da57a82ebf37e695e7c443e4e2715e7f32856)) +- Fixed combined pan-x pan-y to resolve to none ( [fdae07b](https://github.com/hammerjs/hammer.js/commit/fdae07bc2ba3c90aad28da6791b3d5df627bc612)) +- Fixed inverted touch-action for pan recognizer ([#728](https://github.com/hammerjs/hammer.js/issues/728), [605bd3b](https://github.com/hammerjs/hammer.js/commit/605bd3beca780be91dd43f9da8b809d155a43d1a)) +- Fixed dependency on non standard touch list ordering ([#610](https://github.com/hammerjs/hammer.js/issues/610), [#791](https://github.com/hammerjs/hammer.js/issues/791), [287720a](https://github.com/hammerjs/hammer.js/commit/287720a6e5067e7f28be8b8b3b266d22905361c4)) +- Fixed swipe to not trigger after multitouch gesture ([#640](https://github.com/hammerjs/hammer.js/issues/640), [711d8a1](https://github.com/hammerjs/hammer.js/commit/711d8a1df1aa5057ecb536454a36257e3c0d6d91)) +- Fixed swipe recognizer to use overall gesture direction and velocity ( [963fe69](https://github.com/hammerjs/hammer.js/commit/963fe697515273fee508414bc29e2656465cea55)) +- Fixed getDirection returning reversed direction ( [e40dcde](https://github.com/hammerjs/hammer.js/commit/e40dcde43bdac7a74c8ce5c05a4f62121089cd91)) +- Fixed detection of tap when multi touch gestures are present ( [c46cbba](https://github.com/hammerjs/hammer.js/commit/c46cbba1c2cbbf874b59913416858d9dae297e64)) +- Fixed incorrect event order ([#824](https://github.com/hammerjs/hammer.js/issues/824), [92f2d76](https://github.com/hammerjs/hammer.js/commit/92f2d76188480d967e738a19cd508d0b94a31329)) +- Fixed leaking options between recognizer instances ([#813](https://github.com/hammerjs/hammer.js/issues/813), [af32c9b](https://github.com/hammerjs/hammer.js/commit/af32c9bace3f04bb34bee852ff56a33cc8fc27cd)) +- Fixed detection when element has no style attribute ( [5ca6d8c](https://github.com/hammerjs/hammer.js/commit/5ca6d8cbead02c71929a8073e95ddf98e11c0e06)) + +### 2.0.4, 2014-09-28 +- Fix IE pointer issue. [#665](https://github.com/hammerjs/hammer.js/pull/665) +- Fix multi-touch at different elements. [#668](https://github.com/hammerjs/hammer.js/pull/668) +- Added experimental [single-user Touch input handler](src/input/singletouch.js). This to improve performance/ux when only a single user has to be supported. Plans are to release 2.1 with this as default, and a settings to enable the multi-user handler. + +### 2.0.3, 2014-09-10 +- Manager.set improvements. +- Fix requireFailure() call in Manager.options.recognizers. +- Make DIRECTION_ALL for pan and swipe gestures less blocking. +- Fix Swipe recognizer threshold option. +- Expose the Input classes. +- Added the option `inputClass` to set the used input handler. + +### 2.0.2, 2014-07-26 +- Improved mouse and pointer-events input, now able to move outside the window. +- Added the export name (`Hammer`) as an argument to the wrapper. +- Add the option *experimental* `inputTarget` to change the element that receives the events. +- Improved performance when only one touch being active. +- Fixed the jumping deltaXY bug when going from single to multi-touch. +- Improved velocity calculations. + +### 2.0.1, 2014-07-15 +- Fix issue when no document.body is available +- Added pressup event for the press recognizer +- Removed alternative for Object.create + +### 2.0.0, 2014-07-11 +- Full rewrite of the library. diff --git a/www/js/hammerjs/CONTRIBUTING.md b/www/js/hammerjs/CONTRIBUTING.md new file mode 100644 index 0000000..b1934de --- /dev/null +++ b/www/js/hammerjs/CONTRIBUTING.md @@ -0,0 +1,41 @@ +# Contributing to Hammer.js + +Looking to contribute something to Hammer.js? **Here's how you can help.** + + +## Reporting issues + +We only accept issues that are bug reports or feature requests. Bugs must be +isolated and reproducible problems that can be fixed within the Hammer.js. +Please read the following guidelines before opening any issue. + +1. [**Read the documentation**](https://hammerjs.github.io) + +2. **Search for existing issues.** We get a lot of duplicate issues, and you'd +help us out a lot by first checking if someone else has reported the same issue. +Moreover, the issue may have already been resolved with a fix available. Also +take a look if your problem is explained at the Wiki. + +3. **Create an isolated and reproducible test case.** Be sure the problem exists +in Hammer's code with a reduced test case that should be included in each bug +report. + +4. **Include a live example.** Make use of jsFiddle or jsBin to share your +isolated test cases. Also, a screen capture would work, with tools like LICEcap. + +5. **Share as much information as possible.** Include operating system and +version, browser and version, version of Hammer.js, customized or vanilla build, +etc. where appropriate. Also include steps to reproduce the bug. + +## Pull requests + +1. Changes must be done in `/src` files, never just the compiled files. Also, don't +commit the compiled files. + +2. Try not to pollute your pull request with unintended changes. Keep them simple +and small + +3. Try to share which browsers your code has been tested in before submitting a +pull request + +4. Write tests for your code, these can be found in `/tests`. diff --git a/www/js/hammerjs/Gruntfile.coffee b/www/js/hammerjs/Gruntfile.coffee new file mode 100644 index 0000000..739af0c --- /dev/null +++ b/www/js/hammerjs/Gruntfile.coffee @@ -0,0 +1,124 @@ +module.exports = (grunt) -> + grunt.initConfig + pkg: grunt.file.readJSON 'package.json' + + usebanner: + taskName: + options: + position: 'top' + banner: ' +/*! <%= pkg.title || pkg.name %> - v<%= pkg.version %> - <%= grunt.template.today("yyyy-mm-dd") %>\n + * <%= pkg.homepage %>\n + *\n + * Copyright (c) <%= grunt.template.today("yyyy") %> <%= pkg.author.name %>;\n + * Licensed under the <%= pkg.license %> license */' + linebreak: true + files: + src: ['./hammer.js','./hammer.min.js'] + + concat: + build: + src: [ + 'src/hammer.prefix.js' + 'src/utils.js' + 'src/input.js' + 'src/input/*.js' + 'src/touchaction.js' + 'src/recognizer.js' + 'src/recognizers/*.js' + 'src/hammer.js' + 'src/manager.js' + 'src/expose.js' + 'src/hammer.suffix.js'] + dest: 'hammer.js' + + uglify: + min: + options: + report: 'gzip' + sourceMap: 'hammer.min.map' + files: + 'hammer.min.js': ['hammer.js'] + # special test build that exposes everything so it's testable + test: + options: + wrap: "$H" + comments: 'all' + exportAll: true + mangle: false + beautify: true + compress: + global_defs: + exportName: 'Hammer' + files: + 'tests/build.js': [ + 'src/utils.js' + 'src/input.js' + 'src/input/*.js' + 'src/touchaction.js' + 'src/recognizer.js' + 'src/recognizers/*.js' + 'src/hammer.js' + 'src/manager.js' + 'src/expose.js'] + + 'string-replace': + version: + files: + 'hammer.js': 'hammer.js' + options: + replacements: [ + pattern: '{{PKG_VERSION}}' + replacement: '<%= pkg.version %>' + ] + + jshint: + options: + jshintrc: true + build: + src: ['hammer.js'] + + jscs: + src: [ + 'src/**/*.js', + '!src/hammer.prefix.js', + '!src/hammer.suffix.js' + ] + options: + config: "./.jscsrc" + force: true + + watch: + scripts: + files: ['src/**/*.js'] + tasks: ['concat','string-replace','uglify','jshint','jscs'] + options: + interrupt: true + + connect: + server: + options: + hostname: "0.0.0.0" + port: 8000 + + qunit: + all: ['tests/unit/index.html'] + + + # Load tasks + grunt.loadNpmTasks 'grunt-contrib-concat' + grunt.loadNpmTasks 'grunt-contrib-uglify' + grunt.loadNpmTasks 'grunt-contrib-qunit' + grunt.loadNpmTasks 'grunt-contrib-watch' + grunt.loadNpmTasks 'grunt-contrib-jshint' + grunt.loadNpmTasks 'grunt-contrib-connect' + grunt.loadNpmTasks 'grunt-string-replace' + grunt.loadNpmTasks 'grunt-banner' + grunt.loadNpmTasks 'grunt-jscs' + + # Default task(s) + grunt.registerTask 'default', ['connect', 'watch'] + grunt.registerTask 'default-test', ['connect', 'uglify:test', 'watch'] + grunt.registerTask 'build', ['concat', 'string-replace', 'uglify:min', 'usebanner', 'test'] + grunt.registerTask 'test', ['jshint', 'jscs', 'uglify:test', 'qunit'] + grunt.registerTask 'test-travis', ['build'] diff --git a/www/js/hammerjs/LICENSE.md b/www/js/hammerjs/LICENSE.md new file mode 100644 index 0000000..e067655 --- /dev/null +++ b/www/js/hammerjs/LICENSE.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (C) 2011-2014 by Jorik Tangelder (Eight Media) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/www/js/hammerjs/README.md b/www/js/hammerjs/README.md new file mode 100644 index 0000000..e7bf8b8 --- /dev/null +++ b/www/js/hammerjs/README.md @@ -0,0 +1,51 @@ +# Hammer.js 2.0.6 + +[![Build Status](https://travis-ci.org/hammerjs/hammer.js.svg)](https://travis-ci.org/hammerjs/hammer.js) + +## Support, Questions, and Collaboration + +[![Slack Status](https://hammerjs.herokuapp.com/badge.svg)](https://hammerjs.herokuapp.com/) + +## Documentation + +Visit [hammerjs.github.io](http://hammerjs.github.io) for detailed documentation. + +```js +// get a reference to an element +var stage = document.getElementById('stage'); + +// create a manager for that element +var mc = new Hammer.Manager(stage); + +// create a recognizer +var Rotate = new Hammer.Rotate(); + +// add the recognizer +mc.add(Rotate); + +// subscribe to events +mc.on('rotate', function(e) { + // do something cool + var rotation = Math.round(e.rotation); + stage.style.transform = 'rotate('+rotation+'deg)'; +}); +``` + +An advanced demo is available here: [http://codepen.io/runspired/full/ZQBGWd/](http://codepen.io/runspired/full/ZQBGWd/) + + +## Contributing + +Read the [contributing guidelines](./CONTRIBUTING.md). + +For PRs. + +- Use [Angular Style commit messages](https://github.com/angular/angular.js/blob/v1.4.8/CONTRIBUTING.md#commit) +- Rebase your PR branch when necessary +- If you add a feature or fix a bug, please add or fix any necessary tests. +- If a new feature, open a docs PR to go with. + +## Building + +You can get the pre-build versions from the Hammer.js website, or do this by yourself running +`npm install -g grunt-cli && npm install && grunt build` diff --git a/www/js/hammerjs/bower.json b/www/js/hammerjs/bower.json new file mode 100644 index 0000000..f241608 --- /dev/null +++ b/www/js/hammerjs/bower.json @@ -0,0 +1,16 @@ +{ + "name": "hammerjs", + "main": "hammer.js", + "ignore": [ + "tests", + "src", + ".bowerrc", + ".gitignore", + ".jscsrc", + ".jshintrc", + ".travis.yml", + "component.json", + "Gruntfile.coffee", + "package.json" + ] +} diff --git a/www/js/hammerjs/changelog.js b/www/js/hammerjs/changelog.js new file mode 100644 index 0000000..887a329 --- /dev/null +++ b/www/js/hammerjs/changelog.js @@ -0,0 +1,71 @@ +var changelog = require( "changelogplease" ); +var gittags = require( "git-tags" ).get( function( error, tags ) { + if ( error ) { + throw error + } + console.log( tags[ 1 ] + ".." + tags[ 0 ] ); + var exclude = [ "Merge", "Whitespace", "Fixup", "Cleanup", "Formatting", "Ignore" ]; + changelog( { + ticketUrl: "https://github.com/hammerjs/hammer.js/issues/{id}", + commitUrl: "https://github.com/hammerjs/hammerjs/commit/{id}", + sort: false, + repo: "./", + committish: tags[ 1 ] + ".." + tags[ 0 ] + }, function( error, log ) { + if ( error ) { + throw error; + } + log = parseLog( log ); + console.log( log ); + } ); + function parseLog( log ) { + var lines = log.split( "\n" ); + var newLog = []; + var log = []; + var currentComponent; + + + lines.shift(); + lines.forEach( function( line ) { + var newLine = parseLine( line ); + if ( newLine ) { + log.push( line ); + } + } ); + var log = log.join( "\n" ); + return log.replace( /\*/g, "-" ).replace( /__TICKETREF__,/g, "" ); + } + function parseLine( line ) { + var parts = getParts( line ); + + if ( exclude.indexOf( parts.component ) > -1 ) { + return false; + } + return parts; + } + function getParts( line ) { + var parts = line.split( ":" ); + var component = ""; + var message; + var commits = line.match( /\{\{([A-Za-z0-9 ]){0,99}\}\}/ ) + + if ( parts.length > 1 && parts[ 0 ].length <= 20 ) { + component = parts[ 0 ]; + parts.shift(); + message = parts.join( ":" ); + } else { + parts = line.split( " " ); + component = parts[ 1 ]; + parts.shift(); + message = parts.join( " " ); + } + + if ( component ) { + component = component.replace( /\* |,/, "" ); + } + return { + component: component, + message: message + }; + } +} ); diff --git a/www/js/hammerjs/component.json b/www/js/hammerjs/component.json new file mode 100644 index 0000000..4af3a33 --- /dev/null +++ b/www/js/hammerjs/component.json @@ -0,0 +1,8 @@ +{ + "name": "hammerjs", + "version": "2.0.6", + "main": "hammer.js", + "scripts": [ + "hammer.js" + ] +} diff --git a/www/js/hammerjs/hammer.js b/www/js/hammerjs/hammer.js new file mode 100644 index 0000000..00d2965 --- /dev/null +++ b/www/js/hammerjs/hammer.js @@ -0,0 +1,2643 @@ +/*! Hammer.JS - v2.0.7 - 2016-04-22 + * http://hammerjs.github.io/ + * + * Copyright (c) 2016 Jorik Tangelder; + * Licensed under the MIT license */ +(function(window, document, exportName, undefined) { + 'use strict'; + +var VENDOR_PREFIXES = ['', 'webkit', 'Moz', 'MS', 'ms', 'o']; +var TEST_ELEMENT = document.createElement('div'); + +var TYPE_FUNCTION = 'function'; + +var round = Math.round; +var abs = Math.abs; +var now = Date.now; + +/** + * set a timeout with a given scope + * @param {Function} fn + * @param {Number} timeout + * @param {Object} context + * @returns {number} + */ +function setTimeoutContext(fn, timeout, context) { + return setTimeout(bindFn(fn, context), timeout); +} + +/** + * if the argument is an array, we want to execute the fn on each entry + * if it aint an array we don't want to do a thing. + * this is used by all the methods that accept a single and array argument. + * @param {*|Array} arg + * @param {String} fn + * @param {Object} [context] + * @returns {Boolean} + */ +function invokeArrayArg(arg, fn, context) { + if (Array.isArray(arg)) { + each(arg, context[fn], context); + return true; + } + return false; +} + +/** + * walk objects and arrays + * @param {Object} obj + * @param {Function} iterator + * @param {Object} context + */ +function each(obj, iterator, context) { + var i; + + if (!obj) { + return; + } + + if (obj.forEach) { + obj.forEach(iterator, context); + } else if (obj.length !== undefined) { + i = 0; + while (i < obj.length) { + iterator.call(context, obj[i], i, obj); + i++; + } + } else { + for (i in obj) { + obj.hasOwnProperty(i) && iterator.call(context, obj[i], i, obj); + } + } +} + +/** + * wrap a method with a deprecation warning and stack trace + * @param {Function} method + * @param {String} name + * @param {String} message + * @returns {Function} A new function wrapping the supplied method. + */ +function deprecate(method, name, message) { + var deprecationMessage = 'DEPRECATED METHOD: ' + name + '\n' + message + ' AT \n'; + return function() { + var e = new Error('get-stack-trace'); + var stack = e && e.stack ? e.stack.replace(/^[^\(]+?[\n$]/gm, '') + .replace(/^\s+at\s+/gm, '') + .replace(/^Object.\s*\(/gm, '{anonymous}()@') : 'Unknown Stack Trace'; + + var log = window.console && (window.console.warn || window.console.log); + if (log) { + log.call(window.console, deprecationMessage, stack); + } + return method.apply(this, arguments); + }; +} + +/** + * extend object. + * means that properties in dest will be overwritten by the ones in src. + * @param {Object} target + * @param {...Object} objects_to_assign + * @returns {Object} target + */ +var assign; +if (typeof Object.assign !== 'function') { + assign = function assign(target) { + if (target === undefined || target === null) { + throw new TypeError('Cannot convert undefined or null to object'); + } + + var output = Object(target); + for (var index = 1; index < arguments.length; index++) { + var source = arguments[index]; + if (source !== undefined && source !== null) { + for (var nextKey in source) { + if (source.hasOwnProperty(nextKey)) { + output[nextKey] = source[nextKey]; + } + } + } + } + return output; + }; +} else { + assign = Object.assign; +} + +/** + * extend object. + * means that properties in dest will be overwritten by the ones in src. + * @param {Object} dest + * @param {Object} src + * @param {Boolean} [merge=false] + * @returns {Object} dest + */ +var extend = deprecate(function extend(dest, src, merge) { + var keys = Object.keys(src); + var i = 0; + while (i < keys.length) { + if (!merge || (merge && dest[keys[i]] === undefined)) { + dest[keys[i]] = src[keys[i]]; + } + i++; + } + return dest; +}, 'extend', 'Use `assign`.'); + +/** + * merge the values from src in the dest. + * means that properties that exist in dest will not be overwritten by src + * @param {Object} dest + * @param {Object} src + * @returns {Object} dest + */ +var merge = deprecate(function merge(dest, src) { + return extend(dest, src, true); +}, 'merge', 'Use `assign`.'); + +/** + * simple class inheritance + * @param {Function} child + * @param {Function} base + * @param {Object} [properties] + */ +function inherit(child, base, properties) { + var baseP = base.prototype, + childP; + + childP = child.prototype = Object.create(baseP); + childP.constructor = child; + childP._super = baseP; + + if (properties) { + assign(childP, properties); + } +} + +/** + * simple function bind + * @param {Function} fn + * @param {Object} context + * @returns {Function} + */ +function bindFn(fn, context) { + return function boundFn() { + return fn.apply(context, arguments); + }; +} + +/** + * let a boolean value also be a function that must return a boolean + * this first item in args will be used as the context + * @param {Boolean|Function} val + * @param {Array} [args] + * @returns {Boolean} + */ +function boolOrFn(val, args) { + if (typeof val == TYPE_FUNCTION) { + return val.apply(args ? args[0] || undefined : undefined, args); + } + return val; +} + +/** + * use the val2 when val1 is undefined + * @param {*} val1 + * @param {*} val2 + * @returns {*} + */ +function ifUndefined(val1, val2) { + return (val1 === undefined) ? val2 : val1; +} + +/** + * addEventListener with multiple events at once + * @param {EventTarget} target + * @param {String} types + * @param {Function} handler + */ +function addEventListeners(target, types, handler) { + each(splitStr(types), function(type) { + target.addEventListener(type, handler, false); + }); +} + +/** + * removeEventListener with multiple events at once + * @param {EventTarget} target + * @param {String} types + * @param {Function} handler + */ +function removeEventListeners(target, types, handler) { + each(splitStr(types), function(type) { + target.removeEventListener(type, handler, false); + }); +} + +/** + * find if a node is in the given parent + * @method hasParent + * @param {HTMLElement} node + * @param {HTMLElement} parent + * @return {Boolean} found + */ +function hasParent(node, parent) { + while (node) { + if (node == parent) { + return true; + } + node = node.parentNode; + } + return false; +} + +/** + * small indexOf wrapper + * @param {String} str + * @param {String} find + * @returns {Boolean} found + */ +function inStr(str, find) { + return str.indexOf(find) > -1; +} + +/** + * split string on whitespace + * @param {String} str + * @returns {Array} words + */ +function splitStr(str) { + return str.trim().split(/\s+/g); +} + +/** + * find if a array contains the object using indexOf or a simple polyFill + * @param {Array} src + * @param {String} find + * @param {String} [findByKey] + * @return {Boolean|Number} false when not found, or the index + */ +function inArray(src, find, findByKey) { + if (src.indexOf && !findByKey) { + return src.indexOf(find); + } else { + var i = 0; + while (i < src.length) { + if ((findByKey && src[i][findByKey] == find) || (!findByKey && src[i] === find)) { + return i; + } + i++; + } + return -1; + } +} + +/** + * convert array-like objects to real arrays + * @param {Object} obj + * @returns {Array} + */ +function toArray(obj) { + return Array.prototype.slice.call(obj, 0); +} + +/** + * unique array with objects based on a key (like 'id') or just by the array's value + * @param {Array} src [{id:1},{id:2},{id:1}] + * @param {String} [key] + * @param {Boolean} [sort=False] + * @returns {Array} [{id:1},{id:2}] + */ +function uniqueArray(src, key, sort) { + var results = []; + var values = []; + var i = 0; + + while (i < src.length) { + var val = key ? src[i][key] : src[i]; + if (inArray(values, val) < 0) { + results.push(src[i]); + } + values[i] = val; + i++; + } + + if (sort) { + if (!key) { + results = results.sort(); + } else { + results = results.sort(function sortUniqueArray(a, b) { + return a[key] > b[key]; + }); + } + } + + return results; +} + +/** + * get the prefixed property + * @param {Object} obj + * @param {String} property + * @returns {String|Undefined} prefixed + */ +function prefixed(obj, property) { + var prefix, prop; + var camelProp = property[0].toUpperCase() + property.slice(1); + + var i = 0; + while (i < VENDOR_PREFIXES.length) { + prefix = VENDOR_PREFIXES[i]; + prop = (prefix) ? prefix + camelProp : property; + + if (prop in obj) { + return prop; + } + i++; + } + return undefined; +} + +/** + * get a unique id + * @returns {number} uniqueId + */ +var _uniqueId = 1; +function uniqueId() { + return _uniqueId++; +} + +/** + * get the window object of an element + * @param {HTMLElement} element + * @returns {DocumentView|Window} + */ +function getWindowForElement(element) { + var doc = element.ownerDocument || element; + return (doc.defaultView || doc.parentWindow || window); +} + +var MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i; + +var SUPPORT_TOUCH = ('ontouchstart' in window); +var SUPPORT_POINTER_EVENTS = prefixed(window, 'PointerEvent') !== undefined; +var SUPPORT_ONLY_TOUCH = SUPPORT_TOUCH && MOBILE_REGEX.test(navigator.userAgent); + +var INPUT_TYPE_TOUCH = 'touch'; +var INPUT_TYPE_PEN = 'pen'; +var INPUT_TYPE_MOUSE = 'mouse'; +var INPUT_TYPE_KINECT = 'kinect'; + +var COMPUTE_INTERVAL = 25; + +var INPUT_START = 1; +var INPUT_MOVE = 2; +var INPUT_END = 4; +var INPUT_CANCEL = 8; + +var DIRECTION_NONE = 1; +var DIRECTION_LEFT = 2; +var DIRECTION_RIGHT = 4; +var DIRECTION_UP = 8; +var DIRECTION_DOWN = 16; + +var DIRECTION_HORIZONTAL = DIRECTION_LEFT | DIRECTION_RIGHT; +var DIRECTION_VERTICAL = DIRECTION_UP | DIRECTION_DOWN; +var DIRECTION_ALL = DIRECTION_HORIZONTAL | DIRECTION_VERTICAL; + +var PROPS_XY = ['x', 'y']; +var PROPS_CLIENT_XY = ['clientX', 'clientY']; + +/** + * create new input type manager + * @param {Manager} manager + * @param {Function} callback + * @returns {Input} + * @constructor + */ +function Input(manager, callback) { + var self = this; + this.manager = manager; + this.callback = callback; + this.element = manager.element; + this.target = manager.options.inputTarget; + + // smaller wrapper around the handler, for the scope and the enabled state of the manager, + // so when disabled the input events are completely bypassed. + this.domHandler = function(ev) { + if (boolOrFn(manager.options.enable, [manager])) { + self.handler(ev); + } + }; + + this.init(); + +} + +Input.prototype = { + /** + * should handle the inputEvent data and trigger the callback + * @virtual + */ + handler: function() { }, + + /** + * bind the events + */ + init: function() { + this.evEl && addEventListeners(this.element, this.evEl, this.domHandler); + this.evTarget && addEventListeners(this.target, this.evTarget, this.domHandler); + this.evWin && addEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler); + }, + + /** + * unbind the events + */ + destroy: function() { + this.evEl && removeEventListeners(this.element, this.evEl, this.domHandler); + this.evTarget && removeEventListeners(this.target, this.evTarget, this.domHandler); + this.evWin && removeEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler); + } +}; + +/** + * create new input type manager + * called by the Manager constructor + * @param {Hammer} manager + * @returns {Input} + */ +function createInputInstance(manager) { + var Type; + var inputClass = manager.options.inputClass; + + if (inputClass) { + Type = inputClass; + } else if (SUPPORT_POINTER_EVENTS) { + Type = PointerEventInput; + } else if (SUPPORT_ONLY_TOUCH) { + Type = TouchInput; + } else if (!SUPPORT_TOUCH) { + Type = MouseInput; + } else { + Type = TouchMouseInput; + } + return new (Type)(manager, inputHandler); +} + +/** + * handle input events + * @param {Manager} manager + * @param {String} eventType + * @param {Object} input + */ +function inputHandler(manager, eventType, input) { + var pointersLen = input.pointers.length; + var changedPointersLen = input.changedPointers.length; + var isFirst = (eventType & INPUT_START && (pointersLen - changedPointersLen === 0)); + var isFinal = (eventType & (INPUT_END | INPUT_CANCEL) && (pointersLen - changedPointersLen === 0)); + + input.isFirst = !!isFirst; + input.isFinal = !!isFinal; + + if (isFirst) { + manager.session = {}; + } + + // source event is the normalized value of the domEvents + // like 'touchstart, mouseup, pointerdown' + input.eventType = eventType; + + // compute scale, rotation etc + computeInputData(manager, input); + + // emit secret event + manager.emit('hammer.input', input); + + manager.recognize(input); + manager.session.prevInput = input; +} + +/** + * extend the data with some usable properties like scale, rotate, velocity etc + * @param {Object} manager + * @param {Object} input + */ +function computeInputData(manager, input) { + var session = manager.session; + var pointers = input.pointers; + var pointersLength = pointers.length; + + // store the first input to calculate the distance and direction + if (!session.firstInput) { + session.firstInput = simpleCloneInputData(input); + } + + // to compute scale and rotation we need to store the multiple touches + if (pointersLength > 1 && !session.firstMultiple) { + session.firstMultiple = simpleCloneInputData(input); + } else if (pointersLength === 1) { + session.firstMultiple = false; + } + + var firstInput = session.firstInput; + var firstMultiple = session.firstMultiple; + var offsetCenter = firstMultiple ? firstMultiple.center : firstInput.center; + + var center = input.center = getCenter(pointers); + input.timeStamp = now(); + input.deltaTime = input.timeStamp - firstInput.timeStamp; + + input.angle = getAngle(offsetCenter, center); + input.distance = getDistance(offsetCenter, center); + + computeDeltaXY(session, input); + input.offsetDirection = getDirection(input.deltaX, input.deltaY); + + var overallVelocity = getVelocity(input.deltaTime, input.deltaX, input.deltaY); + input.overallVelocityX = overallVelocity.x; + input.overallVelocityY = overallVelocity.y; + input.overallVelocity = (abs(overallVelocity.x) > abs(overallVelocity.y)) ? overallVelocity.x : overallVelocity.y; + + input.scale = firstMultiple ? getScale(firstMultiple.pointers, pointers) : 1; + input.rotation = firstMultiple ? getRotation(firstMultiple.pointers, pointers) : 0; + + input.maxPointers = !session.prevInput ? input.pointers.length : ((input.pointers.length > + session.prevInput.maxPointers) ? input.pointers.length : session.prevInput.maxPointers); + + computeIntervalInputData(session, input); + + // find the correct target + var target = manager.element; + if (hasParent(input.srcEvent.target, target)) { + target = input.srcEvent.target; + } + input.target = target; +} + +function computeDeltaXY(session, input) { + var center = input.center; + var offset = session.offsetDelta || {}; + var prevDelta = session.prevDelta || {}; + var prevInput = session.prevInput || {}; + + if (input.eventType === INPUT_START || prevInput.eventType === INPUT_END) { + prevDelta = session.prevDelta = { + x: prevInput.deltaX || 0, + y: prevInput.deltaY || 0 + }; + + offset = session.offsetDelta = { + x: center.x, + y: center.y + }; + } + + input.deltaX = prevDelta.x + (center.x - offset.x); + input.deltaY = prevDelta.y + (center.y - offset.y); +} + +/** + * velocity is calculated every x ms + * @param {Object} session + * @param {Object} input + */ +function computeIntervalInputData(session, input) { + var last = session.lastInterval || input, + deltaTime = input.timeStamp - last.timeStamp, + velocity, velocityX, velocityY, direction; + + if (input.eventType != INPUT_CANCEL && (deltaTime > COMPUTE_INTERVAL || last.velocity === undefined)) { + var deltaX = input.deltaX - last.deltaX; + var deltaY = input.deltaY - last.deltaY; + + var v = getVelocity(deltaTime, deltaX, deltaY); + velocityX = v.x; + velocityY = v.y; + velocity = (abs(v.x) > abs(v.y)) ? v.x : v.y; + direction = getDirection(deltaX, deltaY); + + session.lastInterval = input; + } else { + // use latest velocity info if it doesn't overtake a minimum period + velocity = last.velocity; + velocityX = last.velocityX; + velocityY = last.velocityY; + direction = last.direction; + } + + input.velocity = velocity; + input.velocityX = velocityX; + input.velocityY = velocityY; + input.direction = direction; +} + +/** + * create a simple clone from the input used for storage of firstInput and firstMultiple + * @param {Object} input + * @returns {Object} clonedInputData + */ +function simpleCloneInputData(input) { + // make a simple copy of the pointers because we will get a reference if we don't + // we only need clientXY for the calculations + var pointers = []; + var i = 0; + while (i < input.pointers.length) { + pointers[i] = { + clientX: round(input.pointers[i].clientX), + clientY: round(input.pointers[i].clientY) + }; + i++; + } + + return { + timeStamp: now(), + pointers: pointers, + center: getCenter(pointers), + deltaX: input.deltaX, + deltaY: input.deltaY + }; +} + +/** + * get the center of all the pointers + * @param {Array} pointers + * @return {Object} center contains `x` and `y` properties + */ +function getCenter(pointers) { + var pointersLength = pointers.length; + + // no need to loop when only one touch + if (pointersLength === 1) { + return { + x: round(pointers[0].clientX), + y: round(pointers[0].clientY) + }; + } + + var x = 0, y = 0, i = 0; + while (i < pointersLength) { + x += pointers[i].clientX; + y += pointers[i].clientY; + i++; + } + + return { + x: round(x / pointersLength), + y: round(y / pointersLength) + }; +} + +/** + * calculate the velocity between two points. unit is in px per ms. + * @param {Number} deltaTime + * @param {Number} x + * @param {Number} y + * @return {Object} velocity `x` and `y` + */ +function getVelocity(deltaTime, x, y) { + return { + x: x / deltaTime || 0, + y: y / deltaTime || 0 + }; +} + +/** + * get the direction between two points + * @param {Number} x + * @param {Number} y + * @return {Number} direction + */ +function getDirection(x, y) { + if (x === y) { + return DIRECTION_NONE; + } + + if (abs(x) >= abs(y)) { + return x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT; + } + return y < 0 ? DIRECTION_UP : DIRECTION_DOWN; +} + +/** + * calculate the absolute distance between two points + * @param {Object} p1 {x, y} + * @param {Object} p2 {x, y} + * @param {Array} [props] containing x and y keys + * @return {Number} distance + */ +function getDistance(p1, p2, props) { + if (!props) { + props = PROPS_XY; + } + var x = p2[props[0]] - p1[props[0]], + y = p2[props[1]] - p1[props[1]]; + + return Math.sqrt((x * x) + (y * y)); +} + +/** + * calculate the angle between two coordinates + * @param {Object} p1 + * @param {Object} p2 + * @param {Array} [props] containing x and y keys + * @return {Number} angle + */ +function getAngle(p1, p2, props) { + if (!props) { + props = PROPS_XY; + } + var x = p2[props[0]] - p1[props[0]], + y = p2[props[1]] - p1[props[1]]; + return Math.atan2(y, x) * 180 / Math.PI; +} + +/** + * calculate the rotation degrees between two pointersets + * @param {Array} start array of pointers + * @param {Array} end array of pointers + * @return {Number} rotation + */ +function getRotation(start, end) { + return getAngle(end[1], end[0], PROPS_CLIENT_XY) + getAngle(start[1], start[0], PROPS_CLIENT_XY); +} + +/** + * calculate the scale factor between two pointersets + * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out + * @param {Array} start array of pointers + * @param {Array} end array of pointers + * @return {Number} scale + */ +function getScale(start, end) { + return getDistance(end[0], end[1], PROPS_CLIENT_XY) / getDistance(start[0], start[1], PROPS_CLIENT_XY); +} + +var MOUSE_INPUT_MAP = { + mousedown: INPUT_START, + mousemove: INPUT_MOVE, + mouseup: INPUT_END +}; + +var MOUSE_ELEMENT_EVENTS = 'mousedown'; +var MOUSE_WINDOW_EVENTS = 'mousemove mouseup'; + +/** + * Mouse events input + * @constructor + * @extends Input + */ +function MouseInput() { + this.evEl = MOUSE_ELEMENT_EVENTS; + this.evWin = MOUSE_WINDOW_EVENTS; + + this.pressed = false; // mousedown state + + Input.apply(this, arguments); +} + +inherit(MouseInput, Input, { + /** + * handle mouse events + * @param {Object} ev + */ + handler: function MEhandler(ev) { + var eventType = MOUSE_INPUT_MAP[ev.type]; + + // on start we want to have the left mouse button down + if (eventType & INPUT_START && ev.button === 0) { + this.pressed = true; + } + + if (eventType & INPUT_MOVE && ev.which !== 1) { + eventType = INPUT_END; + } + + // mouse must be down + if (!this.pressed) { + return; + } + + if (eventType & INPUT_END) { + this.pressed = false; + } + + this.callback(this.manager, eventType, { + pointers: [ev], + changedPointers: [ev], + pointerType: INPUT_TYPE_MOUSE, + srcEvent: ev + }); + } +}); + +var POINTER_INPUT_MAP = { + pointerdown: INPUT_START, + pointermove: INPUT_MOVE, + pointerup: INPUT_END, + pointercancel: INPUT_CANCEL, + pointerout: INPUT_CANCEL +}; + +// in IE10 the pointer types is defined as an enum +var IE10_POINTER_TYPE_ENUM = { + 2: INPUT_TYPE_TOUCH, + 3: INPUT_TYPE_PEN, + 4: INPUT_TYPE_MOUSE, + 5: INPUT_TYPE_KINECT // see https://twitter.com/jacobrossi/status/480596438489890816 +}; + +var POINTER_ELEMENT_EVENTS = 'pointerdown'; +var POINTER_WINDOW_EVENTS = 'pointermove pointerup pointercancel'; + +// IE10 has prefixed support, and case-sensitive +if (window.MSPointerEvent && !window.PointerEvent) { + POINTER_ELEMENT_EVENTS = 'MSPointerDown'; + POINTER_WINDOW_EVENTS = 'MSPointerMove MSPointerUp MSPointerCancel'; +} + +/** + * Pointer events input + * @constructor + * @extends Input + */ +function PointerEventInput() { + this.evEl = POINTER_ELEMENT_EVENTS; + this.evWin = POINTER_WINDOW_EVENTS; + + Input.apply(this, arguments); + + this.store = (this.manager.session.pointerEvents = []); +} + +inherit(PointerEventInput, Input, { + /** + * handle mouse events + * @param {Object} ev + */ + handler: function PEhandler(ev) { + var store = this.store; + var removePointer = false; + + var eventTypeNormalized = ev.type.toLowerCase().replace('ms', ''); + var eventType = POINTER_INPUT_MAP[eventTypeNormalized]; + var pointerType = IE10_POINTER_TYPE_ENUM[ev.pointerType] || ev.pointerType; + + var isTouch = (pointerType == INPUT_TYPE_TOUCH); + + // get index of the event in the store + var storeIndex = inArray(store, ev.pointerId, 'pointerId'); + + // start and mouse must be down + if (eventType & INPUT_START && (ev.button === 0 || isTouch)) { + if (storeIndex < 0) { + store.push(ev); + storeIndex = store.length - 1; + } + } else if (eventType & (INPUT_END | INPUT_CANCEL)) { + removePointer = true; + } + + // it not found, so the pointer hasn't been down (so it's probably a hover) + if (storeIndex < 0) { + return; + } + + // update the event in the store + store[storeIndex] = ev; + + this.callback(this.manager, eventType, { + pointers: store, + changedPointers: [ev], + pointerType: pointerType, + srcEvent: ev + }); + + if (removePointer) { + // remove from the store + store.splice(storeIndex, 1); + } + } +}); + +var SINGLE_TOUCH_INPUT_MAP = { + touchstart: INPUT_START, + touchmove: INPUT_MOVE, + touchend: INPUT_END, + touchcancel: INPUT_CANCEL +}; + +var SINGLE_TOUCH_TARGET_EVENTS = 'touchstart'; +var SINGLE_TOUCH_WINDOW_EVENTS = 'touchstart touchmove touchend touchcancel'; + +/** + * Touch events input + * @constructor + * @extends Input + */ +function SingleTouchInput() { + this.evTarget = SINGLE_TOUCH_TARGET_EVENTS; + this.evWin = SINGLE_TOUCH_WINDOW_EVENTS; + this.started = false; + + Input.apply(this, arguments); +} + +inherit(SingleTouchInput, Input, { + handler: function TEhandler(ev) { + var type = SINGLE_TOUCH_INPUT_MAP[ev.type]; + + // should we handle the touch events? + if (type === INPUT_START) { + this.started = true; + } + + if (!this.started) { + return; + } + + var touches = normalizeSingleTouches.call(this, ev, type); + + // when done, reset the started state + if (type & (INPUT_END | INPUT_CANCEL) && touches[0].length - touches[1].length === 0) { + this.started = false; + } + + this.callback(this.manager, type, { + pointers: touches[0], + changedPointers: touches[1], + pointerType: INPUT_TYPE_TOUCH, + srcEvent: ev + }); + } +}); + +/** + * @this {TouchInput} + * @param {Object} ev + * @param {Number} type flag + * @returns {undefined|Array} [all, changed] + */ +function normalizeSingleTouches(ev, type) { + var all = toArray(ev.touches); + var changed = toArray(ev.changedTouches); + + if (type & (INPUT_END | INPUT_CANCEL)) { + all = uniqueArray(all.concat(changed), 'identifier', true); + } + + return [all, changed]; +} + +var TOUCH_INPUT_MAP = { + touchstart: INPUT_START, + touchmove: INPUT_MOVE, + touchend: INPUT_END, + touchcancel: INPUT_CANCEL +}; + +var TOUCH_TARGET_EVENTS = 'touchstart touchmove touchend touchcancel'; + +/** + * Multi-user touch events input + * @constructor + * @extends Input + */ +function TouchInput() { + this.evTarget = TOUCH_TARGET_EVENTS; + this.targetIds = {}; + + Input.apply(this, arguments); +} + +inherit(TouchInput, Input, { + handler: function MTEhandler(ev) { + var type = TOUCH_INPUT_MAP[ev.type]; + var touches = getTouches.call(this, ev, type); + if (!touches) { + return; + } + + this.callback(this.manager, type, { + pointers: touches[0], + changedPointers: touches[1], + pointerType: INPUT_TYPE_TOUCH, + srcEvent: ev + }); + } +}); + +/** + * @this {TouchInput} + * @param {Object} ev + * @param {Number} type flag + * @returns {undefined|Array} [all, changed] + */ +function getTouches(ev, type) { + var allTouches = toArray(ev.touches); + var targetIds = this.targetIds; + + // when there is only one touch, the process can be simplified + if (type & (INPUT_START | INPUT_MOVE) && allTouches.length === 1) { + targetIds[allTouches[0].identifier] = true; + return [allTouches, allTouches]; + } + + var i, + targetTouches, + changedTouches = toArray(ev.changedTouches), + changedTargetTouches = [], + target = this.target; + + // get target touches from touches + targetTouches = allTouches.filter(function(touch) { + return hasParent(touch.target, target); + }); + + // collect touches + if (type === INPUT_START) { + i = 0; + while (i < targetTouches.length) { + targetIds[targetTouches[i].identifier] = true; + i++; + } + } + + // filter changed touches to only contain touches that exist in the collected target ids + i = 0; + while (i < changedTouches.length) { + if (targetIds[changedTouches[i].identifier]) { + changedTargetTouches.push(changedTouches[i]); + } + + // cleanup removed touches + if (type & (INPUT_END | INPUT_CANCEL)) { + delete targetIds[changedTouches[i].identifier]; + } + i++; + } + + if (!changedTargetTouches.length) { + return; + } + + return [ + // merge targetTouches with changedTargetTouches so it contains ALL touches, including 'end' and 'cancel' + uniqueArray(targetTouches.concat(changedTargetTouches), 'identifier', true), + changedTargetTouches + ]; +} + +/** + * Combined touch and mouse input + * + * Touch has a higher priority then mouse, and while touching no mouse events are allowed. + * This because touch devices also emit mouse events while doing a touch. + * + * @constructor + * @extends Input + */ + +var DEDUP_TIMEOUT = 2500; +var DEDUP_DISTANCE = 25; + +function TouchMouseInput() { + Input.apply(this, arguments); + + var handler = bindFn(this.handler, this); + this.touch = new TouchInput(this.manager, handler); + this.mouse = new MouseInput(this.manager, handler); + + this.primaryTouch = null; + this.lastTouches = []; +} + +inherit(TouchMouseInput, Input, { + /** + * handle mouse and touch events + * @param {Hammer} manager + * @param {String} inputEvent + * @param {Object} inputData + */ + handler: function TMEhandler(manager, inputEvent, inputData) { + var isTouch = (inputData.pointerType == INPUT_TYPE_TOUCH), + isMouse = (inputData.pointerType == INPUT_TYPE_MOUSE); + + if (isMouse && inputData.sourceCapabilities && inputData.sourceCapabilities.firesTouchEvents) { + return; + } + + // when we're in a touch event, record touches to de-dupe synthetic mouse event + if (isTouch) { + recordTouches.call(this, inputEvent, inputData); + } else if (isMouse && isSyntheticEvent.call(this, inputData)) { + return; + } + + this.callback(manager, inputEvent, inputData); + }, + + /** + * remove the event listeners + */ + destroy: function destroy() { + this.touch.destroy(); + this.mouse.destroy(); + } +}); + +function recordTouches(eventType, eventData) { + if (eventType & INPUT_START) { + this.primaryTouch = eventData.changedPointers[0].identifier; + setLastTouch.call(this, eventData); + } else if (eventType & (INPUT_END | INPUT_CANCEL)) { + setLastTouch.call(this, eventData); + } +} + +function setLastTouch(eventData) { + var touch = eventData.changedPointers[0]; + + if (touch.identifier === this.primaryTouch) { + var lastTouch = {x: touch.clientX, y: touch.clientY}; + this.lastTouches.push(lastTouch); + var lts = this.lastTouches; + var removeLastTouch = function() { + var i = lts.indexOf(lastTouch); + if (i > -1) { + lts.splice(i, 1); + } + }; + setTimeout(removeLastTouch, DEDUP_TIMEOUT); + } +} + +function isSyntheticEvent(eventData) { + var x = eventData.srcEvent.clientX, y = eventData.srcEvent.clientY; + for (var i = 0; i < this.lastTouches.length; i++) { + var t = this.lastTouches[i]; + var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y); + if (dx <= DEDUP_DISTANCE && dy <= DEDUP_DISTANCE) { + return true; + } + } + return false; +} + +var PREFIXED_TOUCH_ACTION = prefixed(TEST_ELEMENT.style, 'touchAction'); +var NATIVE_TOUCH_ACTION = PREFIXED_TOUCH_ACTION !== undefined; + +// magical touchAction value +var TOUCH_ACTION_COMPUTE = 'compute'; +var TOUCH_ACTION_AUTO = 'auto'; +var TOUCH_ACTION_MANIPULATION = 'manipulation'; // not implemented +var TOUCH_ACTION_NONE = 'none'; +var TOUCH_ACTION_PAN_X = 'pan-x'; +var TOUCH_ACTION_PAN_Y = 'pan-y'; +var TOUCH_ACTION_MAP = getTouchActionProps(); + +/** + * Touch Action + * sets the touchAction property or uses the js alternative + * @param {Manager} manager + * @param {String} value + * @constructor + */ +function TouchAction(manager, value) { + this.manager = manager; + this.set(value); +} + +TouchAction.prototype = { + /** + * set the touchAction value on the element or enable the polyfill + * @param {String} value + */ + set: function(value) { + // find out the touch-action by the event handlers + if (value == TOUCH_ACTION_COMPUTE) { + value = this.compute(); + } + + if (NATIVE_TOUCH_ACTION && this.manager.element.style && TOUCH_ACTION_MAP[value]) { + this.manager.element.style[PREFIXED_TOUCH_ACTION] = value; + } + this.actions = value.toLowerCase().trim(); + }, + + /** + * just re-set the touchAction value + */ + update: function() { + this.set(this.manager.options.touchAction); + }, + + /** + * compute the value for the touchAction property based on the recognizer's settings + * @returns {String} value + */ + compute: function() { + var actions = []; + each(this.manager.recognizers, function(recognizer) { + if (boolOrFn(recognizer.options.enable, [recognizer])) { + actions = actions.concat(recognizer.getTouchAction()); + } + }); + return cleanTouchActions(actions.join(' ')); + }, + + /** + * this method is called on each input cycle and provides the preventing of the browser behavior + * @param {Object} input + */ + preventDefaults: function(input) { + var srcEvent = input.srcEvent; + var direction = input.offsetDirection; + + // if the touch action did prevented once this session + if (this.manager.session.prevented) { + srcEvent.preventDefault(); + return; + } + + var actions = this.actions; + var hasNone = inStr(actions, TOUCH_ACTION_NONE) && !TOUCH_ACTION_MAP[TOUCH_ACTION_NONE]; + var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_Y]; + var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_X]; + + if (hasNone) { + //do not prevent defaults if this is a tap gesture + + var isTapPointer = input.pointers.length === 1; + var isTapMovement = input.distance < 2; + var isTapTouchTime = input.deltaTime < 250; + + if (isTapPointer && isTapMovement && isTapTouchTime) { + return; + } + } + + if (hasPanX && hasPanY) { + // `pan-x pan-y` means browser handles all scrolling/panning, do not prevent + return; + } + + if (hasNone || + (hasPanY && direction & DIRECTION_HORIZONTAL) || + (hasPanX && direction & DIRECTION_VERTICAL)) { + return this.preventSrc(srcEvent); + } + }, + + /** + * call preventDefault to prevent the browser's default behavior (scrolling in most cases) + * @param {Object} srcEvent + */ + preventSrc: function(srcEvent) { + this.manager.session.prevented = true; + srcEvent.preventDefault(); + } +}; + +/** + * when the touchActions are collected they are not a valid value, so we need to clean things up. * + * @param {String} actions + * @returns {*} + */ +function cleanTouchActions(actions) { + // none + if (inStr(actions, TOUCH_ACTION_NONE)) { + return TOUCH_ACTION_NONE; + } + + var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X); + var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y); + + // if both pan-x and pan-y are set (different recognizers + // for different directions, e.g. horizontal pan but vertical swipe?) + // we need none (as otherwise with pan-x pan-y combined none of these + // recognizers will work, since the browser would handle all panning + if (hasPanX && hasPanY) { + return TOUCH_ACTION_NONE; + } + + // pan-x OR pan-y + if (hasPanX || hasPanY) { + return hasPanX ? TOUCH_ACTION_PAN_X : TOUCH_ACTION_PAN_Y; + } + + // manipulation + if (inStr(actions, TOUCH_ACTION_MANIPULATION)) { + return TOUCH_ACTION_MANIPULATION; + } + + return TOUCH_ACTION_AUTO; +} + +function getTouchActionProps() { + if (!NATIVE_TOUCH_ACTION) { + return false; + } + var touchMap = {}; + var cssSupports = window.CSS && window.CSS.supports; + ['auto', 'manipulation', 'pan-y', 'pan-x', 'pan-x pan-y', 'none'].forEach(function(val) { + + // If css.supports is not supported but there is native touch-action assume it supports + // all values. This is the case for IE 10 and 11. + touchMap[val] = cssSupports ? window.CSS.supports('touch-action', val) : true; + }); + return touchMap; +} + +/** + * Recognizer flow explained; * + * All recognizers have the initial state of POSSIBLE when a input session starts. + * The definition of a input session is from the first input until the last input, with all it's movement in it. * + * Example session for mouse-input: mousedown -> mousemove -> mouseup + * + * On each recognizing cycle (see Manager.recognize) the .recognize() method is executed + * which determines with state it should be. + * + * If the recognizer has the state FAILED, CANCELLED or RECOGNIZED (equals ENDED), it is reset to + * POSSIBLE to give it another change on the next cycle. + * + * Possible + * | + * +-----+---------------+ + * | | + * +-----+-----+ | + * | | | + * Failed Cancelled | + * +-------+------+ + * | | + * Recognized Began + * | + * Changed + * | + * Ended/Recognized + */ +var STATE_POSSIBLE = 1; +var STATE_BEGAN = 2; +var STATE_CHANGED = 4; +var STATE_ENDED = 8; +var STATE_RECOGNIZED = STATE_ENDED; +var STATE_CANCELLED = 16; +var STATE_FAILED = 32; + +/** + * Recognizer + * Every recognizer needs to extend from this class. + * @constructor + * @param {Object} options + */ +function Recognizer(options) { + this.options = assign({}, this.defaults, options || {}); + + this.id = uniqueId(); + + this.manager = null; + + // default is enable true + this.options.enable = ifUndefined(this.options.enable, true); + + this.state = STATE_POSSIBLE; + + this.simultaneous = {}; + this.requireFail = []; +} + +Recognizer.prototype = { + /** + * @virtual + * @type {Object} + */ + defaults: {}, + + /** + * set options + * @param {Object} options + * @return {Recognizer} + */ + set: function(options) { + assign(this.options, options); + + // also update the touchAction, in case something changed about the directions/enabled state + this.manager && this.manager.touchAction.update(); + return this; + }, + + /** + * recognize simultaneous with an other recognizer. + * @param {Recognizer} otherRecognizer + * @returns {Recognizer} this + */ + recognizeWith: function(otherRecognizer) { + if (invokeArrayArg(otherRecognizer, 'recognizeWith', this)) { + return this; + } + + var simultaneous = this.simultaneous; + otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this); + if (!simultaneous[otherRecognizer.id]) { + simultaneous[otherRecognizer.id] = otherRecognizer; + otherRecognizer.recognizeWith(this); + } + return this; + }, + + /** + * drop the simultaneous link. it doesnt remove the link on the other recognizer. + * @param {Recognizer} otherRecognizer + * @returns {Recognizer} this + */ + dropRecognizeWith: function(otherRecognizer) { + if (invokeArrayArg(otherRecognizer, 'dropRecognizeWith', this)) { + return this; + } + + otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this); + delete this.simultaneous[otherRecognizer.id]; + return this; + }, + + /** + * recognizer can only run when an other is failing + * @param {Recognizer} otherRecognizer + * @returns {Recognizer} this + */ + requireFailure: function(otherRecognizer) { + if (invokeArrayArg(otherRecognizer, 'requireFailure', this)) { + return this; + } + + var requireFail = this.requireFail; + otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this); + if (inArray(requireFail, otherRecognizer) === -1) { + requireFail.push(otherRecognizer); + otherRecognizer.requireFailure(this); + } + return this; + }, + + /** + * drop the requireFailure link. it does not remove the link on the other recognizer. + * @param {Recognizer} otherRecognizer + * @returns {Recognizer} this + */ + dropRequireFailure: function(otherRecognizer) { + if (invokeArrayArg(otherRecognizer, 'dropRequireFailure', this)) { + return this; + } + + otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this); + var index = inArray(this.requireFail, otherRecognizer); + if (index > -1) { + this.requireFail.splice(index, 1); + } + return this; + }, + + /** + * has require failures boolean + * @returns {boolean} + */ + hasRequireFailures: function() { + return this.requireFail.length > 0; + }, + + /** + * if the recognizer can recognize simultaneous with an other recognizer + * @param {Recognizer} otherRecognizer + * @returns {Boolean} + */ + canRecognizeWith: function(otherRecognizer) { + return !!this.simultaneous[otherRecognizer.id]; + }, + + /** + * You should use `tryEmit` instead of `emit` directly to check + * that all the needed recognizers has failed before emitting. + * @param {Object} input + */ + emit: function(input) { + var self = this; + var state = this.state; + + function emit(event) { + self.manager.emit(event, input); + } + + // 'panstart' and 'panmove' + if (state < STATE_ENDED) { + emit(self.options.event + stateStr(state)); + } + + emit(self.options.event); // simple 'eventName' events + + if (input.additionalEvent) { // additional event(panleft, panright, pinchin, pinchout...) + emit(input.additionalEvent); + } + + // panend and pancancel + if (state >= STATE_ENDED) { + emit(self.options.event + stateStr(state)); + } + }, + + /** + * Check that all the require failure recognizers has failed, + * if true, it emits a gesture event, + * otherwise, setup the state to FAILED. + * @param {Object} input + */ + tryEmit: function(input) { + if (this.canEmit()) { + return this.emit(input); + } + // it's failing anyway + this.state = STATE_FAILED; + }, + + /** + * can we emit? + * @returns {boolean} + */ + canEmit: function() { + var i = 0; + while (i < this.requireFail.length) { + if (!(this.requireFail[i].state & (STATE_FAILED | STATE_POSSIBLE))) { + return false; + } + i++; + } + return true; + }, + + /** + * update the recognizer + * @param {Object} inputData + */ + recognize: function(inputData) { + // make a new copy of the inputData + // so we can change the inputData without messing up the other recognizers + var inputDataClone = assign({}, inputData); + + // is is enabled and allow recognizing? + if (!boolOrFn(this.options.enable, [this, inputDataClone])) { + this.reset(); + this.state = STATE_FAILED; + return; + } + + // reset when we've reached the end + if (this.state & (STATE_RECOGNIZED | STATE_CANCELLED | STATE_FAILED)) { + this.state = STATE_POSSIBLE; + } + + this.state = this.process(inputDataClone); + + // the recognizer has recognized a gesture + // so trigger an event + if (this.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED | STATE_CANCELLED)) { + this.tryEmit(inputDataClone); + } + }, + + /** + * return the state of the recognizer + * the actual recognizing happens in this method + * @virtual + * @param {Object} inputData + * @returns {Const} STATE + */ + process: function(inputData) { }, // jshint ignore:line + + /** + * return the preferred touch-action + * @virtual + * @returns {Array} + */ + getTouchAction: function() { }, + + /** + * called when the gesture isn't allowed to recognize + * like when another is being recognized or it is disabled + * @virtual + */ + reset: function() { } +}; + +/** + * get a usable string, used as event postfix + * @param {Const} state + * @returns {String} state + */ +function stateStr(state) { + if (state & STATE_CANCELLED) { + return 'cancel'; + } else if (state & STATE_ENDED) { + return 'end'; + } else if (state & STATE_CHANGED) { + return 'move'; + } else if (state & STATE_BEGAN) { + return 'start'; + } + return ''; +} + +/** + * direction cons to string + * @param {Const} direction + * @returns {String} + */ +function directionStr(direction) { + if (direction == DIRECTION_DOWN) { + return 'down'; + } else if (direction == DIRECTION_UP) { + return 'up'; + } else if (direction == DIRECTION_LEFT) { + return 'left'; + } else if (direction == DIRECTION_RIGHT) { + return 'right'; + } + return ''; +} + +/** + * get a recognizer by name if it is bound to a manager + * @param {Recognizer|String} otherRecognizer + * @param {Recognizer} recognizer + * @returns {Recognizer} + */ +function getRecognizerByNameIfManager(otherRecognizer, recognizer) { + var manager = recognizer.manager; + if (manager) { + return manager.get(otherRecognizer); + } + return otherRecognizer; +} + +/** + * This recognizer is just used as a base for the simple attribute recognizers. + * @constructor + * @extends Recognizer + */ +function AttrRecognizer() { + Recognizer.apply(this, arguments); +} + +inherit(AttrRecognizer, Recognizer, { + /** + * @namespace + * @memberof AttrRecognizer + */ + defaults: { + /** + * @type {Number} + * @default 1 + */ + pointers: 1 + }, + + /** + * Used to check if it the recognizer receives valid input, like input.distance > 10. + * @memberof AttrRecognizer + * @param {Object} input + * @returns {Boolean} recognized + */ + attrTest: function(input) { + var optionPointers = this.options.pointers; + return optionPointers === 0 || input.pointers.length === optionPointers; + }, + + /** + * Process the input and return the state for the recognizer + * @memberof AttrRecognizer + * @param {Object} input + * @returns {*} State + */ + process: function(input) { + var state = this.state; + var eventType = input.eventType; + + var isRecognized = state & (STATE_BEGAN | STATE_CHANGED); + var isValid = this.attrTest(input); + + // on cancel input and we've recognized before, return STATE_CANCELLED + if (isRecognized && (eventType & INPUT_CANCEL || !isValid)) { + return state | STATE_CANCELLED; + } else if (isRecognized || isValid) { + if (eventType & INPUT_END) { + return state | STATE_ENDED; + } else if (!(state & STATE_BEGAN)) { + return STATE_BEGAN; + } + return state | STATE_CHANGED; + } + return STATE_FAILED; + } +}); + +/** + * Pan + * Recognized when the pointer is down and moved in the allowed direction. + * @constructor + * @extends AttrRecognizer + */ +function PanRecognizer() { + AttrRecognizer.apply(this, arguments); + + this.pX = null; + this.pY = null; +} + +inherit(PanRecognizer, AttrRecognizer, { + /** + * @namespace + * @memberof PanRecognizer + */ + defaults: { + event: 'pan', + threshold: 10, + pointers: 1, + direction: DIRECTION_ALL + }, + + getTouchAction: function() { + var direction = this.options.direction; + var actions = []; + if (direction & DIRECTION_HORIZONTAL) { + actions.push(TOUCH_ACTION_PAN_Y); + } + if (direction & DIRECTION_VERTICAL) { + actions.push(TOUCH_ACTION_PAN_X); + } + return actions; + }, + + directionTest: function(input) { + var options = this.options; + var hasMoved = true; + var distance = input.distance; + var direction = input.direction; + var x = input.deltaX; + var y = input.deltaY; + + // lock to axis? + if (!(direction & options.direction)) { + if (options.direction & DIRECTION_HORIZONTAL) { + direction = (x === 0) ? DIRECTION_NONE : (x < 0) ? DIRECTION_LEFT : DIRECTION_RIGHT; + hasMoved = x != this.pX; + distance = Math.abs(input.deltaX); + } else { + direction = (y === 0) ? DIRECTION_NONE : (y < 0) ? DIRECTION_UP : DIRECTION_DOWN; + hasMoved = y != this.pY; + distance = Math.abs(input.deltaY); + } + } + input.direction = direction; + return hasMoved && distance > options.threshold && direction & options.direction; + }, + + attrTest: function(input) { + return AttrRecognizer.prototype.attrTest.call(this, input) && + (this.state & STATE_BEGAN || (!(this.state & STATE_BEGAN) && this.directionTest(input))); + }, + + emit: function(input) { + + this.pX = input.deltaX; + this.pY = input.deltaY; + + var direction = directionStr(input.direction); + + if (direction) { + input.additionalEvent = this.options.event + direction; + } + this._super.emit.call(this, input); + } +}); + +/** + * Pinch + * Recognized when two or more pointers are moving toward (zoom-in) or away from each other (zoom-out). + * @constructor + * @extends AttrRecognizer + */ +function PinchRecognizer() { + AttrRecognizer.apply(this, arguments); +} + +inherit(PinchRecognizer, AttrRecognizer, { + /** + * @namespace + * @memberof PinchRecognizer + */ + defaults: { + event: 'pinch', + threshold: 0, + pointers: 2 + }, + + getTouchAction: function() { + return [TOUCH_ACTION_NONE]; + }, + + attrTest: function(input) { + return this._super.attrTest.call(this, input) && + (Math.abs(input.scale - 1) > this.options.threshold || this.state & STATE_BEGAN); + }, + + emit: function(input) { + if (input.scale !== 1) { + var inOut = input.scale < 1 ? 'in' : 'out'; + input.additionalEvent = this.options.event + inOut; + } + this._super.emit.call(this, input); + } +}); + +/** + * Press + * Recognized when the pointer is down for x ms without any movement. + * @constructor + * @extends Recognizer + */ +function PressRecognizer() { + Recognizer.apply(this, arguments); + + this._timer = null; + this._input = null; +} + +inherit(PressRecognizer, Recognizer, { + /** + * @namespace + * @memberof PressRecognizer + */ + defaults: { + event: 'press', + pointers: 1, + time: 251, // minimal time of the pointer to be pressed + threshold: 9 // a minimal movement is ok, but keep it low + }, + + getTouchAction: function() { + return [TOUCH_ACTION_AUTO]; + }, + + process: function(input) { + var options = this.options; + var validPointers = input.pointers.length === options.pointers; + var validMovement = input.distance < options.threshold; + var validTime = input.deltaTime > options.time; + + this._input = input; + + // we only allow little movement + // and we've reached an end event, so a tap is possible + if (!validMovement || !validPointers || (input.eventType & (INPUT_END | INPUT_CANCEL) && !validTime)) { + this.reset(); + } else if (input.eventType & INPUT_START) { + this.reset(); + this._timer = setTimeoutContext(function() { + this.state = STATE_RECOGNIZED; + this.tryEmit(); + }, options.time, this); + } else if (input.eventType & INPUT_END) { + return STATE_RECOGNIZED; + } + return STATE_FAILED; + }, + + reset: function() { + clearTimeout(this._timer); + }, + + emit: function(input) { + if (this.state !== STATE_RECOGNIZED) { + return; + } + + if (input && (input.eventType & INPUT_END)) { + this.manager.emit(this.options.event + 'up', input); + } else { + this._input.timeStamp = now(); + this.manager.emit(this.options.event, this._input); + } + } +}); + +/** + * Rotate + * Recognized when two or more pointer are moving in a circular motion. + * @constructor + * @extends AttrRecognizer + */ +function RotateRecognizer() { + AttrRecognizer.apply(this, arguments); +} + +inherit(RotateRecognizer, AttrRecognizer, { + /** + * @namespace + * @memberof RotateRecognizer + */ + defaults: { + event: 'rotate', + threshold: 0, + pointers: 2 + }, + + getTouchAction: function() { + return [TOUCH_ACTION_NONE]; + }, + + attrTest: function(input) { + return this._super.attrTest.call(this, input) && + (Math.abs(input.rotation) > this.options.threshold || this.state & STATE_BEGAN); + } +}); + +/** + * Swipe + * Recognized when the pointer is moving fast (velocity), with enough distance in the allowed direction. + * @constructor + * @extends AttrRecognizer + */ +function SwipeRecognizer() { + AttrRecognizer.apply(this, arguments); +} + +inherit(SwipeRecognizer, AttrRecognizer, { + /** + * @namespace + * @memberof SwipeRecognizer + */ + defaults: { + event: 'swipe', + threshold: 10, + velocity: 0.3, + direction: DIRECTION_HORIZONTAL | DIRECTION_VERTICAL, + pointers: 1 + }, + + getTouchAction: function() { + return PanRecognizer.prototype.getTouchAction.call(this); + }, + + attrTest: function(input) { + var direction = this.options.direction; + var velocity; + + if (direction & (DIRECTION_HORIZONTAL | DIRECTION_VERTICAL)) { + velocity = input.overallVelocity; + } else if (direction & DIRECTION_HORIZONTAL) { + velocity = input.overallVelocityX; + } else if (direction & DIRECTION_VERTICAL) { + velocity = input.overallVelocityY; + } + + return this._super.attrTest.call(this, input) && + direction & input.offsetDirection && + input.distance > this.options.threshold && + input.maxPointers == this.options.pointers && + abs(velocity) > this.options.velocity && input.eventType & INPUT_END; + }, + + emit: function(input) { + var direction = directionStr(input.offsetDirection); + if (direction) { + this.manager.emit(this.options.event + direction, input); + } + + this.manager.emit(this.options.event, input); + } +}); + +/** + * A tap is ecognized when the pointer is doing a small tap/click. Multiple taps are recognized if they occur + * between the given interval and position. The delay option can be used to recognize multi-taps without firing + * a single tap. + * + * The eventData from the emitted event contains the property `tapCount`, which contains the amount of + * multi-taps being recognized. + * @constructor + * @extends Recognizer + */ +function TapRecognizer() { + Recognizer.apply(this, arguments); + + // previous time and center, + // used for tap counting + this.pTime = false; + this.pCenter = false; + + this._timer = null; + this._input = null; + this.count = 0; +} + +inherit(TapRecognizer, Recognizer, { + /** + * @namespace + * @memberof PinchRecognizer + */ + defaults: { + event: 'tap', + pointers: 1, + taps: 1, + interval: 300, // max time between the multi-tap taps + time: 250, // max time of the pointer to be down (like finger on the screen) + threshold: 9, // a minimal movement is ok, but keep it low + posThreshold: 10 // a multi-tap can be a bit off the initial position + }, + + getTouchAction: function() { + return [TOUCH_ACTION_MANIPULATION]; + }, + + process: function(input) { + var options = this.options; + + var validPointers = input.pointers.length === options.pointers; + var validMovement = input.distance < options.threshold; + var validTouchTime = input.deltaTime < options.time; + + this.reset(); + + if ((input.eventType & INPUT_START) && (this.count === 0)) { + return this.failTimeout(); + } + + // we only allow little movement + // and we've reached an end event, so a tap is possible + if (validMovement && validTouchTime && validPointers) { + if (input.eventType != INPUT_END) { + return this.failTimeout(); + } + + var validInterval = this.pTime ? (input.timeStamp - this.pTime < options.interval) : true; + var validMultiTap = !this.pCenter || getDistance(this.pCenter, input.center) < options.posThreshold; + + this.pTime = input.timeStamp; + this.pCenter = input.center; + + if (!validMultiTap || !validInterval) { + this.count = 1; + } else { + this.count += 1; + } + + this._input = input; + + // if tap count matches we have recognized it, + // else it has began recognizing... + var tapCount = this.count % options.taps; + if (tapCount === 0) { + // no failing requirements, immediately trigger the tap event + // or wait as long as the multitap interval to trigger + if (!this.hasRequireFailures()) { + return STATE_RECOGNIZED; + } else { + this._timer = setTimeoutContext(function() { + this.state = STATE_RECOGNIZED; + this.tryEmit(); + }, options.interval, this); + return STATE_BEGAN; + } + } + } + return STATE_FAILED; + }, + + failTimeout: function() { + this._timer = setTimeoutContext(function() { + this.state = STATE_FAILED; + }, this.options.interval, this); + return STATE_FAILED; + }, + + reset: function() { + clearTimeout(this._timer); + }, + + emit: function() { + if (this.state == STATE_RECOGNIZED) { + this._input.tapCount = this.count; + this.manager.emit(this.options.event, this._input); + } + } +}); + +/** + * Simple way to create a manager with a default set of recognizers. + * @param {HTMLElement} element + * @param {Object} [options] + * @constructor + */ +function Hammer(element, options) { + options = options || {}; + options.recognizers = ifUndefined(options.recognizers, Hammer.defaults.preset); + return new Manager(element, options); +} + +/** + * @const {string} + */ +Hammer.VERSION = '2.0.7'; + +/** + * default settings + * @namespace + */ +Hammer.defaults = { + /** + * set if DOM events are being triggered. + * But this is slower and unused by simple implementations, so disabled by default. + * @type {Boolean} + * @default false + */ + domEvents: false, + + /** + * The value for the touchAction property/fallback. + * When set to `compute` it will magically set the correct value based on the added recognizers. + * @type {String} + * @default compute + */ + touchAction: TOUCH_ACTION_COMPUTE, + + /** + * @type {Boolean} + * @default true + */ + enable: true, + + /** + * EXPERIMENTAL FEATURE -- can be removed/changed + * Change the parent input target element. + * If Null, then it is being set the to main element. + * @type {Null|EventTarget} + * @default null + */ + inputTarget: null, + + /** + * force an input class + * @type {Null|Function} + * @default null + */ + inputClass: null, + + /** + * Default recognizer setup when calling `Hammer()` + * When creating a new Manager these will be skipped. + * @type {Array} + */ + preset: [ + // RecognizerClass, options, [recognizeWith, ...], [requireFailure, ...] + [RotateRecognizer, {enable: false}], + [PinchRecognizer, {enable: false}, ['rotate']], + [SwipeRecognizer, {direction: DIRECTION_HORIZONTAL}], + [PanRecognizer, {direction: DIRECTION_HORIZONTAL}, ['swipe']], + [TapRecognizer], + [TapRecognizer, {event: 'doubletap', taps: 2}, ['tap']], + [PressRecognizer] + ], + + /** + * Some CSS properties can be used to improve the working of Hammer. + * Add them to this method and they will be set when creating a new Manager. + * @namespace + */ + cssProps: { + /** + * Disables text selection to improve the dragging gesture. Mainly for desktop browsers. + * @type {String} + * @default 'none' + */ + userSelect: 'none', + + /** + * Disable the Windows Phone grippers when pressing an element. + * @type {String} + * @default 'none' + */ + touchSelect: 'none', + + /** + * Disables the default callout shown when you touch and hold a touch target. + * On iOS, when you touch and hold a touch target such as a link, Safari displays + * a callout containing information about the link. This property allows you to disable that callout. + * @type {String} + * @default 'none' + */ + touchCallout: 'none', + + /** + * Specifies whether zooming is enabled. Used by IE10> + * @type {String} + * @default 'none' + */ + contentZooming: 'none', + + /** + * Specifies that an entire element should be draggable instead of its contents. Mainly for desktop browsers. + * @type {String} + * @default 'none' + */ + userDrag: 'none', + + /** + * Overrides the highlight color shown when the user taps a link or a JavaScript + * clickable element in iOS. This property obeys the alpha value, if specified. + * @type {String} + * @default 'rgba(0,0,0,0)' + */ + tapHighlightColor: 'rgba(0,0,0,0)' + } +}; + +var STOP = 1; +var FORCED_STOP = 2; + +/** + * Manager + * @param {HTMLElement} element + * @param {Object} [options] + * @constructor + */ +function Manager(element, options) { + this.options = assign({}, Hammer.defaults, options || {}); + + this.options.inputTarget = this.options.inputTarget || element; + + this.handlers = {}; + this.session = {}; + this.recognizers = []; + this.oldCssProps = {}; + + this.element = element; + this.input = createInputInstance(this); + this.touchAction = new TouchAction(this, this.options.touchAction); + + toggleCssProps(this, true); + + each(this.options.recognizers, function(item) { + var recognizer = this.add(new (item[0])(item[1])); + item[2] && recognizer.recognizeWith(item[2]); + item[3] && recognizer.requireFailure(item[3]); + }, this); +} + +Manager.prototype = { + /** + * set options + * @param {Object} options + * @returns {Manager} + */ + set: function(options) { + assign(this.options, options); + + // Options that need a little more setup + if (options.touchAction) { + this.touchAction.update(); + } + if (options.inputTarget) { + // Clean up existing event listeners and reinitialize + this.input.destroy(); + this.input.target = options.inputTarget; + this.input.init(); + } + return this; + }, + + /** + * stop recognizing for this session. + * This session will be discarded, when a new [input]start event is fired. + * When forced, the recognizer cycle is stopped immediately. + * @param {Boolean} [force] + */ + stop: function(force) { + this.session.stopped = force ? FORCED_STOP : STOP; + }, + + /** + * run the recognizers! + * called by the inputHandler function on every movement of the pointers (touches) + * it walks through all the recognizers and tries to detect the gesture that is being made + * @param {Object} inputData + */ + recognize: function(inputData) { + var session = this.session; + if (session.stopped) { + return; + } + + // run the touch-action polyfill + this.touchAction.preventDefaults(inputData); + + var recognizer; + var recognizers = this.recognizers; + + // this holds the recognizer that is being recognized. + // so the recognizer's state needs to be BEGAN, CHANGED, ENDED or RECOGNIZED + // if no recognizer is detecting a thing, it is set to `null` + var curRecognizer = session.curRecognizer; + + // reset when the last recognizer is recognized + // or when we're in a new session + if (!curRecognizer || (curRecognizer && curRecognizer.state & STATE_RECOGNIZED)) { + curRecognizer = session.curRecognizer = null; + } + + var i = 0; + while (i < recognizers.length) { + recognizer = recognizers[i]; + + // find out if we are allowed try to recognize the input for this one. + // 1. allow if the session is NOT forced stopped (see the .stop() method) + // 2. allow if we still haven't recognized a gesture in this session, or the this recognizer is the one + // that is being recognized. + // 3. allow if the recognizer is allowed to run simultaneous with the current recognized recognizer. + // this can be setup with the `recognizeWith()` method on the recognizer. + if (session.stopped !== FORCED_STOP && ( // 1 + !curRecognizer || recognizer == curRecognizer || // 2 + recognizer.canRecognizeWith(curRecognizer))) { // 3 + recognizer.recognize(inputData); + } else { + recognizer.reset(); + } + + // if the recognizer has been recognizing the input as a valid gesture, we want to store this one as the + // current active recognizer. but only if we don't already have an active recognizer + if (!curRecognizer && recognizer.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED)) { + curRecognizer = session.curRecognizer = recognizer; + } + i++; + } + }, + + /** + * get a recognizer by its event name. + * @param {Recognizer|String} recognizer + * @returns {Recognizer|Null} + */ + get: function(recognizer) { + if (recognizer instanceof Recognizer) { + return recognizer; + } + + var recognizers = this.recognizers; + for (var i = 0; i < recognizers.length; i++) { + if (recognizers[i].options.event == recognizer) { + return recognizers[i]; + } + } + return null; + }, + + /** + * add a recognizer to the manager + * existing recognizers with the same event name will be removed + * @param {Recognizer} recognizer + * @returns {Recognizer|Manager} + */ + add: function(recognizer) { + if (invokeArrayArg(recognizer, 'add', this)) { + return this; + } + + // remove existing + var existing = this.get(recognizer.options.event); + if (existing) { + this.remove(existing); + } + + this.recognizers.push(recognizer); + recognizer.manager = this; + + this.touchAction.update(); + return recognizer; + }, + + /** + * remove a recognizer by name or instance + * @param {Recognizer|String} recognizer + * @returns {Manager} + */ + remove: function(recognizer) { + if (invokeArrayArg(recognizer, 'remove', this)) { + return this; + } + + recognizer = this.get(recognizer); + + // let's make sure this recognizer exists + if (recognizer) { + var recognizers = this.recognizers; + var index = inArray(recognizers, recognizer); + + if (index !== -1) { + recognizers.splice(index, 1); + this.touchAction.update(); + } + } + + return this; + }, + + /** + * bind event + * @param {String} events + * @param {Function} handler + * @returns {EventEmitter} this + */ + on: function(events, handler) { + if (events === undefined) { + return; + } + if (handler === undefined) { + return; + } + + var handlers = this.handlers; + each(splitStr(events), function(event) { + handlers[event] = handlers[event] || []; + handlers[event].push(handler); + }); + return this; + }, + + /** + * unbind event, leave emit blank to remove all handlers + * @param {String} events + * @param {Function} [handler] + * @returns {EventEmitter} this + */ + off: function(events, handler) { + if (events === undefined) { + return; + } + + var handlers = this.handlers; + each(splitStr(events), function(event) { + if (!handler) { + delete handlers[event]; + } else { + handlers[event] && handlers[event].splice(inArray(handlers[event], handler), 1); + } + }); + return this; + }, + + /** + * emit event to the listeners + * @param {String} event + * @param {Object} data + */ + emit: function(event, data) { + // we also want to trigger dom events + if (this.options.domEvents) { + triggerDomEvent(event, data); + } + + // no handlers, so skip it all + var handlers = this.handlers[event] && this.handlers[event].slice(); + if (!handlers || !handlers.length) { + return; + } + + data.type = event; + data.preventDefault = function() { + data.srcEvent.preventDefault(); + }; + + var i = 0; + while (i < handlers.length) { + handlers[i](data); + i++; + } + }, + + /** + * destroy the manager and unbinds all events + * it doesn't unbind dom events, that is the user own responsibility + */ + destroy: function() { + this.element && toggleCssProps(this, false); + + this.handlers = {}; + this.session = {}; + this.input.destroy(); + this.element = null; + } +}; + +/** + * add/remove the css properties as defined in manager.options.cssProps + * @param {Manager} manager + * @param {Boolean} add + */ +function toggleCssProps(manager, add) { + var element = manager.element; + if (!element.style) { + return; + } + var prop; + each(manager.options.cssProps, function(value, name) { + prop = prefixed(element.style, name); + if (add) { + manager.oldCssProps[prop] = element.style[prop]; + element.style[prop] = value; + } else { + element.style[prop] = manager.oldCssProps[prop] || ''; + } + }); + if (!add) { + manager.oldCssProps = {}; + } +} + +/** + * trigger dom event + * @param {String} event + * @param {Object} data + */ +function triggerDomEvent(event, data) { + var gestureEvent = document.createEvent('Event'); + gestureEvent.initEvent(event, true, true); + gestureEvent.gesture = data; + data.target.dispatchEvent(gestureEvent); +} + +assign(Hammer, { + INPUT_START: INPUT_START, + INPUT_MOVE: INPUT_MOVE, + INPUT_END: INPUT_END, + INPUT_CANCEL: INPUT_CANCEL, + + STATE_POSSIBLE: STATE_POSSIBLE, + STATE_BEGAN: STATE_BEGAN, + STATE_CHANGED: STATE_CHANGED, + STATE_ENDED: STATE_ENDED, + STATE_RECOGNIZED: STATE_RECOGNIZED, + STATE_CANCELLED: STATE_CANCELLED, + STATE_FAILED: STATE_FAILED, + + DIRECTION_NONE: DIRECTION_NONE, + DIRECTION_LEFT: DIRECTION_LEFT, + DIRECTION_RIGHT: DIRECTION_RIGHT, + DIRECTION_UP: DIRECTION_UP, + DIRECTION_DOWN: DIRECTION_DOWN, + DIRECTION_HORIZONTAL: DIRECTION_HORIZONTAL, + DIRECTION_VERTICAL: DIRECTION_VERTICAL, + DIRECTION_ALL: DIRECTION_ALL, + + Manager: Manager, + Input: Input, + TouchAction: TouchAction, + + TouchInput: TouchInput, + MouseInput: MouseInput, + PointerEventInput: PointerEventInput, + TouchMouseInput: TouchMouseInput, + SingleTouchInput: SingleTouchInput, + + Recognizer: Recognizer, + AttrRecognizer: AttrRecognizer, + Tap: TapRecognizer, + Pan: PanRecognizer, + Swipe: SwipeRecognizer, + Pinch: PinchRecognizer, + Rotate: RotateRecognizer, + Press: PressRecognizer, + + on: addEventListeners, + off: removeEventListeners, + each: each, + merge: merge, + extend: extend, + assign: assign, + inherit: inherit, + bindFn: bindFn, + prefixed: prefixed +}); + +// this prevents errors when Hammer is loaded in the presence of an AMD +// style loader but by script tag, not by the loader. +var freeGlobal = (typeof window !== 'undefined' ? window : (typeof self !== 'undefined' ? self : {})); // jshint ignore:line +freeGlobal.Hammer = Hammer; + +if (typeof define === 'function' && define.amd) { + define(function() { + return Hammer; + }); +} else if (typeof module != 'undefined' && module.exports) { + module.exports = Hammer; +} else { + window[exportName] = Hammer; +} + +})(window, document, 'Hammer'); diff --git a/www/js/hammerjs/hammer.min.js b/www/js/hammerjs/hammer.min.js new file mode 100644 index 0000000..34a8c86 --- /dev/null +++ b/www/js/hammerjs/hammer.min.js @@ -0,0 +1,7 @@ +/*! Hammer.JS - v2.0.7 - 2016-04-22 + * http://hammerjs.github.io/ + * + * Copyright (c) 2016 Jorik Tangelder; + * Licensed under the MIT license */ +!function(a,b,c,d){"use strict";function e(a,b,c){return setTimeout(j(a,c),b)}function f(a,b,c){return Array.isArray(a)?(g(a,c[b],c),!0):!1}function g(a,b,c){var e;if(a)if(a.forEach)a.forEach(b,c);else if(a.length!==d)for(e=0;e\s*\(/gm,"{anonymous}()@"):"Unknown Stack Trace",f=a.console&&(a.console.warn||a.console.log);return f&&f.call(a.console,e,d),b.apply(this,arguments)}}function i(a,b,c){var d,e=b.prototype;d=a.prototype=Object.create(e),d.constructor=a,d._super=e,c&&la(d,c)}function j(a,b){return function(){return a.apply(b,arguments)}}function k(a,b){return typeof a==oa?a.apply(b?b[0]||d:d,b):a}function l(a,b){return a===d?b:a}function m(a,b,c){g(q(b),function(b){a.addEventListener(b,c,!1)})}function n(a,b,c){g(q(b),function(b){a.removeEventListener(b,c,!1)})}function o(a,b){for(;a;){if(a==b)return!0;a=a.parentNode}return!1}function p(a,b){return a.indexOf(b)>-1}function q(a){return a.trim().split(/\s+/g)}function r(a,b,c){if(a.indexOf&&!c)return a.indexOf(b);for(var d=0;dc[b]}):d.sort()),d}function u(a,b){for(var c,e,f=b[0].toUpperCase()+b.slice(1),g=0;g1&&!c.firstMultiple?c.firstMultiple=D(b):1===e&&(c.firstMultiple=!1);var f=c.firstInput,g=c.firstMultiple,h=g?g.center:f.center,i=b.center=E(d);b.timeStamp=ra(),b.deltaTime=b.timeStamp-f.timeStamp,b.angle=I(h,i),b.distance=H(h,i),B(c,b),b.offsetDirection=G(b.deltaX,b.deltaY);var j=F(b.deltaTime,b.deltaX,b.deltaY);b.overallVelocityX=j.x,b.overallVelocityY=j.y,b.overallVelocity=qa(j.x)>qa(j.y)?j.x:j.y,b.scale=g?K(g.pointers,d):1,b.rotation=g?J(g.pointers,d):0,b.maxPointers=c.prevInput?b.pointers.length>c.prevInput.maxPointers?b.pointers.length:c.prevInput.maxPointers:b.pointers.length,C(c,b);var k=a.element;o(b.srcEvent.target,k)&&(k=b.srcEvent.target),b.target=k}function B(a,b){var c=b.center,d=a.offsetDelta||{},e=a.prevDelta||{},f=a.prevInput||{};b.eventType!==Ea&&f.eventType!==Ga||(e=a.prevDelta={x:f.deltaX||0,y:f.deltaY||0},d=a.offsetDelta={x:c.x,y:c.y}),b.deltaX=e.x+(c.x-d.x),b.deltaY=e.y+(c.y-d.y)}function C(a,b){var c,e,f,g,h=a.lastInterval||b,i=b.timeStamp-h.timeStamp;if(b.eventType!=Ha&&(i>Da||h.velocity===d)){var j=b.deltaX-h.deltaX,k=b.deltaY-h.deltaY,l=F(i,j,k);e=l.x,f=l.y,c=qa(l.x)>qa(l.y)?l.x:l.y,g=G(j,k),a.lastInterval=b}else c=h.velocity,e=h.velocityX,f=h.velocityY,g=h.direction;b.velocity=c,b.velocityX=e,b.velocityY=f,b.direction=g}function D(a){for(var b=[],c=0;ce;)c+=a[e].clientX,d+=a[e].clientY,e++;return{x:pa(c/b),y:pa(d/b)}}function F(a,b,c){return{x:b/a||0,y:c/a||0}}function G(a,b){return a===b?Ia:qa(a)>=qa(b)?0>a?Ja:Ka:0>b?La:Ma}function H(a,b,c){c||(c=Qa);var d=b[c[0]]-a[c[0]],e=b[c[1]]-a[c[1]];return Math.sqrt(d*d+e*e)}function I(a,b,c){c||(c=Qa);var d=b[c[0]]-a[c[0]],e=b[c[1]]-a[c[1]];return 180*Math.atan2(e,d)/Math.PI}function J(a,b){return I(b[1],b[0],Ra)+I(a[1],a[0],Ra)}function K(a,b){return H(b[0],b[1],Ra)/H(a[0],a[1],Ra)}function L(){this.evEl=Ta,this.evWin=Ua,this.pressed=!1,x.apply(this,arguments)}function M(){this.evEl=Xa,this.evWin=Ya,x.apply(this,arguments),this.store=this.manager.session.pointerEvents=[]}function N(){this.evTarget=$a,this.evWin=_a,this.started=!1,x.apply(this,arguments)}function O(a,b){var c=s(a.touches),d=s(a.changedTouches);return b&(Ga|Ha)&&(c=t(c.concat(d),"identifier",!0)),[c,d]}function P(){this.evTarget=bb,this.targetIds={},x.apply(this,arguments)}function Q(a,b){var c=s(a.touches),d=this.targetIds;if(b&(Ea|Fa)&&1===c.length)return d[c[0].identifier]=!0,[c,c];var e,f,g=s(a.changedTouches),h=[],i=this.target;if(f=c.filter(function(a){return o(a.target,i)}),b===Ea)for(e=0;e-1&&d.splice(a,1)};setTimeout(e,cb)}}function U(a){for(var b=a.srcEvent.clientX,c=a.srcEvent.clientY,d=0;d=f&&db>=g)return!0}return!1}function V(a,b){this.manager=a,this.set(b)}function W(a){if(p(a,jb))return jb;var b=p(a,kb),c=p(a,lb);return b&&c?jb:b||c?b?kb:lb:p(a,ib)?ib:hb}function X(){if(!fb)return!1;var b={},c=a.CSS&&a.CSS.supports;return["auto","manipulation","pan-y","pan-x","pan-x pan-y","none"].forEach(function(d){b[d]=c?a.CSS.supports("touch-action",d):!0}),b}function Y(a){this.options=la({},this.defaults,a||{}),this.id=v(),this.manager=null,this.options.enable=l(this.options.enable,!0),this.state=nb,this.simultaneous={},this.requireFail=[]}function Z(a){return a&sb?"cancel":a&qb?"end":a&pb?"move":a&ob?"start":""}function $(a){return a==Ma?"down":a==La?"up":a==Ja?"left":a==Ka?"right":""}function _(a,b){var c=b.manager;return c?c.get(a):a}function aa(){Y.apply(this,arguments)}function ba(){aa.apply(this,arguments),this.pX=null,this.pY=null}function ca(){aa.apply(this,arguments)}function da(){Y.apply(this,arguments),this._timer=null,this._input=null}function ea(){aa.apply(this,arguments)}function fa(){aa.apply(this,arguments)}function ga(){Y.apply(this,arguments),this.pTime=!1,this.pCenter=!1,this._timer=null,this._input=null,this.count=0}function ha(a,b){return b=b||{},b.recognizers=l(b.recognizers,ha.defaults.preset),new ia(a,b)}function ia(a,b){this.options=la({},ha.defaults,b||{}),this.options.inputTarget=this.options.inputTarget||a,this.handlers={},this.session={},this.recognizers=[],this.oldCssProps={},this.element=a,this.input=y(this),this.touchAction=new V(this,this.options.touchAction),ja(this,!0),g(this.options.recognizers,function(a){var b=this.add(new a[0](a[1]));a[2]&&b.recognizeWith(a[2]),a[3]&&b.requireFailure(a[3])},this)}function ja(a,b){var c=a.element;if(c.style){var d;g(a.options.cssProps,function(e,f){d=u(c.style,f),b?(a.oldCssProps[d]=c.style[d],c.style[d]=e):c.style[d]=a.oldCssProps[d]||""}),b||(a.oldCssProps={})}}function ka(a,c){var d=b.createEvent("Event");d.initEvent(a,!0,!0),d.gesture=c,c.target.dispatchEvent(d)}var la,ma=["","webkit","Moz","MS","ms","o"],na=b.createElement("div"),oa="function",pa=Math.round,qa=Math.abs,ra=Date.now;la="function"!=typeof Object.assign?function(a){if(a===d||null===a)throw new TypeError("Cannot convert undefined or null to object");for(var b=Object(a),c=1;ch&&(b.push(a),h=b.length-1):e&(Ga|Ha)&&(c=!0),0>h||(b[h]=a,this.callback(this.manager,e,{pointers:b,changedPointers:[a],pointerType:f,srcEvent:a}),c&&b.splice(h,1))}});var Za={touchstart:Ea,touchmove:Fa,touchend:Ga,touchcancel:Ha},$a="touchstart",_a="touchstart touchmove touchend touchcancel";i(N,x,{handler:function(a){var b=Za[a.type];if(b===Ea&&(this.started=!0),this.started){var c=O.call(this,a,b);b&(Ga|Ha)&&c[0].length-c[1].length===0&&(this.started=!1),this.callback(this.manager,b,{pointers:c[0],changedPointers:c[1],pointerType:za,srcEvent:a})}}});var ab={touchstart:Ea,touchmove:Fa,touchend:Ga,touchcancel:Ha},bb="touchstart touchmove touchend touchcancel";i(P,x,{handler:function(a){var b=ab[a.type],c=Q.call(this,a,b);c&&this.callback(this.manager,b,{pointers:c[0],changedPointers:c[1],pointerType:za,srcEvent:a})}});var cb=2500,db=25;i(R,x,{handler:function(a,b,c){var d=c.pointerType==za,e=c.pointerType==Ba;if(!(e&&c.sourceCapabilities&&c.sourceCapabilities.firesTouchEvents)){if(d)S.call(this,b,c);else if(e&&U.call(this,c))return;this.callback(a,b,c)}},destroy:function(){this.touch.destroy(),this.mouse.destroy()}});var eb=u(na.style,"touchAction"),fb=eb!==d,gb="compute",hb="auto",ib="manipulation",jb="none",kb="pan-x",lb="pan-y",mb=X();V.prototype={set:function(a){a==gb&&(a=this.compute()),fb&&this.manager.element.style&&mb[a]&&(this.manager.element.style[eb]=a),this.actions=a.toLowerCase().trim()},update:function(){this.set(this.manager.options.touchAction)},compute:function(){var a=[];return g(this.manager.recognizers,function(b){k(b.options.enable,[b])&&(a=a.concat(b.getTouchAction()))}),W(a.join(" "))},preventDefaults:function(a){var b=a.srcEvent,c=a.offsetDirection;if(this.manager.session.prevented)return void b.preventDefault();var d=this.actions,e=p(d,jb)&&!mb[jb],f=p(d,lb)&&!mb[lb],g=p(d,kb)&&!mb[kb];if(e){var h=1===a.pointers.length,i=a.distance<2,j=a.deltaTime<250;if(h&&i&&j)return}return g&&f?void 0:e||f&&c&Na||g&&c&Oa?this.preventSrc(b):void 0},preventSrc:function(a){this.manager.session.prevented=!0,a.preventDefault()}};var nb=1,ob=2,pb=4,qb=8,rb=qb,sb=16,tb=32;Y.prototype={defaults:{},set:function(a){return la(this.options,a),this.manager&&this.manager.touchAction.update(),this},recognizeWith:function(a){if(f(a,"recognizeWith",this))return this;var b=this.simultaneous;return a=_(a,this),b[a.id]||(b[a.id]=a,a.recognizeWith(this)),this},dropRecognizeWith:function(a){return f(a,"dropRecognizeWith",this)?this:(a=_(a,this),delete this.simultaneous[a.id],this)},requireFailure:function(a){if(f(a,"requireFailure",this))return this;var b=this.requireFail;return a=_(a,this),-1===r(b,a)&&(b.push(a),a.requireFailure(this)),this},dropRequireFailure:function(a){if(f(a,"dropRequireFailure",this))return this;a=_(a,this);var b=r(this.requireFail,a);return b>-1&&this.requireFail.splice(b,1),this},hasRequireFailures:function(){return this.requireFail.length>0},canRecognizeWith:function(a){return!!this.simultaneous[a.id]},emit:function(a){function b(b){c.manager.emit(b,a)}var c=this,d=this.state;qb>d&&b(c.options.event+Z(d)),b(c.options.event),a.additionalEvent&&b(a.additionalEvent),d>=qb&&b(c.options.event+Z(d))},tryEmit:function(a){return this.canEmit()?this.emit(a):void(this.state=tb)},canEmit:function(){for(var a=0;af?Ja:Ka,c=f!=this.pX,d=Math.abs(a.deltaX)):(e=0===g?Ia:0>g?La:Ma,c=g!=this.pY,d=Math.abs(a.deltaY))),a.direction=e,c&&d>b.threshold&&e&b.direction},attrTest:function(a){return aa.prototype.attrTest.call(this,a)&&(this.state&ob||!(this.state&ob)&&this.directionTest(a))},emit:function(a){this.pX=a.deltaX,this.pY=a.deltaY;var b=$(a.direction);b&&(a.additionalEvent=this.options.event+b),this._super.emit.call(this,a)}}),i(ca,aa,{defaults:{event:"pinch",threshold:0,pointers:2},getTouchAction:function(){return[jb]},attrTest:function(a){return this._super.attrTest.call(this,a)&&(Math.abs(a.scale-1)>this.options.threshold||this.state&ob)},emit:function(a){if(1!==a.scale){var b=a.scale<1?"in":"out";a.additionalEvent=this.options.event+b}this._super.emit.call(this,a)}}),i(da,Y,{defaults:{event:"press",pointers:1,time:251,threshold:9},getTouchAction:function(){return[hb]},process:function(a){var b=this.options,c=a.pointers.length===b.pointers,d=a.distanceb.time;if(this._input=a,!d||!c||a.eventType&(Ga|Ha)&&!f)this.reset();else if(a.eventType&Ea)this.reset(),this._timer=e(function(){this.state=rb,this.tryEmit()},b.time,this);else if(a.eventType&Ga)return rb;return tb},reset:function(){clearTimeout(this._timer)},emit:function(a){this.state===rb&&(a&&a.eventType&Ga?this.manager.emit(this.options.event+"up",a):(this._input.timeStamp=ra(),this.manager.emit(this.options.event,this._input)))}}),i(ea,aa,{defaults:{event:"rotate",threshold:0,pointers:2},getTouchAction:function(){return[jb]},attrTest:function(a){return this._super.attrTest.call(this,a)&&(Math.abs(a.rotation)>this.options.threshold||this.state&ob)}}),i(fa,aa,{defaults:{event:"swipe",threshold:10,velocity:.3,direction:Na|Oa,pointers:1},getTouchAction:function(){return ba.prototype.getTouchAction.call(this)},attrTest:function(a){var b,c=this.options.direction;return c&(Na|Oa)?b=a.overallVelocity:c&Na?b=a.overallVelocityX:c&Oa&&(b=a.overallVelocityY),this._super.attrTest.call(this,a)&&c&a.offsetDirection&&a.distance>this.options.threshold&&a.maxPointers==this.options.pointers&&qa(b)>this.options.velocity&&a.eventType&Ga},emit:function(a){var b=$(a.offsetDirection);b&&this.manager.emit(this.options.event+b,a),this.manager.emit(this.options.event,a)}}),i(ga,Y,{defaults:{event:"tap",pointers:1,taps:1,interval:300,time:250,threshold:9,posThreshold:10},getTouchAction:function(){return[ib]},process:function(a){var b=this.options,c=a.pointers.length===b.pointers,d=a.distance=0.8.0" + }, + "scripts": { + "test": "grunt test" + } +} diff --git a/www/js/hammerjs/src/expose.js b/www/js/hammerjs/src/expose.js new file mode 100644 index 0000000..1fe14db --- /dev/null +++ b/www/js/hammerjs/src/expose.js @@ -0,0 +1,67 @@ +assign(Hammer, { + INPUT_START: INPUT_START, + INPUT_MOVE: INPUT_MOVE, + INPUT_END: INPUT_END, + INPUT_CANCEL: INPUT_CANCEL, + + STATE_POSSIBLE: STATE_POSSIBLE, + STATE_BEGAN: STATE_BEGAN, + STATE_CHANGED: STATE_CHANGED, + STATE_ENDED: STATE_ENDED, + STATE_RECOGNIZED: STATE_RECOGNIZED, + STATE_CANCELLED: STATE_CANCELLED, + STATE_FAILED: STATE_FAILED, + + DIRECTION_NONE: DIRECTION_NONE, + DIRECTION_LEFT: DIRECTION_LEFT, + DIRECTION_RIGHT: DIRECTION_RIGHT, + DIRECTION_UP: DIRECTION_UP, + DIRECTION_DOWN: DIRECTION_DOWN, + DIRECTION_HORIZONTAL: DIRECTION_HORIZONTAL, + DIRECTION_VERTICAL: DIRECTION_VERTICAL, + DIRECTION_ALL: DIRECTION_ALL, + + Manager: Manager, + Input: Input, + TouchAction: TouchAction, + + TouchInput: TouchInput, + MouseInput: MouseInput, + PointerEventInput: PointerEventInput, + TouchMouseInput: TouchMouseInput, + SingleTouchInput: SingleTouchInput, + + Recognizer: Recognizer, + AttrRecognizer: AttrRecognizer, + Tap: TapRecognizer, + Pan: PanRecognizer, + Swipe: SwipeRecognizer, + Pinch: PinchRecognizer, + Rotate: RotateRecognizer, + Press: PressRecognizer, + + on: addEventListeners, + off: removeEventListeners, + each: each, + merge: merge, + extend: extend, + assign: assign, + inherit: inherit, + bindFn: bindFn, + prefixed: prefixed +}); + +// this prevents errors when Hammer is loaded in the presence of an AMD +// style loader but by script tag, not by the loader. +var freeGlobal = (typeof window !== 'undefined' ? window : (typeof self !== 'undefined' ? self : {})); // jshint ignore:line +freeGlobal.Hammer = Hammer; + +if (typeof define === 'function' && define.amd) { + define(function() { + return Hammer; + }); +} else if (typeof module != 'undefined' && module.exports) { + module.exports = Hammer; +} else { + window[exportName] = Hammer; +} diff --git a/www/js/hammerjs/src/hammer.js b/www/js/hammerjs/src/hammer.js new file mode 100644 index 0000000..f3ace1f --- /dev/null +++ b/www/js/hammerjs/src/hammer.js @@ -0,0 +1,128 @@ +/** + * Simple way to create a manager with a default set of recognizers. + * @param {HTMLElement} element + * @param {Object} [options] + * @constructor + */ +function Hammer(element, options) { + options = options || {}; + options.recognizers = ifUndefined(options.recognizers, Hammer.defaults.preset); + return new Manager(element, options); +} + +/** + * @const {string} + */ +Hammer.VERSION = '{{PKG_VERSION}}'; + +/** + * default settings + * @namespace + */ +Hammer.defaults = { + /** + * set if DOM events are being triggered. + * But this is slower and unused by simple implementations, so disabled by default. + * @type {Boolean} + * @default false + */ + domEvents: false, + + /** + * The value for the touchAction property/fallback. + * When set to `compute` it will magically set the correct value based on the added recognizers. + * @type {String} + * @default compute + */ + touchAction: TOUCH_ACTION_COMPUTE, + + /** + * @type {Boolean} + * @default true + */ + enable: true, + + /** + * EXPERIMENTAL FEATURE -- can be removed/changed + * Change the parent input target element. + * If Null, then it is being set the to main element. + * @type {Null|EventTarget} + * @default null + */ + inputTarget: null, + + /** + * force an input class + * @type {Null|Function} + * @default null + */ + inputClass: null, + + /** + * Default recognizer setup when calling `Hammer()` + * When creating a new Manager these will be skipped. + * @type {Array} + */ + preset: [ + // RecognizerClass, options, [recognizeWith, ...], [requireFailure, ...] + [RotateRecognizer, {enable: false}], + [PinchRecognizer, {enable: false}, ['rotate']], + [SwipeRecognizer, {direction: DIRECTION_HORIZONTAL}], + [PanRecognizer, {direction: DIRECTION_HORIZONTAL}, ['swipe']], + [TapRecognizer], + [TapRecognizer, {event: 'doubletap', taps: 2}, ['tap']], + [PressRecognizer] + ], + + /** + * Some CSS properties can be used to improve the working of Hammer. + * Add them to this method and they will be set when creating a new Manager. + * @namespace + */ + cssProps: { + /** + * Disables text selection to improve the dragging gesture. Mainly for desktop browsers. + * @type {String} + * @default 'none' + */ + userSelect: 'none', + + /** + * Disable the Windows Phone grippers when pressing an element. + * @type {String} + * @default 'none' + */ + touchSelect: 'none', + + /** + * Disables the default callout shown when you touch and hold a touch target. + * On iOS, when you touch and hold a touch target such as a link, Safari displays + * a callout containing information about the link. This property allows you to disable that callout. + * @type {String} + * @default 'none' + */ + touchCallout: 'none', + + /** + * Specifies whether zooming is enabled. Used by IE10> + * @type {String} + * @default 'none' + */ + contentZooming: 'none', + + /** + * Specifies that an entire element should be draggable instead of its contents. Mainly for desktop browsers. + * @type {String} + * @default 'none' + */ + userDrag: 'none', + + /** + * Overrides the highlight color shown when the user taps a link or a JavaScript + * clickable element in iOS. This property obeys the alpha value, if specified. + * @type {String} + * @default 'rgba(0,0,0,0)' + */ + tapHighlightColor: 'rgba(0,0,0,0)' + } +}; diff --git a/www/js/hammerjs/src/hammer.prefix.js b/www/js/hammerjs/src/hammer.prefix.js new file mode 100644 index 0000000..debc7ff --- /dev/null +++ b/www/js/hammerjs/src/hammer.prefix.js @@ -0,0 +1,2 @@ +(function(window, document, exportName, undefined) { + 'use strict'; diff --git a/www/js/hammerjs/src/hammer.suffix.js b/www/js/hammerjs/src/hammer.suffix.js new file mode 100644 index 0000000..41bfecf --- /dev/null +++ b/www/js/hammerjs/src/hammer.suffix.js @@ -0,0 +1 @@ +})(window, document, 'Hammer'); diff --git a/www/js/hammerjs/src/input.js b/www/js/hammerjs/src/input.js new file mode 100644 index 0000000..e9601ca --- /dev/null +++ b/www/js/hammerjs/src/input.js @@ -0,0 +1,394 @@ +var MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i; + +var SUPPORT_TOUCH = ('ontouchstart' in window); +var SUPPORT_POINTER_EVENTS = prefixed(window, 'PointerEvent') !== undefined; +var SUPPORT_ONLY_TOUCH = SUPPORT_TOUCH && MOBILE_REGEX.test(navigator.userAgent); + +var INPUT_TYPE_TOUCH = 'touch'; +var INPUT_TYPE_PEN = 'pen'; +var INPUT_TYPE_MOUSE = 'mouse'; +var INPUT_TYPE_KINECT = 'kinect'; + +var COMPUTE_INTERVAL = 25; + +var INPUT_START = 1; +var INPUT_MOVE = 2; +var INPUT_END = 4; +var INPUT_CANCEL = 8; + +var DIRECTION_NONE = 1; +var DIRECTION_LEFT = 2; +var DIRECTION_RIGHT = 4; +var DIRECTION_UP = 8; +var DIRECTION_DOWN = 16; + +var DIRECTION_HORIZONTAL = DIRECTION_LEFT | DIRECTION_RIGHT; +var DIRECTION_VERTICAL = DIRECTION_UP | DIRECTION_DOWN; +var DIRECTION_ALL = DIRECTION_HORIZONTAL | DIRECTION_VERTICAL; + +var PROPS_XY = ['x', 'y']; +var PROPS_CLIENT_XY = ['clientX', 'clientY']; + +/** + * create new input type manager + * @param {Manager} manager + * @param {Function} callback + * @returns {Input} + * @constructor + */ +function Input(manager, callback) { + var self = this; + this.manager = manager; + this.callback = callback; + this.element = manager.element; + this.target = manager.options.inputTarget; + + // smaller wrapper around the handler, for the scope and the enabled state of the manager, + // so when disabled the input events are completely bypassed. + this.domHandler = function(ev) { + if (boolOrFn(manager.options.enable, [manager])) { + self.handler(ev); + } + }; + + this.init(); + +} + +Input.prototype = { + /** + * should handle the inputEvent data and trigger the callback + * @virtual + */ + handler: function() { }, + + /** + * bind the events + */ + init: function() { + this.evEl && addEventListeners(this.element, this.evEl, this.domHandler); + this.evTarget && addEventListeners(this.target, this.evTarget, this.domHandler); + this.evWin && addEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler); + }, + + /** + * unbind the events + */ + destroy: function() { + this.evEl && removeEventListeners(this.element, this.evEl, this.domHandler); + this.evTarget && removeEventListeners(this.target, this.evTarget, this.domHandler); + this.evWin && removeEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler); + } +}; + +/** + * create new input type manager + * called by the Manager constructor + * @param {Hammer} manager + * @returns {Input} + */ +function createInputInstance(manager) { + var Type; + var inputClass = manager.options.inputClass; + + if (inputClass) { + Type = inputClass; + } else if (SUPPORT_POINTER_EVENTS) { + Type = PointerEventInput; + } else if (SUPPORT_ONLY_TOUCH) { + Type = TouchInput; + } else if (!SUPPORT_TOUCH) { + Type = MouseInput; + } else { + Type = TouchMouseInput; + } + return new (Type)(manager, inputHandler); +} + +/** + * handle input events + * @param {Manager} manager + * @param {String} eventType + * @param {Object} input + */ +function inputHandler(manager, eventType, input) { + var pointersLen = input.pointers.length; + var changedPointersLen = input.changedPointers.length; + var isFirst = (eventType & INPUT_START && (pointersLen - changedPointersLen === 0)); + var isFinal = (eventType & (INPUT_END | INPUT_CANCEL) && (pointersLen - changedPointersLen === 0)); + + input.isFirst = !!isFirst; + input.isFinal = !!isFinal; + + if (isFirst) { + manager.session = {}; + } + + // source event is the normalized value of the domEvents + // like 'touchstart, mouseup, pointerdown' + input.eventType = eventType; + + // compute scale, rotation etc + computeInputData(manager, input); + + // emit secret event + manager.emit('hammer.input', input); + + manager.recognize(input); + manager.session.prevInput = input; +} + +/** + * extend the data with some usable properties like scale, rotate, velocity etc + * @param {Object} manager + * @param {Object} input + */ +function computeInputData(manager, input) { + var session = manager.session; + var pointers = input.pointers; + var pointersLength = pointers.length; + + // store the first input to calculate the distance and direction + if (!session.firstInput) { + session.firstInput = simpleCloneInputData(input); + } + + // to compute scale and rotation we need to store the multiple touches + if (pointersLength > 1 && !session.firstMultiple) { + session.firstMultiple = simpleCloneInputData(input); + } else if (pointersLength === 1) { + session.firstMultiple = false; + } + + var firstInput = session.firstInput; + var firstMultiple = session.firstMultiple; + var offsetCenter = firstMultiple ? firstMultiple.center : firstInput.center; + + var center = input.center = getCenter(pointers); + input.timeStamp = now(); + input.deltaTime = input.timeStamp - firstInput.timeStamp; + + input.angle = getAngle(offsetCenter, center); + input.distance = getDistance(offsetCenter, center); + + computeDeltaXY(session, input); + input.offsetDirection = getDirection(input.deltaX, input.deltaY); + + var overallVelocity = getVelocity(input.deltaTime, input.deltaX, input.deltaY); + input.overallVelocityX = overallVelocity.x; + input.overallVelocityY = overallVelocity.y; + input.overallVelocity = (abs(overallVelocity.x) > abs(overallVelocity.y)) ? overallVelocity.x : overallVelocity.y; + + input.scale = firstMultiple ? getScale(firstMultiple.pointers, pointers) : 1; + input.rotation = firstMultiple ? getRotation(firstMultiple.pointers, pointers) : 0; + + input.maxPointers = !session.prevInput ? input.pointers.length : ((input.pointers.length > + session.prevInput.maxPointers) ? input.pointers.length : session.prevInput.maxPointers); + + computeIntervalInputData(session, input); + + // find the correct target + var target = manager.element; + if (hasParent(input.srcEvent.target, target)) { + target = input.srcEvent.target; + } + input.target = target; +} + +function computeDeltaXY(session, input) { + var center = input.center; + var offset = session.offsetDelta || {}; + var prevDelta = session.prevDelta || {}; + var prevInput = session.prevInput || {}; + + if (input.eventType === INPUT_START || prevInput.eventType === INPUT_END) { + prevDelta = session.prevDelta = { + x: prevInput.deltaX || 0, + y: prevInput.deltaY || 0 + }; + + offset = session.offsetDelta = { + x: center.x, + y: center.y + }; + } + + input.deltaX = prevDelta.x + (center.x - offset.x); + input.deltaY = prevDelta.y + (center.y - offset.y); +} + +/** + * velocity is calculated every x ms + * @param {Object} session + * @param {Object} input + */ +function computeIntervalInputData(session, input) { + var last = session.lastInterval || input, + deltaTime = input.timeStamp - last.timeStamp, + velocity, velocityX, velocityY, direction; + + if (input.eventType != INPUT_CANCEL && (deltaTime > COMPUTE_INTERVAL || last.velocity === undefined)) { + var deltaX = input.deltaX - last.deltaX; + var deltaY = input.deltaY - last.deltaY; + + var v = getVelocity(deltaTime, deltaX, deltaY); + velocityX = v.x; + velocityY = v.y; + velocity = (abs(v.x) > abs(v.y)) ? v.x : v.y; + direction = getDirection(deltaX, deltaY); + + session.lastInterval = input; + } else { + // use latest velocity info if it doesn't overtake a minimum period + velocity = last.velocity; + velocityX = last.velocityX; + velocityY = last.velocityY; + direction = last.direction; + } + + input.velocity = velocity; + input.velocityX = velocityX; + input.velocityY = velocityY; + input.direction = direction; +} + +/** + * create a simple clone from the input used for storage of firstInput and firstMultiple + * @param {Object} input + * @returns {Object} clonedInputData + */ +function simpleCloneInputData(input) { + // make a simple copy of the pointers because we will get a reference if we don't + // we only need clientXY for the calculations + var pointers = []; + var i = 0; + while (i < input.pointers.length) { + pointers[i] = { + clientX: round(input.pointers[i].clientX), + clientY: round(input.pointers[i].clientY) + }; + i++; + } + + return { + timeStamp: now(), + pointers: pointers, + center: getCenter(pointers), + deltaX: input.deltaX, + deltaY: input.deltaY + }; +} + +/** + * get the center of all the pointers + * @param {Array} pointers + * @return {Object} center contains `x` and `y` properties + */ +function getCenter(pointers) { + var pointersLength = pointers.length; + + // no need to loop when only one touch + if (pointersLength === 1) { + return { + x: round(pointers[0].clientX), + y: round(pointers[0].clientY) + }; + } + + var x = 0, y = 0, i = 0; + while (i < pointersLength) { + x += pointers[i].clientX; + y += pointers[i].clientY; + i++; + } + + return { + x: round(x / pointersLength), + y: round(y / pointersLength) + }; +} + +/** + * calculate the velocity between two points. unit is in px per ms. + * @param {Number} deltaTime + * @param {Number} x + * @param {Number} y + * @return {Object} velocity `x` and `y` + */ +function getVelocity(deltaTime, x, y) { + return { + x: x / deltaTime || 0, + y: y / deltaTime || 0 + }; +} + +/** + * get the direction between two points + * @param {Number} x + * @param {Number} y + * @return {Number} direction + */ +function getDirection(x, y) { + if (x === y) { + return DIRECTION_NONE; + } + + if (abs(x) >= abs(y)) { + return x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT; + } + return y < 0 ? DIRECTION_UP : DIRECTION_DOWN; +} + +/** + * calculate the absolute distance between two points + * @param {Object} p1 {x, y} + * @param {Object} p2 {x, y} + * @param {Array} [props] containing x and y keys + * @return {Number} distance + */ +function getDistance(p1, p2, props) { + if (!props) { + props = PROPS_XY; + } + var x = p2[props[0]] - p1[props[0]], + y = p2[props[1]] - p1[props[1]]; + + return Math.sqrt((x * x) + (y * y)); +} + +/** + * calculate the angle between two coordinates + * @param {Object} p1 + * @param {Object} p2 + * @param {Array} [props] containing x and y keys + * @return {Number} angle + */ +function getAngle(p1, p2, props) { + if (!props) { + props = PROPS_XY; + } + var x = p2[props[0]] - p1[props[0]], + y = p2[props[1]] - p1[props[1]]; + return Math.atan2(y, x) * 180 / Math.PI; +} + +/** + * calculate the rotation degrees between two pointersets + * @param {Array} start array of pointers + * @param {Array} end array of pointers + * @return {Number} rotation + */ +function getRotation(start, end) { + return getAngle(end[1], end[0], PROPS_CLIENT_XY) + getAngle(start[1], start[0], PROPS_CLIENT_XY); +} + +/** + * calculate the scale factor between two pointersets + * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out + * @param {Array} start array of pointers + * @param {Array} end array of pointers + * @return {Number} scale + */ +function getScale(start, end) { + return getDistance(end[0], end[1], PROPS_CLIENT_XY) / getDistance(start[0], start[1], PROPS_CLIENT_XY); +} diff --git a/www/js/hammerjs/src/input/mouse.js b/www/js/hammerjs/src/input/mouse.js new file mode 100644 index 0000000..6e27ef5 --- /dev/null +++ b/www/js/hammerjs/src/input/mouse.js @@ -0,0 +1,57 @@ +var MOUSE_INPUT_MAP = { + mousedown: INPUT_START, + mousemove: INPUT_MOVE, + mouseup: INPUT_END +}; + +var MOUSE_ELEMENT_EVENTS = 'mousedown'; +var MOUSE_WINDOW_EVENTS = 'mousemove mouseup'; + +/** + * Mouse events input + * @constructor + * @extends Input + */ +function MouseInput() { + this.evEl = MOUSE_ELEMENT_EVENTS; + this.evWin = MOUSE_WINDOW_EVENTS; + + this.pressed = false; // mousedown state + + Input.apply(this, arguments); +} + +inherit(MouseInput, Input, { + /** + * handle mouse events + * @param {Object} ev + */ + handler: function MEhandler(ev) { + var eventType = MOUSE_INPUT_MAP[ev.type]; + + // on start we want to have the left mouse button down + if (eventType & INPUT_START && ev.button === 0) { + this.pressed = true; + } + + if (eventType & INPUT_MOVE && ev.which !== 1) { + eventType = INPUT_END; + } + + // mouse must be down + if (!this.pressed) { + return; + } + + if (eventType & INPUT_END) { + this.pressed = false; + } + + this.callback(this.manager, eventType, { + pointers: [ev], + changedPointers: [ev], + pointerType: INPUT_TYPE_MOUSE, + srcEvent: ev + }); + } +}); diff --git a/www/js/hammerjs/src/input/pointerevent.js b/www/js/hammerjs/src/input/pointerevent.js new file mode 100644 index 0000000..ec810b5 --- /dev/null +++ b/www/js/hammerjs/src/input/pointerevent.js @@ -0,0 +1,88 @@ +var POINTER_INPUT_MAP = { + pointerdown: INPUT_START, + pointermove: INPUT_MOVE, + pointerup: INPUT_END, + pointercancel: INPUT_CANCEL, + pointerout: INPUT_CANCEL +}; + +// in IE10 the pointer types is defined as an enum +var IE10_POINTER_TYPE_ENUM = { + 2: INPUT_TYPE_TOUCH, + 3: INPUT_TYPE_PEN, + 4: INPUT_TYPE_MOUSE, + 5: INPUT_TYPE_KINECT // see https://twitter.com/jacobrossi/status/480596438489890816 +}; + +var POINTER_ELEMENT_EVENTS = 'pointerdown'; +var POINTER_WINDOW_EVENTS = 'pointermove pointerup pointercancel'; + +// IE10 has prefixed support, and case-sensitive +if (window.MSPointerEvent && !window.PointerEvent) { + POINTER_ELEMENT_EVENTS = 'MSPointerDown'; + POINTER_WINDOW_EVENTS = 'MSPointerMove MSPointerUp MSPointerCancel'; +} + +/** + * Pointer events input + * @constructor + * @extends Input + */ +function PointerEventInput() { + this.evEl = POINTER_ELEMENT_EVENTS; + this.evWin = POINTER_WINDOW_EVENTS; + + Input.apply(this, arguments); + + this.store = (this.manager.session.pointerEvents = []); +} + +inherit(PointerEventInput, Input, { + /** + * handle mouse events + * @param {Object} ev + */ + handler: function PEhandler(ev) { + var store = this.store; + var removePointer = false; + + var eventTypeNormalized = ev.type.toLowerCase().replace('ms', ''); + var eventType = POINTER_INPUT_MAP[eventTypeNormalized]; + var pointerType = IE10_POINTER_TYPE_ENUM[ev.pointerType] || ev.pointerType; + + var isTouch = (pointerType == INPUT_TYPE_TOUCH); + + // get index of the event in the store + var storeIndex = inArray(store, ev.pointerId, 'pointerId'); + + // start and mouse must be down + if (eventType & INPUT_START && (ev.button === 0 || isTouch)) { + if (storeIndex < 0) { + store.push(ev); + storeIndex = store.length - 1; + } + } else if (eventType & (INPUT_END | INPUT_CANCEL)) { + removePointer = true; + } + + // it not found, so the pointer hasn't been down (so it's probably a hover) + if (storeIndex < 0) { + return; + } + + // update the event in the store + store[storeIndex] = ev; + + this.callback(this.manager, eventType, { + pointers: store, + changedPointers: [ev], + pointerType: pointerType, + srcEvent: ev + }); + + if (removePointer) { + // remove from the store + store.splice(storeIndex, 1); + } + } +}); diff --git a/www/js/hammerjs/src/input/singletouch.js b/www/js/hammerjs/src/input/singletouch.js new file mode 100644 index 0000000..cbe9ec0 --- /dev/null +++ b/www/js/hammerjs/src/input/singletouch.js @@ -0,0 +1,68 @@ +var SINGLE_TOUCH_INPUT_MAP = { + touchstart: INPUT_START, + touchmove: INPUT_MOVE, + touchend: INPUT_END, + touchcancel: INPUT_CANCEL +}; + +var SINGLE_TOUCH_TARGET_EVENTS = 'touchstart'; +var SINGLE_TOUCH_WINDOW_EVENTS = 'touchstart touchmove touchend touchcancel'; + +/** + * Touch events input + * @constructor + * @extends Input + */ +function SingleTouchInput() { + this.evTarget = SINGLE_TOUCH_TARGET_EVENTS; + this.evWin = SINGLE_TOUCH_WINDOW_EVENTS; + this.started = false; + + Input.apply(this, arguments); +} + +inherit(SingleTouchInput, Input, { + handler: function TEhandler(ev) { + var type = SINGLE_TOUCH_INPUT_MAP[ev.type]; + + // should we handle the touch events? + if (type === INPUT_START) { + this.started = true; + } + + if (!this.started) { + return; + } + + var touches = normalizeSingleTouches.call(this, ev, type); + + // when done, reset the started state + if (type & (INPUT_END | INPUT_CANCEL) && touches[0].length - touches[1].length === 0) { + this.started = false; + } + + this.callback(this.manager, type, { + pointers: touches[0], + changedPointers: touches[1], + pointerType: INPUT_TYPE_TOUCH, + srcEvent: ev + }); + } +}); + +/** + * @this {TouchInput} + * @param {Object} ev + * @param {Number} type flag + * @returns {undefined|Array} [all, changed] + */ +function normalizeSingleTouches(ev, type) { + var all = toArray(ev.touches); + var changed = toArray(ev.changedTouches); + + if (type & (INPUT_END | INPUT_CANCEL)) { + all = uniqueArray(all.concat(changed), 'identifier', true); + } + + return [all, changed]; +} diff --git a/www/js/hammerjs/src/input/touch.js b/www/js/hammerjs/src/input/touch.js new file mode 100644 index 0000000..4ac2dd5 --- /dev/null +++ b/www/js/hammerjs/src/input/touch.js @@ -0,0 +1,98 @@ +var TOUCH_INPUT_MAP = { + touchstart: INPUT_START, + touchmove: INPUT_MOVE, + touchend: INPUT_END, + touchcancel: INPUT_CANCEL +}; + +var TOUCH_TARGET_EVENTS = 'touchstart touchmove touchend touchcancel'; + +/** + * Multi-user touch events input + * @constructor + * @extends Input + */ +function TouchInput() { + this.evTarget = TOUCH_TARGET_EVENTS; + this.targetIds = {}; + + Input.apply(this, arguments); +} + +inherit(TouchInput, Input, { + handler: function MTEhandler(ev) { + var type = TOUCH_INPUT_MAP[ev.type]; + var touches = getTouches.call(this, ev, type); + if (!touches) { + return; + } + + this.callback(this.manager, type, { + pointers: touches[0], + changedPointers: touches[1], + pointerType: INPUT_TYPE_TOUCH, + srcEvent: ev + }); + } +}); + +/** + * @this {TouchInput} + * @param {Object} ev + * @param {Number} type flag + * @returns {undefined|Array} [all, changed] + */ +function getTouches(ev, type) { + var allTouches = toArray(ev.touches); + var targetIds = this.targetIds; + + // when there is only one touch, the process can be simplified + if (type & (INPUT_START | INPUT_MOVE) && allTouches.length === 1) { + targetIds[allTouches[0].identifier] = true; + return [allTouches, allTouches]; + } + + var i, + targetTouches, + changedTouches = toArray(ev.changedTouches), + changedTargetTouches = [], + target = this.target; + + // get target touches from touches + targetTouches = allTouches.filter(function(touch) { + return hasParent(touch.target, target); + }); + + // collect touches + if (type === INPUT_START) { + i = 0; + while (i < targetTouches.length) { + targetIds[targetTouches[i].identifier] = true; + i++; + } + } + + // filter changed touches to only contain touches that exist in the collected target ids + i = 0; + while (i < changedTouches.length) { + if (targetIds[changedTouches[i].identifier]) { + changedTargetTouches.push(changedTouches[i]); + } + + // cleanup removed touches + if (type & (INPUT_END | INPUT_CANCEL)) { + delete targetIds[changedTouches[i].identifier]; + } + i++; + } + + if (!changedTargetTouches.length) { + return; + } + + return [ + // merge targetTouches with changedTargetTouches so it contains ALL touches, including 'end' and 'cancel' + uniqueArray(targetTouches.concat(changedTargetTouches), 'identifier', true), + changedTargetTouches + ]; +} diff --git a/www/js/hammerjs/src/input/touchmouse.js b/www/js/hammerjs/src/input/touchmouse.js new file mode 100644 index 0000000..b110d23 --- /dev/null +++ b/www/js/hammerjs/src/input/touchmouse.js @@ -0,0 +1,95 @@ +/** + * Combined touch and mouse input + * + * Touch has a higher priority then mouse, and while touching no mouse events are allowed. + * This because touch devices also emit mouse events while doing a touch. + * + * @constructor + * @extends Input + */ + +var DEDUP_TIMEOUT = 2500; +var DEDUP_DISTANCE = 25; + +function TouchMouseInput() { + Input.apply(this, arguments); + + var handler = bindFn(this.handler, this); + this.touch = new TouchInput(this.manager, handler); + this.mouse = new MouseInput(this.manager, handler); + + this.primaryTouch = null; + this.lastTouches = []; +} + +inherit(TouchMouseInput, Input, { + /** + * handle mouse and touch events + * @param {Hammer} manager + * @param {String} inputEvent + * @param {Object} inputData + */ + handler: function TMEhandler(manager, inputEvent, inputData) { + var isTouch = (inputData.pointerType == INPUT_TYPE_TOUCH), + isMouse = (inputData.pointerType == INPUT_TYPE_MOUSE); + + if (isMouse && inputData.sourceCapabilities && inputData.sourceCapabilities.firesTouchEvents) { + return; + } + + // when we're in a touch event, record touches to de-dupe synthetic mouse event + if (isTouch) { + recordTouches.call(this, inputEvent, inputData); + } else if (isMouse && isSyntheticEvent.call(this, inputData)) { + return; + } + + this.callback(manager, inputEvent, inputData); + }, + + /** + * remove the event listeners + */ + destroy: function destroy() { + this.touch.destroy(); + this.mouse.destroy(); + } +}); + +function recordTouches(eventType, eventData) { + if (eventType & INPUT_START) { + this.primaryTouch = eventData.changedPointers[0].identifier; + setLastTouch.call(this, eventData); + } else if (eventType & (INPUT_END | INPUT_CANCEL)) { + setLastTouch.call(this, eventData); + } +} + +function setLastTouch(eventData) { + var touch = eventData.changedPointers[0]; + + if (touch.identifier === this.primaryTouch) { + var lastTouch = {x: touch.clientX, y: touch.clientY}; + this.lastTouches.push(lastTouch); + var lts = this.lastTouches; + var removeLastTouch = function() { + var i = lts.indexOf(lastTouch); + if (i > -1) { + lts.splice(i, 1); + } + }; + setTimeout(removeLastTouch, DEDUP_TIMEOUT); + } +} + +function isSyntheticEvent(eventData) { + var x = eventData.srcEvent.clientX, y = eventData.srcEvent.clientY; + for (var i = 0; i < this.lastTouches.length; i++) { + var t = this.lastTouches[i]; + var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y); + if (dx <= DEDUP_DISTANCE && dy <= DEDUP_DISTANCE) { + return true; + } + } + return false; +} diff --git a/www/js/hammerjs/src/manager.js b/www/js/hammerjs/src/manager.js new file mode 100644 index 0000000..5a5e97e --- /dev/null +++ b/www/js/hammerjs/src/manager.js @@ -0,0 +1,312 @@ +var STOP = 1; +var FORCED_STOP = 2; + +/** + * Manager + * @param {HTMLElement} element + * @param {Object} [options] + * @constructor + */ +function Manager(element, options) { + this.options = assign({}, Hammer.defaults, options || {}); + + this.options.inputTarget = this.options.inputTarget || element; + + this.handlers = {}; + this.session = {}; + this.recognizers = []; + this.oldCssProps = {}; + + this.element = element; + this.input = createInputInstance(this); + this.touchAction = new TouchAction(this, this.options.touchAction); + + toggleCssProps(this, true); + + each(this.options.recognizers, function(item) { + var recognizer = this.add(new (item[0])(item[1])); + item[2] && recognizer.recognizeWith(item[2]); + item[3] && recognizer.requireFailure(item[3]); + }, this); +} + +Manager.prototype = { + /** + * set options + * @param {Object} options + * @returns {Manager} + */ + set: function(options) { + assign(this.options, options); + + // Options that need a little more setup + if (options.touchAction) { + this.touchAction.update(); + } + if (options.inputTarget) { + // Clean up existing event listeners and reinitialize + this.input.destroy(); + this.input.target = options.inputTarget; + this.input.init(); + } + return this; + }, + + /** + * stop recognizing for this session. + * This session will be discarded, when a new [input]start event is fired. + * When forced, the recognizer cycle is stopped immediately. + * @param {Boolean} [force] + */ + stop: function(force) { + this.session.stopped = force ? FORCED_STOP : STOP; + }, + + /** + * run the recognizers! + * called by the inputHandler function on every movement of the pointers (touches) + * it walks through all the recognizers and tries to detect the gesture that is being made + * @param {Object} inputData + */ + recognize: function(inputData) { + var session = this.session; + if (session.stopped) { + return; + } + + // run the touch-action polyfill + this.touchAction.preventDefaults(inputData); + + var recognizer; + var recognizers = this.recognizers; + + // this holds the recognizer that is being recognized. + // so the recognizer's state needs to be BEGAN, CHANGED, ENDED or RECOGNIZED + // if no recognizer is detecting a thing, it is set to `null` + var curRecognizer = session.curRecognizer; + + // reset when the last recognizer is recognized + // or when we're in a new session + if (!curRecognizer || (curRecognizer && curRecognizer.state & STATE_RECOGNIZED)) { + curRecognizer = session.curRecognizer = null; + } + + var i = 0; + while (i < recognizers.length) { + recognizer = recognizers[i]; + + // find out if we are allowed try to recognize the input for this one. + // 1. allow if the session is NOT forced stopped (see the .stop() method) + // 2. allow if we still haven't recognized a gesture in this session, or the this recognizer is the one + // that is being recognized. + // 3. allow if the recognizer is allowed to run simultaneous with the current recognized recognizer. + // this can be setup with the `recognizeWith()` method on the recognizer. + if (session.stopped !== FORCED_STOP && ( // 1 + !curRecognizer || recognizer == curRecognizer || // 2 + recognizer.canRecognizeWith(curRecognizer))) { // 3 + recognizer.recognize(inputData); + } else { + recognizer.reset(); + } + + // if the recognizer has been recognizing the input as a valid gesture, we want to store this one as the + // current active recognizer. but only if we don't already have an active recognizer + if (!curRecognizer && recognizer.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED)) { + curRecognizer = session.curRecognizer = recognizer; + } + i++; + } + }, + + /** + * get a recognizer by its event name. + * @param {Recognizer|String} recognizer + * @returns {Recognizer|Null} + */ + get: function(recognizer) { + if (recognizer instanceof Recognizer) { + return recognizer; + } + + var recognizers = this.recognizers; + for (var i = 0; i < recognizers.length; i++) { + if (recognizers[i].options.event == recognizer) { + return recognizers[i]; + } + } + return null; + }, + + /** + * add a recognizer to the manager + * existing recognizers with the same event name will be removed + * @param {Recognizer} recognizer + * @returns {Recognizer|Manager} + */ + add: function(recognizer) { + if (invokeArrayArg(recognizer, 'add', this)) { + return this; + } + + // remove existing + var existing = this.get(recognizer.options.event); + if (existing) { + this.remove(existing); + } + + this.recognizers.push(recognizer); + recognizer.manager = this; + + this.touchAction.update(); + return recognizer; + }, + + /** + * remove a recognizer by name or instance + * @param {Recognizer|String} recognizer + * @returns {Manager} + */ + remove: function(recognizer) { + if (invokeArrayArg(recognizer, 'remove', this)) { + return this; + } + + recognizer = this.get(recognizer); + + // let's make sure this recognizer exists + if (recognizer) { + var recognizers = this.recognizers; + var index = inArray(recognizers, recognizer); + + if (index !== -1) { + recognizers.splice(index, 1); + this.touchAction.update(); + } + } + + return this; + }, + + /** + * bind event + * @param {String} events + * @param {Function} handler + * @returns {EventEmitter} this + */ + on: function(events, handler) { + if (events === undefined) { + return; + } + if (handler === undefined) { + return; + } + + var handlers = this.handlers; + each(splitStr(events), function(event) { + handlers[event] = handlers[event] || []; + handlers[event].push(handler); + }); + return this; + }, + + /** + * unbind event, leave emit blank to remove all handlers + * @param {String} events + * @param {Function} [handler] + * @returns {EventEmitter} this + */ + off: function(events, handler) { + if (events === undefined) { + return; + } + + var handlers = this.handlers; + each(splitStr(events), function(event) { + if (!handler) { + delete handlers[event]; + } else { + handlers[event] && handlers[event].splice(inArray(handlers[event], handler), 1); + } + }); + return this; + }, + + /** + * emit event to the listeners + * @param {String} event + * @param {Object} data + */ + emit: function(event, data) { + // we also want to trigger dom events + if (this.options.domEvents) { + triggerDomEvent(event, data); + } + + // no handlers, so skip it all + var handlers = this.handlers[event] && this.handlers[event].slice(); + if (!handlers || !handlers.length) { + return; + } + + data.type = event; + data.preventDefault = function() { + data.srcEvent.preventDefault(); + }; + + var i = 0; + while (i < handlers.length) { + handlers[i](data); + i++; + } + }, + + /** + * destroy the manager and unbinds all events + * it doesn't unbind dom events, that is the user own responsibility + */ + destroy: function() { + this.element && toggleCssProps(this, false); + + this.handlers = {}; + this.session = {}; + this.input.destroy(); + this.element = null; + } +}; + +/** + * add/remove the css properties as defined in manager.options.cssProps + * @param {Manager} manager + * @param {Boolean} add + */ +function toggleCssProps(manager, add) { + var element = manager.element; + if (!element.style) { + return; + } + var prop; + each(manager.options.cssProps, function(value, name) { + prop = prefixed(element.style, name); + if (add) { + manager.oldCssProps[prop] = element.style[prop]; + element.style[prop] = value; + } else { + element.style[prop] = manager.oldCssProps[prop] || ''; + } + }); + if (!add) { + manager.oldCssProps = {}; + } +} + +/** + * trigger dom event + * @param {String} event + * @param {Object} data + */ +function triggerDomEvent(event, data) { + var gestureEvent = document.createEvent('Event'); + gestureEvent.initEvent(event, true, true); + gestureEvent.gesture = data; + data.target.dispatchEvent(gestureEvent); +} diff --git a/www/js/hammerjs/src/recognizer.js b/www/js/hammerjs/src/recognizer.js new file mode 100644 index 0000000..b0dd9fa --- /dev/null +++ b/www/js/hammerjs/src/recognizer.js @@ -0,0 +1,327 @@ +/** + * Recognizer flow explained; * + * All recognizers have the initial state of POSSIBLE when a input session starts. + * The definition of a input session is from the first input until the last input, with all it's movement in it. * + * Example session for mouse-input: mousedown -> mousemove -> mouseup + * + * On each recognizing cycle (see Manager.recognize) the .recognize() method is executed + * which determines with state it should be. + * + * If the recognizer has the state FAILED, CANCELLED or RECOGNIZED (equals ENDED), it is reset to + * POSSIBLE to give it another change on the next cycle. + * + * Possible + * | + * +-----+---------------+ + * | | + * +-----+-----+ | + * | | | + * Failed Cancelled | + * +-------+------+ + * | | + * Recognized Began + * | + * Changed + * | + * Ended/Recognized + */ +var STATE_POSSIBLE = 1; +var STATE_BEGAN = 2; +var STATE_CHANGED = 4; +var STATE_ENDED = 8; +var STATE_RECOGNIZED = STATE_ENDED; +var STATE_CANCELLED = 16; +var STATE_FAILED = 32; + +/** + * Recognizer + * Every recognizer needs to extend from this class. + * @constructor + * @param {Object} options + */ +function Recognizer(options) { + this.options = assign({}, this.defaults, options || {}); + + this.id = uniqueId(); + + this.manager = null; + + // default is enable true + this.options.enable = ifUndefined(this.options.enable, true); + + this.state = STATE_POSSIBLE; + + this.simultaneous = {}; + this.requireFail = []; +} + +Recognizer.prototype = { + /** + * @virtual + * @type {Object} + */ + defaults: {}, + + /** + * set options + * @param {Object} options + * @return {Recognizer} + */ + set: function(options) { + assign(this.options, options); + + // also update the touchAction, in case something changed about the directions/enabled state + this.manager && this.manager.touchAction.update(); + return this; + }, + + /** + * recognize simultaneous with an other recognizer. + * @param {Recognizer} otherRecognizer + * @returns {Recognizer} this + */ + recognizeWith: function(otherRecognizer) { + if (invokeArrayArg(otherRecognizer, 'recognizeWith', this)) { + return this; + } + + var simultaneous = this.simultaneous; + otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this); + if (!simultaneous[otherRecognizer.id]) { + simultaneous[otherRecognizer.id] = otherRecognizer; + otherRecognizer.recognizeWith(this); + } + return this; + }, + + /** + * drop the simultaneous link. it doesnt remove the link on the other recognizer. + * @param {Recognizer} otherRecognizer + * @returns {Recognizer} this + */ + dropRecognizeWith: function(otherRecognizer) { + if (invokeArrayArg(otherRecognizer, 'dropRecognizeWith', this)) { + return this; + } + + otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this); + delete this.simultaneous[otherRecognizer.id]; + return this; + }, + + /** + * recognizer can only run when an other is failing + * @param {Recognizer} otherRecognizer + * @returns {Recognizer} this + */ + requireFailure: function(otherRecognizer) { + if (invokeArrayArg(otherRecognizer, 'requireFailure', this)) { + return this; + } + + var requireFail = this.requireFail; + otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this); + if (inArray(requireFail, otherRecognizer) === -1) { + requireFail.push(otherRecognizer); + otherRecognizer.requireFailure(this); + } + return this; + }, + + /** + * drop the requireFailure link. it does not remove the link on the other recognizer. + * @param {Recognizer} otherRecognizer + * @returns {Recognizer} this + */ + dropRequireFailure: function(otherRecognizer) { + if (invokeArrayArg(otherRecognizer, 'dropRequireFailure', this)) { + return this; + } + + otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this); + var index = inArray(this.requireFail, otherRecognizer); + if (index > -1) { + this.requireFail.splice(index, 1); + } + return this; + }, + + /** + * has require failures boolean + * @returns {boolean} + */ + hasRequireFailures: function() { + return this.requireFail.length > 0; + }, + + /** + * if the recognizer can recognize simultaneous with an other recognizer + * @param {Recognizer} otherRecognizer + * @returns {Boolean} + */ + canRecognizeWith: function(otherRecognizer) { + return !!this.simultaneous[otherRecognizer.id]; + }, + + /** + * You should use `tryEmit` instead of `emit` directly to check + * that all the needed recognizers has failed before emitting. + * @param {Object} input + */ + emit: function(input) { + var self = this; + var state = this.state; + + function emit(event) { + self.manager.emit(event, input); + } + + // 'panstart' and 'panmove' + if (state < STATE_ENDED) { + emit(self.options.event + stateStr(state)); + } + + emit(self.options.event); // simple 'eventName' events + + if (input.additionalEvent) { // additional event(panleft, panright, pinchin, pinchout...) + emit(input.additionalEvent); + } + + // panend and pancancel + if (state >= STATE_ENDED) { + emit(self.options.event + stateStr(state)); + } + }, + + /** + * Check that all the require failure recognizers has failed, + * if true, it emits a gesture event, + * otherwise, setup the state to FAILED. + * @param {Object} input + */ + tryEmit: function(input) { + if (this.canEmit()) { + return this.emit(input); + } + // it's failing anyway + this.state = STATE_FAILED; + }, + + /** + * can we emit? + * @returns {boolean} + */ + canEmit: function() { + var i = 0; + while (i < this.requireFail.length) { + if (!(this.requireFail[i].state & (STATE_FAILED | STATE_POSSIBLE))) { + return false; + } + i++; + } + return true; + }, + + /** + * update the recognizer + * @param {Object} inputData + */ + recognize: function(inputData) { + // make a new copy of the inputData + // so we can change the inputData without messing up the other recognizers + var inputDataClone = assign({}, inputData); + + // is is enabled and allow recognizing? + if (!boolOrFn(this.options.enable, [this, inputDataClone])) { + this.reset(); + this.state = STATE_FAILED; + return; + } + + // reset when we've reached the end + if (this.state & (STATE_RECOGNIZED | STATE_CANCELLED | STATE_FAILED)) { + this.state = STATE_POSSIBLE; + } + + this.state = this.process(inputDataClone); + + // the recognizer has recognized a gesture + // so trigger an event + if (this.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED | STATE_CANCELLED)) { + this.tryEmit(inputDataClone); + } + }, + + /** + * return the state of the recognizer + * the actual recognizing happens in this method + * @virtual + * @param {Object} inputData + * @returns {Const} STATE + */ + process: function(inputData) { }, // jshint ignore:line + + /** + * return the preferred touch-action + * @virtual + * @returns {Array} + */ + getTouchAction: function() { }, + + /** + * called when the gesture isn't allowed to recognize + * like when another is being recognized or it is disabled + * @virtual + */ + reset: function() { } +}; + +/** + * get a usable string, used as event postfix + * @param {Const} state + * @returns {String} state + */ +function stateStr(state) { + if (state & STATE_CANCELLED) { + return 'cancel'; + } else if (state & STATE_ENDED) { + return 'end'; + } else if (state & STATE_CHANGED) { + return 'move'; + } else if (state & STATE_BEGAN) { + return 'start'; + } + return ''; +} + +/** + * direction cons to string + * @param {Const} direction + * @returns {String} + */ +function directionStr(direction) { + if (direction == DIRECTION_DOWN) { + return 'down'; + } else if (direction == DIRECTION_UP) { + return 'up'; + } else if (direction == DIRECTION_LEFT) { + return 'left'; + } else if (direction == DIRECTION_RIGHT) { + return 'right'; + } + return ''; +} + +/** + * get a recognizer by name if it is bound to a manager + * @param {Recognizer|String} otherRecognizer + * @param {Recognizer} recognizer + * @returns {Recognizer} + */ +function getRecognizerByNameIfManager(otherRecognizer, recognizer) { + var manager = recognizer.manager; + if (manager) { + return manager.get(otherRecognizer); + } + return otherRecognizer; +} diff --git a/www/js/hammerjs/src/recognizers/attribute.js b/www/js/hammerjs/src/recognizers/attribute.js new file mode 100644 index 0000000..0d7fff4 --- /dev/null +++ b/www/js/hammerjs/src/recognizers/attribute.js @@ -0,0 +1,60 @@ +/** + * This recognizer is just used as a base for the simple attribute recognizers. + * @constructor + * @extends Recognizer + */ +function AttrRecognizer() { + Recognizer.apply(this, arguments); +} + +inherit(AttrRecognizer, Recognizer, { + /** + * @namespace + * @memberof AttrRecognizer + */ + defaults: { + /** + * @type {Number} + * @default 1 + */ + pointers: 1 + }, + + /** + * Used to check if it the recognizer receives valid input, like input.distance > 10. + * @memberof AttrRecognizer + * @param {Object} input + * @returns {Boolean} recognized + */ + attrTest: function(input) { + var optionPointers = this.options.pointers; + return optionPointers === 0 || input.pointers.length === optionPointers; + }, + + /** + * Process the input and return the state for the recognizer + * @memberof AttrRecognizer + * @param {Object} input + * @returns {*} State + */ + process: function(input) { + var state = this.state; + var eventType = input.eventType; + + var isRecognized = state & (STATE_BEGAN | STATE_CHANGED); + var isValid = this.attrTest(input); + + // on cancel input and we've recognized before, return STATE_CANCELLED + if (isRecognized && (eventType & INPUT_CANCEL || !isValid)) { + return state | STATE_CANCELLED; + } else if (isRecognized || isValid) { + if (eventType & INPUT_END) { + return state | STATE_ENDED; + } else if (!(state & STATE_BEGAN)) { + return STATE_BEGAN; + } + return state | STATE_CHANGED; + } + return STATE_FAILED; + } +}); diff --git a/www/js/hammerjs/src/recognizers/pan.js b/www/js/hammerjs/src/recognizers/pan.js new file mode 100644 index 0000000..8cc3398 --- /dev/null +++ b/www/js/hammerjs/src/recognizers/pan.js @@ -0,0 +1,79 @@ +/** + * Pan + * Recognized when the pointer is down and moved in the allowed direction. + * @constructor + * @extends AttrRecognizer + */ +function PanRecognizer() { + AttrRecognizer.apply(this, arguments); + + this.pX = null; + this.pY = null; +} + +inherit(PanRecognizer, AttrRecognizer, { + /** + * @namespace + * @memberof PanRecognizer + */ + defaults: { + event: 'pan', + threshold: 10, + pointers: 1, + direction: DIRECTION_ALL + }, + + getTouchAction: function() { + var direction = this.options.direction; + var actions = []; + if (direction & DIRECTION_HORIZONTAL) { + actions.push(TOUCH_ACTION_PAN_Y); + } + if (direction & DIRECTION_VERTICAL) { + actions.push(TOUCH_ACTION_PAN_X); + } + return actions; + }, + + directionTest: function(input) { + var options = this.options; + var hasMoved = true; + var distance = input.distance; + var direction = input.direction; + var x = input.deltaX; + var y = input.deltaY; + + // lock to axis? + if (!(direction & options.direction)) { + if (options.direction & DIRECTION_HORIZONTAL) { + direction = (x === 0) ? DIRECTION_NONE : (x < 0) ? DIRECTION_LEFT : DIRECTION_RIGHT; + hasMoved = x != this.pX; + distance = Math.abs(input.deltaX); + } else { + direction = (y === 0) ? DIRECTION_NONE : (y < 0) ? DIRECTION_UP : DIRECTION_DOWN; + hasMoved = y != this.pY; + distance = Math.abs(input.deltaY); + } + } + input.direction = direction; + return hasMoved && distance > options.threshold && direction & options.direction; + }, + + attrTest: function(input) { + return AttrRecognizer.prototype.attrTest.call(this, input) && + (this.state & STATE_BEGAN || (!(this.state & STATE_BEGAN) && this.directionTest(input))); + }, + + emit: function(input) { + + this.pX = input.deltaX; + this.pY = input.deltaY; + + var direction = directionStr(input.direction); + + if (direction) { + input.additionalEvent = this.options.event + direction; + } + this._super.emit.call(this, input); + } +}); diff --git a/www/js/hammerjs/src/recognizers/pinch.js b/www/js/hammerjs/src/recognizers/pinch.js new file mode 100644 index 0000000..cc19b30 --- /dev/null +++ b/www/js/hammerjs/src/recognizers/pinch.js @@ -0,0 +1,38 @@ +/** + * Pinch + * Recognized when two or more pointers are moving toward (zoom-in) or away from each other (zoom-out). + * @constructor + * @extends AttrRecognizer + */ +function PinchRecognizer() { + AttrRecognizer.apply(this, arguments); +} + +inherit(PinchRecognizer, AttrRecognizer, { + /** + * @namespace + * @memberof PinchRecognizer + */ + defaults: { + event: 'pinch', + threshold: 0, + pointers: 2 + }, + + getTouchAction: function() { + return [TOUCH_ACTION_NONE]; + }, + + attrTest: function(input) { + return this._super.attrTest.call(this, input) && + (Math.abs(input.scale - 1) > this.options.threshold || this.state & STATE_BEGAN); + }, + + emit: function(input) { + if (input.scale !== 1) { + var inOut = input.scale < 1 ? 'in' : 'out'; + input.additionalEvent = this.options.event + inOut; + } + this._super.emit.call(this, input); + } +}); diff --git a/www/js/hammerjs/src/recognizers/press.js b/www/js/hammerjs/src/recognizers/press.js new file mode 100644 index 0000000..d52f830 --- /dev/null +++ b/www/js/hammerjs/src/recognizers/press.js @@ -0,0 +1,70 @@ +/** + * Press + * Recognized when the pointer is down for x ms without any movement. + * @constructor + * @extends Recognizer + */ +function PressRecognizer() { + Recognizer.apply(this, arguments); + + this._timer = null; + this._input = null; +} + +inherit(PressRecognizer, Recognizer, { + /** + * @namespace + * @memberof PressRecognizer + */ + defaults: { + event: 'press', + pointers: 1, + time: 251, // minimal time of the pointer to be pressed + threshold: 9 // a minimal movement is ok, but keep it low + }, + + getTouchAction: function() { + return [TOUCH_ACTION_AUTO]; + }, + + process: function(input) { + var options = this.options; + var validPointers = input.pointers.length === options.pointers; + var validMovement = input.distance < options.threshold; + var validTime = input.deltaTime > options.time; + + this._input = input; + + // we only allow little movement + // and we've reached an end event, so a tap is possible + if (!validMovement || !validPointers || (input.eventType & (INPUT_END | INPUT_CANCEL) && !validTime)) { + this.reset(); + } else if (input.eventType & INPUT_START) { + this.reset(); + this._timer = setTimeoutContext(function() { + this.state = STATE_RECOGNIZED; + this.tryEmit(); + }, options.time, this); + } else if (input.eventType & INPUT_END) { + return STATE_RECOGNIZED; + } + return STATE_FAILED; + }, + + reset: function() { + clearTimeout(this._timer); + }, + + emit: function(input) { + if (this.state !== STATE_RECOGNIZED) { + return; + } + + if (input && (input.eventType & INPUT_END)) { + this.manager.emit(this.options.event + 'up', input); + } else { + this._input.timeStamp = now(); + this.manager.emit(this.options.event, this._input); + } + } +}); diff --git a/www/js/hammerjs/src/recognizers/rotate.js b/www/js/hammerjs/src/recognizers/rotate.js new file mode 100644 index 0000000..2079824 --- /dev/null +++ b/www/js/hammerjs/src/recognizers/rotate.js @@ -0,0 +1,30 @@ +/** + * Rotate + * Recognized when two or more pointer are moving in a circular motion. + * @constructor + * @extends AttrRecognizer + */ +function RotateRecognizer() { + AttrRecognizer.apply(this, arguments); +} + +inherit(RotateRecognizer, AttrRecognizer, { + /** + * @namespace + * @memberof RotateRecognizer + */ + defaults: { + event: 'rotate', + threshold: 0, + pointers: 2 + }, + + getTouchAction: function() { + return [TOUCH_ACTION_NONE]; + }, + + attrTest: function(input) { + return this._super.attrTest.call(this, input) && + (Math.abs(input.rotation) > this.options.threshold || this.state & STATE_BEGAN); + } +}); diff --git a/www/js/hammerjs/src/recognizers/swipe.js b/www/js/hammerjs/src/recognizers/swipe.js new file mode 100644 index 0000000..fb3d66c --- /dev/null +++ b/www/js/hammerjs/src/recognizers/swipe.js @@ -0,0 +1,55 @@ +/** + * Swipe + * Recognized when the pointer is moving fast (velocity), with enough distance in the allowed direction. + * @constructor + * @extends AttrRecognizer + */ +function SwipeRecognizer() { + AttrRecognizer.apply(this, arguments); +} + +inherit(SwipeRecognizer, AttrRecognizer, { + /** + * @namespace + * @memberof SwipeRecognizer + */ + defaults: { + event: 'swipe', + threshold: 10, + velocity: 0.3, + direction: DIRECTION_HORIZONTAL | DIRECTION_VERTICAL, + pointers: 1 + }, + + getTouchAction: function() { + return PanRecognizer.prototype.getTouchAction.call(this); + }, + + attrTest: function(input) { + var direction = this.options.direction; + var velocity; + + if (direction & (DIRECTION_HORIZONTAL | DIRECTION_VERTICAL)) { + velocity = input.overallVelocity; + } else if (direction & DIRECTION_HORIZONTAL) { + velocity = input.overallVelocityX; + } else if (direction & DIRECTION_VERTICAL) { + velocity = input.overallVelocityY; + } + + return this._super.attrTest.call(this, input) && + direction & input.offsetDirection && + input.distance > this.options.threshold && + input.maxPointers == this.options.pointers && + abs(velocity) > this.options.velocity && input.eventType & INPUT_END; + }, + + emit: function(input) { + var direction = directionStr(input.offsetDirection); + if (direction) { + this.manager.emit(this.options.event + direction, input); + } + + this.manager.emit(this.options.event, input); + } +}); diff --git a/www/js/hammerjs/src/recognizers/tap.js b/www/js/hammerjs/src/recognizers/tap.js new file mode 100644 index 0000000..072d45c --- /dev/null +++ b/www/js/hammerjs/src/recognizers/tap.js @@ -0,0 +1,114 @@ +/** + * A tap is ecognized when the pointer is doing a small tap/click. Multiple taps are recognized if they occur + * between the given interval and position. The delay option can be used to recognize multi-taps without firing + * a single tap. + * + * The eventData from the emitted event contains the property `tapCount`, which contains the amount of + * multi-taps being recognized. + * @constructor + * @extends Recognizer + */ +function TapRecognizer() { + Recognizer.apply(this, arguments); + + // previous time and center, + // used for tap counting + this.pTime = false; + this.pCenter = false; + + this._timer = null; + this._input = null; + this.count = 0; +} + +inherit(TapRecognizer, Recognizer, { + /** + * @namespace + * @memberof PinchRecognizer + */ + defaults: { + event: 'tap', + pointers: 1, + taps: 1, + interval: 300, // max time between the multi-tap taps + time: 250, // max time of the pointer to be down (like finger on the screen) + threshold: 9, // a minimal movement is ok, but keep it low + posThreshold: 10 // a multi-tap can be a bit off the initial position + }, + + getTouchAction: function() { + return [TOUCH_ACTION_MANIPULATION]; + }, + + process: function(input) { + var options = this.options; + + var validPointers = input.pointers.length === options.pointers; + var validMovement = input.distance < options.threshold; + var validTouchTime = input.deltaTime < options.time; + + this.reset(); + + if ((input.eventType & INPUT_START) && (this.count === 0)) { + return this.failTimeout(); + } + + // we only allow little movement + // and we've reached an end event, so a tap is possible + if (validMovement && validTouchTime && validPointers) { + if (input.eventType != INPUT_END) { + return this.failTimeout(); + } + + var validInterval = this.pTime ? (input.timeStamp - this.pTime < options.interval) : true; + var validMultiTap = !this.pCenter || getDistance(this.pCenter, input.center) < options.posThreshold; + + this.pTime = input.timeStamp; + this.pCenter = input.center; + + if (!validMultiTap || !validInterval) { + this.count = 1; + } else { + this.count += 1; + } + + this._input = input; + + // if tap count matches we have recognized it, + // else it has began recognizing... + var tapCount = this.count % options.taps; + if (tapCount === 0) { + // no failing requirements, immediately trigger the tap event + // or wait as long as the multitap interval to trigger + if (!this.hasRequireFailures()) { + return STATE_RECOGNIZED; + } else { + this._timer = setTimeoutContext(function() { + this.state = STATE_RECOGNIZED; + this.tryEmit(); + }, options.interval, this); + return STATE_BEGAN; + } + } + } + return STATE_FAILED; + }, + + failTimeout: function() { + this._timer = setTimeoutContext(function() { + this.state = STATE_FAILED; + }, this.options.interval, this); + return STATE_FAILED; + }, + + reset: function() { + clearTimeout(this._timer); + }, + + emit: function() { + if (this.state == STATE_RECOGNIZED) { + this._input.tapCount = this.count; + this.manager.emit(this.options.event, this._input); + } + } +}); diff --git a/www/js/hammerjs/src/touchaction.js b/www/js/hammerjs/src/touchaction.js new file mode 100644 index 0000000..5560901 --- /dev/null +++ b/www/js/hammerjs/src/touchaction.js @@ -0,0 +1,164 @@ +var PREFIXED_TOUCH_ACTION = prefixed(TEST_ELEMENT.style, 'touchAction'); +var NATIVE_TOUCH_ACTION = PREFIXED_TOUCH_ACTION !== undefined; + +// magical touchAction value +var TOUCH_ACTION_COMPUTE = 'compute'; +var TOUCH_ACTION_AUTO = 'auto'; +var TOUCH_ACTION_MANIPULATION = 'manipulation'; // not implemented +var TOUCH_ACTION_NONE = 'none'; +var TOUCH_ACTION_PAN_X = 'pan-x'; +var TOUCH_ACTION_PAN_Y = 'pan-y'; +var TOUCH_ACTION_MAP = getTouchActionProps(); + +/** + * Touch Action + * sets the touchAction property or uses the js alternative + * @param {Manager} manager + * @param {String} value + * @constructor + */ +function TouchAction(manager, value) { + this.manager = manager; + this.set(value); +} + +TouchAction.prototype = { + /** + * set the touchAction value on the element or enable the polyfill + * @param {String} value + */ + set: function(value) { + // find out the touch-action by the event handlers + if (value == TOUCH_ACTION_COMPUTE) { + value = this.compute(); + } + + if (NATIVE_TOUCH_ACTION && this.manager.element.style && TOUCH_ACTION_MAP[value]) { + this.manager.element.style[PREFIXED_TOUCH_ACTION] = value; + } + this.actions = value.toLowerCase().trim(); + }, + + /** + * just re-set the touchAction value + */ + update: function() { + this.set(this.manager.options.touchAction); + }, + + /** + * compute the value for the touchAction property based on the recognizer's settings + * @returns {String} value + */ + compute: function() { + var actions = []; + each(this.manager.recognizers, function(recognizer) { + if (boolOrFn(recognizer.options.enable, [recognizer])) { + actions = actions.concat(recognizer.getTouchAction()); + } + }); + return cleanTouchActions(actions.join(' ')); + }, + + /** + * this method is called on each input cycle and provides the preventing of the browser behavior + * @param {Object} input + */ + preventDefaults: function(input) { + var srcEvent = input.srcEvent; + var direction = input.offsetDirection; + + // if the touch action did prevented once this session + if (this.manager.session.prevented) { + srcEvent.preventDefault(); + return; + } + + var actions = this.actions; + var hasNone = inStr(actions, TOUCH_ACTION_NONE) && !TOUCH_ACTION_MAP[TOUCH_ACTION_NONE]; + var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_Y]; + var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_X]; + + if (hasNone) { + //do not prevent defaults if this is a tap gesture + + var isTapPointer = input.pointers.length === 1; + var isTapMovement = input.distance < 2; + var isTapTouchTime = input.deltaTime < 250; + + if (isTapPointer && isTapMovement && isTapTouchTime) { + return; + } + } + + if (hasPanX && hasPanY) { + // `pan-x pan-y` means browser handles all scrolling/panning, do not prevent + return; + } + + if (hasNone || + (hasPanY && direction & DIRECTION_HORIZONTAL) || + (hasPanX && direction & DIRECTION_VERTICAL)) { + return this.preventSrc(srcEvent); + } + }, + + /** + * call preventDefault to prevent the browser's default behavior (scrolling in most cases) + * @param {Object} srcEvent + */ + preventSrc: function(srcEvent) { + this.manager.session.prevented = true; + srcEvent.preventDefault(); + } +}; + +/** + * when the touchActions are collected they are not a valid value, so we need to clean things up. * + * @param {String} actions + * @returns {*} + */ +function cleanTouchActions(actions) { + // none + if (inStr(actions, TOUCH_ACTION_NONE)) { + return TOUCH_ACTION_NONE; + } + + var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X); + var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y); + + // if both pan-x and pan-y are set (different recognizers + // for different directions, e.g. horizontal pan but vertical swipe?) + // we need none (as otherwise with pan-x pan-y combined none of these + // recognizers will work, since the browser would handle all panning + if (hasPanX && hasPanY) { + return TOUCH_ACTION_NONE; + } + + // pan-x OR pan-y + if (hasPanX || hasPanY) { + return hasPanX ? TOUCH_ACTION_PAN_X : TOUCH_ACTION_PAN_Y; + } + + // manipulation + if (inStr(actions, TOUCH_ACTION_MANIPULATION)) { + return TOUCH_ACTION_MANIPULATION; + } + + return TOUCH_ACTION_AUTO; +} + +function getTouchActionProps() { + if (!NATIVE_TOUCH_ACTION) { + return false; + } + var touchMap = {}; + var cssSupports = window.CSS && window.CSS.supports; + ['auto', 'manipulation', 'pan-y', 'pan-x', 'pan-x pan-y', 'none'].forEach(function(val) { + + // If css.supports is not supported but there is native touch-action assume it supports + // all values. This is the case for IE 10 and 11. + touchMap[val] = cssSupports ? window.CSS.supports('touch-action', val) : true; + }); + return touchMap; +} diff --git a/www/js/hammerjs/src/utils.js b/www/js/hammerjs/src/utils.js new file mode 100644 index 0000000..c923ce5 --- /dev/null +++ b/www/js/hammerjs/src/utils.js @@ -0,0 +1,371 @@ +var VENDOR_PREFIXES = ['', 'webkit', 'Moz', 'MS', 'ms', 'o']; +var TEST_ELEMENT = document.createElement('div'); + +var TYPE_FUNCTION = 'function'; + +var round = Math.round; +var abs = Math.abs; +var now = Date.now; + +/** + * set a timeout with a given scope + * @param {Function} fn + * @param {Number} timeout + * @param {Object} context + * @returns {number} + */ +function setTimeoutContext(fn, timeout, context) { + return setTimeout(bindFn(fn, context), timeout); +} + +/** + * if the argument is an array, we want to execute the fn on each entry + * if it aint an array we don't want to do a thing. + * this is used by all the methods that accept a single and array argument. + * @param {*|Array} arg + * @param {String} fn + * @param {Object} [context] + * @returns {Boolean} + */ +function invokeArrayArg(arg, fn, context) { + if (Array.isArray(arg)) { + each(arg, context[fn], context); + return true; + } + return false; +} + +/** + * walk objects and arrays + * @param {Object} obj + * @param {Function} iterator + * @param {Object} context + */ +function each(obj, iterator, context) { + var i; + + if (!obj) { + return; + } + + if (obj.forEach) { + obj.forEach(iterator, context); + } else if (obj.length !== undefined) { + i = 0; + while (i < obj.length) { + iterator.call(context, obj[i], i, obj); + i++; + } + } else { + for (i in obj) { + obj.hasOwnProperty(i) && iterator.call(context, obj[i], i, obj); + } + } +} + +/** + * wrap a method with a deprecation warning and stack trace + * @param {Function} method + * @param {String} name + * @param {String} message + * @returns {Function} A new function wrapping the supplied method. + */ +function deprecate(method, name, message) { + var deprecationMessage = 'DEPRECATED METHOD: ' + name + '\n' + message + ' AT \n'; + return function() { + var e = new Error('get-stack-trace'); + var stack = e && e.stack ? e.stack.replace(/^[^\(]+?[\n$]/gm, '') + .replace(/^\s+at\s+/gm, '') + .replace(/^Object.\s*\(/gm, '{anonymous}()@') : 'Unknown Stack Trace'; + + var log = window.console && (window.console.warn || window.console.log); + if (log) { + log.call(window.console, deprecationMessage, stack); + } + return method.apply(this, arguments); + }; +} + +/** + * extend object. + * means that properties in dest will be overwritten by the ones in src. + * @param {Object} target + * @param {...Object} objects_to_assign + * @returns {Object} target + */ +var assign; +if (typeof Object.assign !== 'function') { + assign = function assign(target) { + if (target === undefined || target === null) { + throw new TypeError('Cannot convert undefined or null to object'); + } + + var output = Object(target); + for (var index = 1; index < arguments.length; index++) { + var source = arguments[index]; + if (source !== undefined && source !== null) { + for (var nextKey in source) { + if (source.hasOwnProperty(nextKey)) { + output[nextKey] = source[nextKey]; + } + } + } + } + return output; + }; +} else { + assign = Object.assign; +} + +/** + * extend object. + * means that properties in dest will be overwritten by the ones in src. + * @param {Object} dest + * @param {Object} src + * @param {Boolean} [merge=false] + * @returns {Object} dest + */ +var extend = deprecate(function extend(dest, src, merge) { + var keys = Object.keys(src); + var i = 0; + while (i < keys.length) { + if (!merge || (merge && dest[keys[i]] === undefined)) { + dest[keys[i]] = src[keys[i]]; + } + i++; + } + return dest; +}, 'extend', 'Use `assign`.'); + +/** + * merge the values from src in the dest. + * means that properties that exist in dest will not be overwritten by src + * @param {Object} dest + * @param {Object} src + * @returns {Object} dest + */ +var merge = deprecate(function merge(dest, src) { + return extend(dest, src, true); +}, 'merge', 'Use `assign`.'); + +/** + * simple class inheritance + * @param {Function} child + * @param {Function} base + * @param {Object} [properties] + */ +function inherit(child, base, properties) { + var baseP = base.prototype, + childP; + + childP = child.prototype = Object.create(baseP); + childP.constructor = child; + childP._super = baseP; + + if (properties) { + assign(childP, properties); + } +} + +/** + * simple function bind + * @param {Function} fn + * @param {Object} context + * @returns {Function} + */ +function bindFn(fn, context) { + return function boundFn() { + return fn.apply(context, arguments); + }; +} + +/** + * let a boolean value also be a function that must return a boolean + * this first item in args will be used as the context + * @param {Boolean|Function} val + * @param {Array} [args] + * @returns {Boolean} + */ +function boolOrFn(val, args) { + if (typeof val == TYPE_FUNCTION) { + return val.apply(args ? args[0] || undefined : undefined, args); + } + return val; +} + +/** + * use the val2 when val1 is undefined + * @param {*} val1 + * @param {*} val2 + * @returns {*} + */ +function ifUndefined(val1, val2) { + return (val1 === undefined) ? val2 : val1; +} + +/** + * addEventListener with multiple events at once + * @param {EventTarget} target + * @param {String} types + * @param {Function} handler + */ +function addEventListeners(target, types, handler) { + each(splitStr(types), function(type) { + target.addEventListener(type, handler, false); + }); +} + +/** + * removeEventListener with multiple events at once + * @param {EventTarget} target + * @param {String} types + * @param {Function} handler + */ +function removeEventListeners(target, types, handler) { + each(splitStr(types), function(type) { + target.removeEventListener(type, handler, false); + }); +} + +/** + * find if a node is in the given parent + * @method hasParent + * @param {HTMLElement} node + * @param {HTMLElement} parent + * @return {Boolean} found + */ +function hasParent(node, parent) { + while (node) { + if (node == parent) { + return true; + } + node = node.parentNode; + } + return false; +} + +/** + * small indexOf wrapper + * @param {String} str + * @param {String} find + * @returns {Boolean} found + */ +function inStr(str, find) { + return str.indexOf(find) > -1; +} + +/** + * split string on whitespace + * @param {String} str + * @returns {Array} words + */ +function splitStr(str) { + return str.trim().split(/\s+/g); +} + +/** + * find if a array contains the object using indexOf or a simple polyFill + * @param {Array} src + * @param {String} find + * @param {String} [findByKey] + * @return {Boolean|Number} false when not found, or the index + */ +function inArray(src, find, findByKey) { + if (src.indexOf && !findByKey) { + return src.indexOf(find); + } else { + var i = 0; + while (i < src.length) { + if ((findByKey && src[i][findByKey] == find) || (!findByKey && src[i] === find)) { + return i; + } + i++; + } + return -1; + } +} + +/** + * convert array-like objects to real arrays + * @param {Object} obj + * @returns {Array} + */ +function toArray(obj) { + return Array.prototype.slice.call(obj, 0); +} + +/** + * unique array with objects based on a key (like 'id') or just by the array's value + * @param {Array} src [{id:1},{id:2},{id:1}] + * @param {String} [key] + * @param {Boolean} [sort=False] + * @returns {Array} [{id:1},{id:2}] + */ +function uniqueArray(src, key, sort) { + var results = []; + var values = []; + var i = 0; + + while (i < src.length) { + var val = key ? src[i][key] : src[i]; + if (inArray(values, val) < 0) { + results.push(src[i]); + } + values[i] = val; + i++; + } + + if (sort) { + if (!key) { + results = results.sort(); + } else { + results = results.sort(function sortUniqueArray(a, b) { + return a[key] > b[key]; + }); + } + } + + return results; +} + +/** + * get the prefixed property + * @param {Object} obj + * @param {String} property + * @returns {String|Undefined} prefixed + */ +function prefixed(obj, property) { + var prefix, prop; + var camelProp = property[0].toUpperCase() + property.slice(1); + + var i = 0; + while (i < VENDOR_PREFIXES.length) { + prefix = VENDOR_PREFIXES[i]; + prop = (prefix) ? prefix + camelProp : property; + + if (prop in obj) { + return prop; + } + i++; + } + return undefined; +} + +/** + * get a unique id + * @returns {number} uniqueId + */ +var _uniqueId = 1; +function uniqueId() { + return _uniqueId++; +} + +/** + * get the window object of an element + * @param {HTMLElement} element + * @returns {DocumentView|Window} + */ +function getWindowForElement(element) { + var doc = element.ownerDocument || element; + return (doc.defaultView || doc.parentWindow || window); +} diff --git a/www/js/hammerjs/tests/manual/assets/style.css b/www/js/hammerjs/tests/manual/assets/style.css new file mode 100644 index 0000000..332c999 --- /dev/null +++ b/www/js/hammerjs/tests/manual/assets/style.css @@ -0,0 +1,42 @@ +@import url(http://fonts.googleapis.com/css?family=Open+Sans); + +*, *:after, *:before { + box-sizing: border-box; + -moz-box-sizing: border-box; +} + +html, body { + margin: 0; + padding: 0; + height: 100%; + min-height: 100%; + background: #eee; + font: 13px/1.5em 'Open Sans', Helvetica, Arial, sans-serif; +} + +a { + color: #4986e7; +} + +.bg1, .green { background: #42d692; } +.bg2, .blue { background: #4986e7; } +.bg3, .red { background: #d06b64; } +.bg4, .purple { background: #cd74e6; } +.bg5, .azure { background: #9fe1e7; } + +body { + margin: 20px; +} + +pre { + background: #fff; + padding: 20px; + margin-bottom: 20px; +} + +.container { + max-width: 900px; + margin: 0 auto; +} + +.clear { clear: both; } diff --git a/www/js/hammerjs/tests/manual/compute_touch_action.html b/www/js/hammerjs/tests/manual/compute_touch_action.html new file mode 100644 index 0000000..28e2a25 --- /dev/null +++ b/www/js/hammerjs/tests/manual/compute_touch_action.html @@ -0,0 +1,18 @@ + + + + + + + + Open the inspector and play a bit with the touchAction property. + + + + diff --git a/www/js/hammerjs/tests/manual/input.html b/www/js/hammerjs/tests/manual/input.html new file mode 100644 index 0000000..2889e45 --- /dev/null +++ b/www/js/hammerjs/tests/manual/input.html @@ -0,0 +1,51 @@ + + + + + + + + Hammer.js + + +
+
+
+ +

+
+        

+    
+ + + + diff --git a/www/js/hammerjs/tests/manual/log.html b/www/js/hammerjs/tests/manual/log.html new file mode 100644 index 0000000..36518eb --- /dev/null +++ b/www/js/hammerjs/tests/manual/log.html @@ -0,0 +1,61 @@ + + + + + + + Hammer.js + + +
+ +
+ +
+ +

+
+        

+
+    
+ + + + diff --git a/www/js/hammerjs/tests/manual/multiple.html b/www/js/hammerjs/tests/manual/multiple.html new file mode 100644 index 0000000..be1dc31 --- /dev/null +++ b/www/js/hammerjs/tests/manual/multiple.html @@ -0,0 +1,73 @@ + + + + + + + Hammer.js + + + +
+

+        
+
+        
+ +

Multiple instances the same time

+

You can run multiple instances of Hammer on your page and they will recognize each completely isolated + from each other. This makes it possible to build multi-user interfaces.

+ +
+ + + + diff --git a/www/js/hammerjs/tests/manual/nested.html b/www/js/hammerjs/tests/manual/nested.html new file mode 100644 index 0000000..5f03c51 --- /dev/null +++ b/www/js/hammerjs/tests/manual/nested.html @@ -0,0 +1,217 @@ + + + + + + + + Hammer.js + + + + + +
+
+
+
1.1
+
1.2
+
1.3
+
1.4
+
1.5
+
+
+
+
+
2.1
+
2.2
+
2.3
+
2.4
+
2.5
+
+
+
+
+
3.1
+
3.2
+
3.3
+
3.4
+
3.5
+
+
+
+
+
4.1
+
4.2
+
4.3
+
4.4
+
4.5
+
+
+
+
+
5.1
+
5.2
+
5.3
+
5.4
+
5.5
+
+
+
+ +
+

Nested Pan recognizers

+ +

Nested recognizers are possible with some threshold and with use of requireFailure().

+
+ + + + + + diff --git a/www/js/hammerjs/tests/manual/simulator-googlemaps.html b/www/js/hammerjs/tests/manual/simulator-googlemaps.html new file mode 100644 index 0000000..6100621 --- /dev/null +++ b/www/js/hammerjs/tests/manual/simulator-googlemaps.html @@ -0,0 +1,100 @@ + + + + + + Hammer.js + + + +
+
+ +

Gestures simulator

+

Used for unit-testing Hammer.js. To test it on the Google Maps view, you should open your + + Inspector and emulate a touch-screen. + Or just open it on your touch-device.

+

Currently, it only triggers touchEvents.

+
+ + + + + + + diff --git a/www/js/hammerjs/tests/manual/simulator.html b/www/js/hammerjs/tests/manual/simulator.html new file mode 100644 index 0000000..47c0678 --- /dev/null +++ b/www/js/hammerjs/tests/manual/simulator.html @@ -0,0 +1,118 @@ + + + + + + Hammer.js + + + +
+ +
+
+ +

+
+    

+
+
+ + + + + + + diff --git a/www/js/hammerjs/tests/manual/touchaction.html b/www/js/hammerjs/tests/manual/touchaction.html new file mode 100644 index 0000000..4c68be0 --- /dev/null +++ b/www/js/hammerjs/tests/manual/touchaction.html @@ -0,0 +1,91 @@ + + + + + + Hammer.js + + + + + +
+

Hammer provides a kind of polyfill + for the browsers that don't support the touch-action property.

+ +
Your browser has support for the touch-action property!
+
Your browser doesn't support the touch-action property, + so we use the polyfill.
+ +

touch-action: auto

+

Should prevent nothing.

+
+ +

touch-action: pan-y

+

Should prevent scrolling on horizontal movement. This is set by default when creating a Hammer instance.

+
+ +

touch-action: pan-x

+

Should prevent scrolling on vertical movement.

+
+ +

touch-action: pan-x pan-y

+

Should not prevent any scrolling on any movement. Horizontal and vertical scrolling handled by the browser directly.

+
+ +

touch-action: none

+

Should prevent all.

+
+
+ + + +
+

hi.

+ + + diff --git a/www/js/hammerjs/tests/manual/visual.html b/www/js/hammerjs/tests/manual/visual.html new file mode 100644 index 0000000..f0f7de1 --- /dev/null +++ b/www/js/hammerjs/tests/manual/visual.html @@ -0,0 +1,211 @@ + + + + + + Hammer.js + + + + + +
+
+ + + + + + diff --git a/www/js/hammerjs/tests/unit/assets/blanket.js b/www/js/hammerjs/tests/unit/assets/blanket.js new file mode 100644 index 0000000..fc0bc73 --- /dev/null +++ b/www/js/hammerjs/tests/unit/assets/blanket.js @@ -0,0 +1,5447 @@ +/*! blanket - v1.1.5 */ + +if (typeof QUnit !== 'undefined'){ QUnit.config.autostart = false; } +(function(define){ +/* + Copyright (C) 2012 Ariya Hidayat + Copyright (C) 2012 Mathias Bynens + Copyright (C) 2012 Joost-Wim Boekesteijn + Copyright (C) 2012 Kris Kowal + Copyright (C) 2012 Yusuke Suzuki + Copyright (C) 2012 Arpad Borsos + Copyright (C) 2011 Ariya Hidayat + + 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. + + 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 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. +*/ + +/*jslint bitwise:true plusplus:true */ +/*global esprima:true, define:true, exports:true, window: true, +throwError: true, createLiteral: true, generateStatement: true, +parseAssignmentExpression: true, parseBlock: true, parseExpression: true, +parseFunctionDeclaration: true, parseFunctionExpression: true, +parseFunctionSourceElements: true, parseVariableIdentifier: true, +parseLeftHandSideExpression: true, +parseStatement: true, parseSourceElement: true */ + +(function (root, factory) { + 'use strict'; + + // Universal Module Definition (UMD) to support AMD, CommonJS/Node.js, + // Rhino, and plain browser loading. + if (typeof define === 'function' && define.amd) { + define(['exports'], factory); + } else if (typeof exports !== 'undefined') { + factory(exports); + } else { + factory((root.esprima = {})); + } +}(this, function (exports) { + 'use strict'; + + var Token, + TokenName, + Syntax, + PropertyKind, + Messages, + Regex, + source, + strict, + index, + lineNumber, + lineStart, + length, + buffer, + state, + extra; + + Token = { + BooleanLiteral: 1, + EOF: 2, + Identifier: 3, + Keyword: 4, + NullLiteral: 5, + NumericLiteral: 6, + Punctuator: 7, + StringLiteral: 8 + }; + + TokenName = {}; + TokenName[Token.BooleanLiteral] = 'Boolean'; + TokenName[Token.EOF] = ''; + TokenName[Token.Identifier] = 'Identifier'; + TokenName[Token.Keyword] = 'Keyword'; + TokenName[Token.NullLiteral] = 'Null'; + TokenName[Token.NumericLiteral] = 'Numeric'; + TokenName[Token.Punctuator] = 'Punctuator'; + TokenName[Token.StringLiteral] = 'String'; + + Syntax = { + AssignmentExpression: 'AssignmentExpression', + ArrayExpression: 'ArrayExpression', + BlockStatement: 'BlockStatement', + BinaryExpression: 'BinaryExpression', + BreakStatement: 'BreakStatement', + CallExpression: 'CallExpression', + CatchClause: 'CatchClause', + ConditionalExpression: 'ConditionalExpression', + ContinueStatement: 'ContinueStatement', + DoWhileStatement: 'DoWhileStatement', + DebuggerStatement: 'DebuggerStatement', + EmptyStatement: 'EmptyStatement', + ExpressionStatement: 'ExpressionStatement', + ForStatement: 'ForStatement', + ForInStatement: 'ForInStatement', + FunctionDeclaration: 'FunctionDeclaration', + FunctionExpression: 'FunctionExpression', + Identifier: 'Identifier', + IfStatement: 'IfStatement', + Literal: 'Literal', + LabeledStatement: 'LabeledStatement', + LogicalExpression: 'LogicalExpression', + MemberExpression: 'MemberExpression', + NewExpression: 'NewExpression', + ObjectExpression: 'ObjectExpression', + Program: 'Program', + Property: 'Property', + ReturnStatement: 'ReturnStatement', + SequenceExpression: 'SequenceExpression', + SwitchStatement: 'SwitchStatement', + SwitchCase: 'SwitchCase', + ThisExpression: 'ThisExpression', + ThrowStatement: 'ThrowStatement', + TryStatement: 'TryStatement', + UnaryExpression: 'UnaryExpression', + UpdateExpression: 'UpdateExpression', + VariableDeclaration: 'VariableDeclaration', + VariableDeclarator: 'VariableDeclarator', + WhileStatement: 'WhileStatement', + WithStatement: 'WithStatement' + }; + + PropertyKind = { + Data: 1, + Get: 2, + Set: 4 + }; + + // Error messages should be identical to V8. + Messages = { + UnexpectedToken: 'Unexpected token %0', + UnexpectedNumber: 'Unexpected number', + UnexpectedString: 'Unexpected string', + UnexpectedIdentifier: 'Unexpected identifier', + UnexpectedReserved: 'Unexpected reserved word', + UnexpectedEOS: 'Unexpected end of input', + NewlineAfterThrow: 'Illegal newline after throw', + InvalidRegExp: 'Invalid regular expression', + UnterminatedRegExp: 'Invalid regular expression: missing /', + InvalidLHSInAssignment: 'Invalid left-hand side in assignment', + InvalidLHSInForIn: 'Invalid left-hand side in for-in', + MultipleDefaultsInSwitch: 'More than one default clause in switch statement', + NoCatchOrFinally: 'Missing catch or finally after try', + UnknownLabel: 'Undefined label \'%0\'', + Redeclaration: '%0 \'%1\' has already been declared', + IllegalContinue: 'Illegal continue statement', + IllegalBreak: 'Illegal break statement', + IllegalReturn: 'Illegal return statement', + StrictModeWith: 'Strict mode code may not include a with statement', + StrictCatchVariable: 'Catch variable may not be eval or arguments in strict mode', + StrictVarName: 'Variable name may not be eval or arguments in strict mode', + StrictParamName: 'Parameter name eval or arguments is not allowed in strict mode', + StrictParamDupe: 'Strict mode function may not have duplicate parameter names', + StrictFunctionName: 'Function name may not be eval or arguments in strict mode', + StrictOctalLiteral: 'Octal literals are not allowed in strict mode.', + StrictDelete: 'Delete of an unqualified identifier in strict mode.', + StrictDuplicateProperty: 'Duplicate data property in object literal not allowed in strict mode', + AccessorDataProperty: 'Object literal may not have data and accessor property with the same name', + AccessorGetSet: 'Object literal may not have multiple get/set accessors with the same name', + StrictLHSAssignment: 'Assignment to eval or arguments is not allowed in strict mode', + StrictLHSPostfix: 'Postfix increment/decrement may not have eval or arguments operand in strict mode', + StrictLHSPrefix: 'Prefix increment/decrement may not have eval or arguments operand in strict mode', + StrictReservedWord: 'Use of future reserved word in strict mode' + }; + + // See also tools/generate-unicode-regex.py. + Regex = { + NonAsciiIdentifierStart: new RegExp('[\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u08a0\u08a2-\u08ac\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097f\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d\u0c58\u0c59\u0c60\u0c61\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d60\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f0\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191c\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19c1-\u19c7\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2e2f\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua697\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua793\ua7a0-\ua7aa\ua7f8-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa80-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc]'), + NonAsciiIdentifierPart: new RegExp('[\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0300-\u0374\u0376\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u0483-\u0487\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u05d0-\u05ea\u05f0-\u05f2\u0610-\u061a\u0620-\u0669\u066e-\u06d3\u06d5-\u06dc\u06df-\u06e8\u06ea-\u06fc\u06ff\u0710-\u074a\u074d-\u07b1\u07c0-\u07f5\u07fa\u0800-\u082d\u0840-\u085b\u08a0\u08a2-\u08ac\u08e4-\u08fe\u0900-\u0963\u0966-\u096f\u0971-\u0977\u0979-\u097f\u0981-\u0983\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bc-\u09c4\u09c7\u09c8\u09cb-\u09ce\u09d7\u09dc\u09dd\u09df-\u09e3\u09e6-\u09f1\u0a01-\u0a03\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a59-\u0a5c\u0a5e\u0a66-\u0a75\u0a81-\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abc-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ad0\u0ae0-\u0ae3\u0ae6-\u0aef\u0b01-\u0b03\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3c-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b5c\u0b5d\u0b5f-\u0b63\u0b66-\u0b6f\u0b71\u0b82\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd0\u0bd7\u0be6-\u0bef\u0c01-\u0c03\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c58\u0c59\u0c60-\u0c63\u0c66-\u0c6f\u0c82\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbc-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0cde\u0ce0-\u0ce3\u0ce6-\u0cef\u0cf1\u0cf2\u0d02\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d-\u0d44\u0d46-\u0d48\u0d4a-\u0d4e\u0d57\u0d60-\u0d63\u0d66-\u0d6f\u0d7a-\u0d7f\u0d82\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2\u0df3\u0e01-\u0e3a\u0e40-\u0e4e\u0e50-\u0e59\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb9\u0ebb-\u0ebd\u0ec0-\u0ec4\u0ec6\u0ec8-\u0ecd\u0ed0-\u0ed9\u0edc-\u0edf\u0f00\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e-\u0f47\u0f49-\u0f6c\u0f71-\u0f84\u0f86-\u0f97\u0f99-\u0fbc\u0fc6\u1000-\u1049\u1050-\u109d\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u135d-\u135f\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f0\u1700-\u170c\u170e-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176c\u176e-\u1770\u1772\u1773\u1780-\u17d3\u17d7\u17dc\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u1820-\u1877\u1880-\u18aa\u18b0-\u18f5\u1900-\u191c\u1920-\u192b\u1930-\u193b\u1946-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u19d0-\u19d9\u1a00-\u1a1b\u1a20-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1aa7\u1b00-\u1b4b\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1bf3\u1c00-\u1c37\u1c40-\u1c49\u1c4d-\u1c7d\u1cd0-\u1cd2\u1cd4-\u1cf6\u1d00-\u1de6\u1dfc-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u200c\u200d\u203f\u2040\u2054\u2071\u207f\u2090-\u209c\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d7f-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2de0-\u2dff\u2e2f\u3005-\u3007\u3021-\u302f\u3031-\u3035\u3038-\u303c\u3041-\u3096\u3099\u309a\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua62b\ua640-\ua66f\ua674-\ua67d\ua67f-\ua697\ua69f-\ua6f1\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua793\ua7a0-\ua7aa\ua7f8-\ua827\ua840-\ua873\ua880-\ua8c4\ua8d0-\ua8d9\ua8e0-\ua8f7\ua8fb\ua900-\ua92d\ua930-\ua953\ua960-\ua97c\ua980-\ua9c0\ua9cf-\ua9d9\uaa00-\uaa36\uaa40-\uaa4d\uaa50-\uaa59\uaa60-\uaa76\uaa7a\uaa7b\uaa80-\uaac2\uaadb-\uaadd\uaae0-\uaaef\uaaf2-\uaaf6\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabea\uabec\uabed\uabf0-\uabf9\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe00-\ufe0f\ufe20-\ufe26\ufe33\ufe34\ufe4d-\ufe4f\ufe70-\ufe74\ufe76-\ufefc\uff10-\uff19\uff21-\uff3a\uff3f\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc]') + }; + + // Ensure the condition is true, otherwise throw an error. + // This is only to have a better contract semantic, i.e. another safety net + // to catch a logic error. The condition shall be fulfilled in normal case. + // Do NOT use this to enforce a certain condition on any user input. + + function assert(condition, message) { + if (!condition) { + throw new Error('ASSERT: ' + message); + } + } + + function sliceSource(from, to) { + return source.slice(from, to); + } + + if (typeof 'esprima'[0] === 'undefined') { + sliceSource = function sliceArraySource(from, to) { + return source.slice(from, to).join(''); + }; + } + + function isDecimalDigit(ch) { + return '0123456789'.indexOf(ch) >= 0; + } + + function isHexDigit(ch) { + return '0123456789abcdefABCDEF'.indexOf(ch) >= 0; + } + + function isOctalDigit(ch) { + return '01234567'.indexOf(ch) >= 0; + } + + + // 7.2 White Space + + function isWhiteSpace(ch) { + return (ch === ' ') || (ch === '\u0009') || (ch === '\u000B') || + (ch === '\u000C') || (ch === '\u00A0') || + (ch.charCodeAt(0) >= 0x1680 && + '\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\uFEFF'.indexOf(ch) >= 0); + } + + // 7.3 Line Terminators + + function isLineTerminator(ch) { + return (ch === '\n' || ch === '\r' || ch === '\u2028' || ch === '\u2029'); + } + + // 7.6 Identifier Names and Identifiers + + function isIdentifierStart(ch) { + return (ch === '$') || (ch === '_') || (ch === '\\') || + (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || + ((ch.charCodeAt(0) >= 0x80) && Regex.NonAsciiIdentifierStart.test(ch)); + } + + function isIdentifierPart(ch) { + return (ch === '$') || (ch === '_') || (ch === '\\') || + (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || + ((ch >= '0') && (ch <= '9')) || + ((ch.charCodeAt(0) >= 0x80) && Regex.NonAsciiIdentifierPart.test(ch)); + } + + // 7.6.1.2 Future Reserved Words + + function isFutureReservedWord(id) { + switch (id) { + + // Future reserved words. + case 'class': + case 'enum': + case 'export': + case 'extends': + case 'import': + case 'super': + return true; + } + + return false; + } + + function isStrictModeReservedWord(id) { + switch (id) { + + // Strict Mode reserved words. + case 'implements': + case 'interface': + case 'package': + case 'private': + case 'protected': + case 'public': + case 'static': + case 'yield': + case 'let': + return true; + } + + return false; + } + + function isRestrictedWord(id) { + return id === 'eval' || id === 'arguments'; + } + + // 7.6.1.1 Keywords + + function isKeyword(id) { + var keyword = false; + switch (id.length) { + case 2: + keyword = (id === 'if') || (id === 'in') || (id === 'do'); + break; + case 3: + keyword = (id === 'var') || (id === 'for') || (id === 'new') || (id === 'try'); + break; + case 4: + keyword = (id === 'this') || (id === 'else') || (id === 'case') || (id === 'void') || (id === 'with'); + break; + case 5: + keyword = (id === 'while') || (id === 'break') || (id === 'catch') || (id === 'throw'); + break; + case 6: + keyword = (id === 'return') || (id === 'typeof') || (id === 'delete') || (id === 'switch'); + break; + case 7: + keyword = (id === 'default') || (id === 'finally'); + break; + case 8: + keyword = (id === 'function') || (id === 'continue') || (id === 'debugger'); + break; + case 10: + keyword = (id === 'instanceof'); + break; + } + + if (keyword) { + return true; + } + + switch (id) { + // Future reserved words. + // 'const' is specialized as Keyword in V8. + case 'const': + return true; + + // For compatiblity to SpiderMonkey and ES.next + case 'yield': + case 'let': + return true; + } + + if (strict && isStrictModeReservedWord(id)) { + return true; + } + + return isFutureReservedWord(id); + } + + // 7.4 Comments + + function skipComment() { + var ch, blockComment, lineComment; + + blockComment = false; + lineComment = false; + + while (index < length) { + ch = source[index]; + + if (lineComment) { + ch = source[index++]; + if (isLineTerminator(ch)) { + lineComment = false; + if (ch === '\r' && source[index] === '\n') { + ++index; + } + ++lineNumber; + lineStart = index; + } + } else if (blockComment) { + if (isLineTerminator(ch)) { + if (ch === '\r' && source[index + 1] === '\n') { + ++index; + } + ++lineNumber; + ++index; + lineStart = index; + if (index >= length) { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + } else { + ch = source[index++]; + if (index >= length) { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + if (ch === '*') { + ch = source[index]; + if (ch === '/') { + ++index; + blockComment = false; + } + } + } + } else if (ch === '/') { + ch = source[index + 1]; + if (ch === '/') { + index += 2; + lineComment = true; + } else if (ch === '*') { + index += 2; + blockComment = true; + if (index >= length) { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + } else { + break; + } + } else if (isWhiteSpace(ch)) { + ++index; + } else if (isLineTerminator(ch)) { + ++index; + if (ch === '\r' && source[index] === '\n') { + ++index; + } + ++lineNumber; + lineStart = index; + } else { + break; + } + } + } + + function scanHexEscape(prefix) { + var i, len, ch, code = 0; + + len = (prefix === 'u') ? 4 : 2; + for (i = 0; i < len; ++i) { + if (index < length && isHexDigit(source[index])) { + ch = source[index++]; + code = code * 16 + '0123456789abcdef'.indexOf(ch.toLowerCase()); + } else { + return ''; + } + } + return String.fromCharCode(code); + } + + function scanIdentifier() { + var ch, start, id, restore; + + ch = source[index]; + if (!isIdentifierStart(ch)) { + return; + } + + start = index; + if (ch === '\\') { + ++index; + if (source[index] !== 'u') { + return; + } + ++index; + restore = index; + ch = scanHexEscape('u'); + if (ch) { + if (ch === '\\' || !isIdentifierStart(ch)) { + return; + } + id = ch; + } else { + index = restore; + id = 'u'; + } + } else { + id = source[index++]; + } + + while (index < length) { + ch = source[index]; + if (!isIdentifierPart(ch)) { + break; + } + if (ch === '\\') { + ++index; + if (source[index] !== 'u') { + return; + } + ++index; + restore = index; + ch = scanHexEscape('u'); + if (ch) { + if (ch === '\\' || !isIdentifierPart(ch)) { + return; + } + id += ch; + } else { + index = restore; + id += 'u'; + } + } else { + id += source[index++]; + } + } + + // There is no keyword or literal with only one character. + // Thus, it must be an identifier. + if (id.length === 1) { + return { + type: Token.Identifier, + value: id, + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + + if (isKeyword(id)) { + return { + type: Token.Keyword, + value: id, + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + + // 7.8.1 Null Literals + + if (id === 'null') { + return { + type: Token.NullLiteral, + value: id, + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + + // 7.8.2 Boolean Literals + + if (id === 'true' || id === 'false') { + return { + type: Token.BooleanLiteral, + value: id, + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + + return { + type: Token.Identifier, + value: id, + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + + // 7.7 Punctuators + + function scanPunctuator() { + var start = index, + ch1 = source[index], + ch2, + ch3, + ch4; + + // Check for most common single-character punctuators. + + if (ch1 === ';' || ch1 === '{' || ch1 === '}') { + ++index; + return { + type: Token.Punctuator, + value: ch1, + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + + if (ch1 === ',' || ch1 === '(' || ch1 === ')') { + ++index; + return { + type: Token.Punctuator, + value: ch1, + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + + // Dot (.) can also start a floating-point number, hence the need + // to check the next character. + + ch2 = source[index + 1]; + if (ch1 === '.' && !isDecimalDigit(ch2)) { + return { + type: Token.Punctuator, + value: source[index++], + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + + // Peek more characters. + + ch3 = source[index + 2]; + ch4 = source[index + 3]; + + // 4-character punctuator: >>>= + + if (ch1 === '>' && ch2 === '>' && ch3 === '>') { + if (ch4 === '=') { + index += 4; + return { + type: Token.Punctuator, + value: '>>>=', + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + } + + // 3-character punctuators: === !== >>> <<= >>= + + if (ch1 === '=' && ch2 === '=' && ch3 === '=') { + index += 3; + return { + type: Token.Punctuator, + value: '===', + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + + if (ch1 === '!' && ch2 === '=' && ch3 === '=') { + index += 3; + return { + type: Token.Punctuator, + value: '!==', + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + + if (ch1 === '>' && ch2 === '>' && ch3 === '>') { + index += 3; + return { + type: Token.Punctuator, + value: '>>>', + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + + if (ch1 === '<' && ch2 === '<' && ch3 === '=') { + index += 3; + return { + type: Token.Punctuator, + value: '<<=', + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + + if (ch1 === '>' && ch2 === '>' && ch3 === '=') { + index += 3; + return { + type: Token.Punctuator, + value: '>>=', + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + + // 2-character punctuators: <= >= == != ++ -- << >> && || + // += -= *= %= &= |= ^= /= + + if (ch2 === '=') { + if ('<>=!+-*%&|^/'.indexOf(ch1) >= 0) { + index += 2; + return { + type: Token.Punctuator, + value: ch1 + ch2, + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + } + + if (ch1 === ch2 && ('+-<>&|'.indexOf(ch1) >= 0)) { + if ('+-<>&|'.indexOf(ch2) >= 0) { + index += 2; + return { + type: Token.Punctuator, + value: ch1 + ch2, + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + } + + // The remaining 1-character punctuators. + + if ('[]<>+-*%&|^!~?:=/'.indexOf(ch1) >= 0) { + return { + type: Token.Punctuator, + value: source[index++], + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + } + + // 7.8.3 Numeric Literals + + function scanNumericLiteral() { + var number, start, ch; + + ch = source[index]; + assert(isDecimalDigit(ch) || (ch === '.'), + 'Numeric literal must start with a decimal digit or a decimal point'); + + start = index; + number = ''; + if (ch !== '.') { + number = source[index++]; + ch = source[index]; + + // Hex number starts with '0x'. + // Octal number starts with '0'. + if (number === '0') { + if (ch === 'x' || ch === 'X') { + number += source[index++]; + while (index < length) { + ch = source[index]; + if (!isHexDigit(ch)) { + break; + } + number += source[index++]; + } + + if (number.length <= 2) { + // only 0x + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + + if (index < length) { + ch = source[index]; + if (isIdentifierStart(ch)) { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + } + return { + type: Token.NumericLiteral, + value: parseInt(number, 16), + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } else if (isOctalDigit(ch)) { + number += source[index++]; + while (index < length) { + ch = source[index]; + if (!isOctalDigit(ch)) { + break; + } + number += source[index++]; + } + + if (index < length) { + ch = source[index]; + if (isIdentifierStart(ch) || isDecimalDigit(ch)) { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + } + return { + type: Token.NumericLiteral, + value: parseInt(number, 8), + octal: true, + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + + // decimal number starts with '0' such as '09' is illegal. + if (isDecimalDigit(ch)) { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + } + + while (index < length) { + ch = source[index]; + if (!isDecimalDigit(ch)) { + break; + } + number += source[index++]; + } + } + + if (ch === '.') { + number += source[index++]; + while (index < length) { + ch = source[index]; + if (!isDecimalDigit(ch)) { + break; + } + number += source[index++]; + } + } + + if (ch === 'e' || ch === 'E') { + number += source[index++]; + + ch = source[index]; + if (ch === '+' || ch === '-') { + number += source[index++]; + } + + ch = source[index]; + if (isDecimalDigit(ch)) { + number += source[index++]; + while (index < length) { + ch = source[index]; + if (!isDecimalDigit(ch)) { + break; + } + number += source[index++]; + } + } else { + ch = 'character ' + ch; + if (index >= length) { + ch = ''; + } + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + } + + if (index < length) { + ch = source[index]; + if (isIdentifierStart(ch)) { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + } + + return { + type: Token.NumericLiteral, + value: parseFloat(number), + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + + // 7.8.4 String Literals + + function scanStringLiteral() { + var str = '', quote, start, ch, code, unescaped, restore, octal = false; + + quote = source[index]; + assert((quote === '\'' || quote === '"'), + 'String literal must starts with a quote'); + + start = index; + ++index; + + while (index < length) { + ch = source[index++]; + + if (ch === quote) { + quote = ''; + break; + } else if (ch === '\\') { + ch = source[index++]; + if (!isLineTerminator(ch)) { + switch (ch) { + case 'n': + str += '\n'; + break; + case 'r': + str += '\r'; + break; + case 't': + str += '\t'; + break; + case 'u': + case 'x': + restore = index; + unescaped = scanHexEscape(ch); + if (unescaped) { + str += unescaped; + } else { + index = restore; + str += ch; + } + break; + case 'b': + str += '\b'; + break; + case 'f': + str += '\f'; + break; + case 'v': + str += '\x0B'; + break; + + default: + if (isOctalDigit(ch)) { + code = '01234567'.indexOf(ch); + + // \0 is not octal escape sequence + if (code !== 0) { + octal = true; + } + + if (index < length && isOctalDigit(source[index])) { + octal = true; + code = code * 8 + '01234567'.indexOf(source[index++]); + + // 3 digits are only allowed when string starts + // with 0, 1, 2, 3 + if ('0123'.indexOf(ch) >= 0 && + index < length && + isOctalDigit(source[index])) { + code = code * 8 + '01234567'.indexOf(source[index++]); + } + } + str += String.fromCharCode(code); + } else { + str += ch; + } + break; + } + } else { + ++lineNumber; + if (ch === '\r' && source[index] === '\n') { + ++index; + } + } + } else if (isLineTerminator(ch)) { + break; + } else { + str += ch; + } + } + + if (quote !== '') { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + + return { + type: Token.StringLiteral, + value: str, + octal: octal, + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + + function scanRegExp() { + var str, ch, start, pattern, flags, value, classMarker = false, restore, terminated = false; + + buffer = null; + skipComment(); + + start = index; + ch = source[index]; + assert(ch === '/', 'Regular expression literal must start with a slash'); + str = source[index++]; + + while (index < length) { + ch = source[index++]; + str += ch; + if (ch === '\\') { + ch = source[index++]; + // ECMA-262 7.8.5 + if (isLineTerminator(ch)) { + throwError({}, Messages.UnterminatedRegExp); + } + str += ch; + } else if (classMarker) { + if (ch === ']') { + classMarker = false; + } + } else { + if (ch === '/') { + terminated = true; + break; + } else if (ch === '[') { + classMarker = true; + } else if (isLineTerminator(ch)) { + throwError({}, Messages.UnterminatedRegExp); + } + } + } + + if (!terminated) { + throwError({}, Messages.UnterminatedRegExp); + } + + // Exclude leading and trailing slash. + pattern = str.substr(1, str.length - 2); + + flags = ''; + while (index < length) { + ch = source[index]; + if (!isIdentifierPart(ch)) { + break; + } + + ++index; + if (ch === '\\' && index < length) { + ch = source[index]; + if (ch === 'u') { + ++index; + restore = index; + ch = scanHexEscape('u'); + if (ch) { + flags += ch; + str += '\\u'; + for (; restore < index; ++restore) { + str += source[restore]; + } + } else { + index = restore; + flags += 'u'; + str += '\\u'; + } + } else { + str += '\\'; + } + } else { + flags += ch; + str += ch; + } + } + + try { + value = new RegExp(pattern, flags); + } catch (e) { + throwError({}, Messages.InvalidRegExp); + } + + return { + literal: str, + value: value, + range: [start, index] + }; + } + + function isIdentifierName(token) { + return token.type === Token.Identifier || + token.type === Token.Keyword || + token.type === Token.BooleanLiteral || + token.type === Token.NullLiteral; + } + + function advance() { + var ch, token; + + skipComment(); + + if (index >= length) { + return { + type: Token.EOF, + lineNumber: lineNumber, + lineStart: lineStart, + range: [index, index] + }; + } + + token = scanPunctuator(); + if (typeof token !== 'undefined') { + return token; + } + + ch = source[index]; + + if (ch === '\'' || ch === '"') { + return scanStringLiteral(); + } + + if (ch === '.' || isDecimalDigit(ch)) { + return scanNumericLiteral(); + } + + token = scanIdentifier(); + if (typeof token !== 'undefined') { + return token; + } + + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + + function lex() { + var token; + + if (buffer) { + index = buffer.range[1]; + lineNumber = buffer.lineNumber; + lineStart = buffer.lineStart; + token = buffer; + buffer = null; + return token; + } + + buffer = null; + return advance(); + } + + function lookahead() { + var pos, line, start; + + if (buffer !== null) { + return buffer; + } + + pos = index; + line = lineNumber; + start = lineStart; + buffer = advance(); + index = pos; + lineNumber = line; + lineStart = start; + + return buffer; + } + + // Return true if there is a line terminator before the next token. + + function peekLineTerminator() { + var pos, line, start, found; + + pos = index; + line = lineNumber; + start = lineStart; + skipComment(); + found = lineNumber !== line; + index = pos; + lineNumber = line; + lineStart = start; + + return found; + } + + // Throw an exception + + function throwError(token, messageFormat) { + var error, + args = Array.prototype.slice.call(arguments, 2), + msg = messageFormat.replace( + /%(\d)/g, + function (whole, index) { + return args[index] || ''; + } + ); + + if (typeof token.lineNumber === 'number') { + error = new Error('Line ' + token.lineNumber + ': ' + msg); + error.index = token.range[0]; + error.lineNumber = token.lineNumber; + error.column = token.range[0] - lineStart + 1; + } else { + error = new Error('Line ' + lineNumber + ': ' + msg); + error.index = index; + error.lineNumber = lineNumber; + error.column = index - lineStart + 1; + } + + throw error; + } + + function throwErrorTolerant() { + try { + throwError.apply(null, arguments); + } catch (e) { + if (extra.errors) { + extra.errors.push(e); + } else { + throw e; + } + } + } + + + // Throw an exception because of the token. + + function throwUnexpected(token) { + if (token.type === Token.EOF) { + throwError(token, Messages.UnexpectedEOS); + } + + if (token.type === Token.NumericLiteral) { + throwError(token, Messages.UnexpectedNumber); + } + + if (token.type === Token.StringLiteral) { + throwError(token, Messages.UnexpectedString); + } + + if (token.type === Token.Identifier) { + throwError(token, Messages.UnexpectedIdentifier); + } + + if (token.type === Token.Keyword) { + if (isFutureReservedWord(token.value)) { + throwError(token, Messages.UnexpectedReserved); + } else if (strict && isStrictModeReservedWord(token.value)) { + throwErrorTolerant(token, Messages.StrictReservedWord); + return; + } + throwError(token, Messages.UnexpectedToken, token.value); + } + + // BooleanLiteral, NullLiteral, or Punctuator. + throwError(token, Messages.UnexpectedToken, token.value); + } + + // Expect the next token to match the specified punctuator. + // If not, an exception will be thrown. + + function expect(value) { + var token = lex(); + if (token.type !== Token.Punctuator || token.value !== value) { + throwUnexpected(token); + } + } + + // Expect the next token to match the specified keyword. + // If not, an exception will be thrown. + + function expectKeyword(keyword) { + var token = lex(); + if (token.type !== Token.Keyword || token.value !== keyword) { + throwUnexpected(token); + } + } + + // Return true if the next token matches the specified punctuator. + + function match(value) { + var token = lookahead(); + return token.type === Token.Punctuator && token.value === value; + } + + // Return true if the next token matches the specified keyword + + function matchKeyword(keyword) { + var token = lookahead(); + return token.type === Token.Keyword && token.value === keyword; + } + + // Return true if the next token is an assignment operator + + function matchAssign() { + var token = lookahead(), + op = token.value; + + if (token.type !== Token.Punctuator) { + return false; + } + return op === '=' || + op === '*=' || + op === '/=' || + op === '%=' || + op === '+=' || + op === '-=' || + op === '<<=' || + op === '>>=' || + op === '>>>=' || + op === '&=' || + op === '^=' || + op === '|='; + } + + function consumeSemicolon() { + var token, line; + + // Catch the very common case first. + if (source[index] === ';') { + lex(); + return; + } + + line = lineNumber; + skipComment(); + if (lineNumber !== line) { + return; + } + + if (match(';')) { + lex(); + return; + } + + token = lookahead(); + if (token.type !== Token.EOF && !match('}')) { + throwUnexpected(token); + } + } + + // Return true if provided expression is LeftHandSideExpression + + function isLeftHandSide(expr) { + return expr.type === Syntax.Identifier || expr.type === Syntax.MemberExpression; + } + + // 11.1.4 Array Initialiser + + function parseArrayInitialiser() { + var elements = []; + + expect('['); + + while (!match(']')) { + if (match(',')) { + lex(); + elements.push(null); + } else { + elements.push(parseAssignmentExpression()); + + if (!match(']')) { + expect(','); + } + } + } + + expect(']'); + + return { + type: Syntax.ArrayExpression, + elements: elements + }; + } + + // 11.1.5 Object Initialiser + + function parsePropertyFunction(param, first) { + var previousStrict, body; + + previousStrict = strict; + body = parseFunctionSourceElements(); + if (first && strict && isRestrictedWord(param[0].name)) { + throwErrorTolerant(first, Messages.StrictParamName); + } + strict = previousStrict; + + return { + type: Syntax.FunctionExpression, + id: null, + params: param, + defaults: [], + body: body, + rest: null, + generator: false, + expression: false + }; + } + + function parseObjectPropertyKey() { + var token = lex(); + + // Note: This function is called only from parseObjectProperty(), where + // EOF and Punctuator tokens are already filtered out. + + if (token.type === Token.StringLiteral || token.type === Token.NumericLiteral) { + if (strict && token.octal) { + throwErrorTolerant(token, Messages.StrictOctalLiteral); + } + return createLiteral(token); + } + + return { + type: Syntax.Identifier, + name: token.value + }; + } + + function parseObjectProperty() { + var token, key, id, param; + + token = lookahead(); + + if (token.type === Token.Identifier) { + + id = parseObjectPropertyKey(); + + // Property Assignment: Getter and Setter. + + if (token.value === 'get' && !match(':')) { + key = parseObjectPropertyKey(); + expect('('); + expect(')'); + return { + type: Syntax.Property, + key: key, + value: parsePropertyFunction([]), + kind: 'get' + }; + } else if (token.value === 'set' && !match(':')) { + key = parseObjectPropertyKey(); + expect('('); + token = lookahead(); + if (token.type !== Token.Identifier) { + expect(')'); + throwErrorTolerant(token, Messages.UnexpectedToken, token.value); + return { + type: Syntax.Property, + key: key, + value: parsePropertyFunction([]), + kind: 'set' + }; + } else { + param = [ parseVariableIdentifier() ]; + expect(')'); + return { + type: Syntax.Property, + key: key, + value: parsePropertyFunction(param, token), + kind: 'set' + }; + } + } else { + expect(':'); + return { + type: Syntax.Property, + key: id, + value: parseAssignmentExpression(), + kind: 'init' + }; + } + } else if (token.type === Token.EOF || token.type === Token.Punctuator) { + throwUnexpected(token); + } else { + key = parseObjectPropertyKey(); + expect(':'); + return { + type: Syntax.Property, + key: key, + value: parseAssignmentExpression(), + kind: 'init' + }; + } + } + + function parseObjectInitialiser() { + var properties = [], property, name, kind, map = {}, toString = String; + + expect('{'); + + while (!match('}')) { + property = parseObjectProperty(); + + if (property.key.type === Syntax.Identifier) { + name = property.key.name; + } else { + name = toString(property.key.value); + } + kind = (property.kind === 'init') ? PropertyKind.Data : (property.kind === 'get') ? PropertyKind.Get : PropertyKind.Set; + if (Object.prototype.hasOwnProperty.call(map, name)) { + if (map[name] === PropertyKind.Data) { + if (strict && kind === PropertyKind.Data) { + throwErrorTolerant({}, Messages.StrictDuplicateProperty); + } else if (kind !== PropertyKind.Data) { + throwErrorTolerant({}, Messages.AccessorDataProperty); + } + } else { + if (kind === PropertyKind.Data) { + throwErrorTolerant({}, Messages.AccessorDataProperty); + } else if (map[name] & kind) { + throwErrorTolerant({}, Messages.AccessorGetSet); + } + } + map[name] |= kind; + } else { + map[name] = kind; + } + + properties.push(property); + + if (!match('}')) { + expect(','); + } + } + + expect('}'); + + return { + type: Syntax.ObjectExpression, + properties: properties + }; + } + + // 11.1.6 The Grouping Operator + + function parseGroupExpression() { + var expr; + + expect('('); + + expr = parseExpression(); + + expect(')'); + + return expr; + } + + + // 11.1 Primary Expressions + + function parsePrimaryExpression() { + var token = lookahead(), + type = token.type; + + if (type === Token.Identifier) { + return { + type: Syntax.Identifier, + name: lex().value + }; + } + + if (type === Token.StringLiteral || type === Token.NumericLiteral) { + if (strict && token.octal) { + throwErrorTolerant(token, Messages.StrictOctalLiteral); + } + return createLiteral(lex()); + } + + if (type === Token.Keyword) { + if (matchKeyword('this')) { + lex(); + return { + type: Syntax.ThisExpression + }; + } + + if (matchKeyword('function')) { + return parseFunctionExpression(); + } + } + + if (type === Token.BooleanLiteral) { + lex(); + token.value = (token.value === 'true'); + return createLiteral(token); + } + + if (type === Token.NullLiteral) { + lex(); + token.value = null; + return createLiteral(token); + } + + if (match('[')) { + return parseArrayInitialiser(); + } + + if (match('{')) { + return parseObjectInitialiser(); + } + + if (match('(')) { + return parseGroupExpression(); + } + + if (match('/') || match('/=')) { + return createLiteral(scanRegExp()); + } + + return throwUnexpected(lex()); + } + + // 11.2 Left-Hand-Side Expressions + + function parseArguments() { + var args = []; + + expect('('); + + if (!match(')')) { + while (index < length) { + args.push(parseAssignmentExpression()); + if (match(')')) { + break; + } + expect(','); + } + } + + expect(')'); + + return args; + } + + function parseNonComputedProperty() { + var token = lex(); + + if (!isIdentifierName(token)) { + throwUnexpected(token); + } + + return { + type: Syntax.Identifier, + name: token.value + }; + } + + function parseNonComputedMember() { + expect('.'); + + return parseNonComputedProperty(); + } + + function parseComputedMember() { + var expr; + + expect('['); + + expr = parseExpression(); + + expect(']'); + + return expr; + } + + function parseNewExpression() { + var expr; + + expectKeyword('new'); + + expr = { + type: Syntax.NewExpression, + callee: parseLeftHandSideExpression(), + 'arguments': [] + }; + + if (match('(')) { + expr['arguments'] = parseArguments(); + } + + return expr; + } + + function parseLeftHandSideExpressionAllowCall() { + var expr; + + expr = matchKeyword('new') ? parseNewExpression() : parsePrimaryExpression(); + + while (match('.') || match('[') || match('(')) { + if (match('(')) { + expr = { + type: Syntax.CallExpression, + callee: expr, + 'arguments': parseArguments() + }; + } else if (match('[')) { + expr = { + type: Syntax.MemberExpression, + computed: true, + object: expr, + property: parseComputedMember() + }; + } else { + expr = { + type: Syntax.MemberExpression, + computed: false, + object: expr, + property: parseNonComputedMember() + }; + } + } + + return expr; + } + + + function parseLeftHandSideExpression() { + var expr; + + expr = matchKeyword('new') ? parseNewExpression() : parsePrimaryExpression(); + + while (match('.') || match('[')) { + if (match('[')) { + expr = { + type: Syntax.MemberExpression, + computed: true, + object: expr, + property: parseComputedMember() + }; + } else { + expr = { + type: Syntax.MemberExpression, + computed: false, + object: expr, + property: parseNonComputedMember() + }; + } + } + + return expr; + } + + // 11.3 Postfix Expressions + + function parsePostfixExpression() { + var expr = parseLeftHandSideExpressionAllowCall(), token; + + token = lookahead(); + if (token.type !== Token.Punctuator) { + return expr; + } + + if ((match('++') || match('--')) && !peekLineTerminator()) { + // 11.3.1, 11.3.2 + if (strict && expr.type === Syntax.Identifier && isRestrictedWord(expr.name)) { + throwErrorTolerant({}, Messages.StrictLHSPostfix); + } + if (!isLeftHandSide(expr)) { + throwErrorTolerant({}, Messages.InvalidLHSInAssignment); + } + + expr = { + type: Syntax.UpdateExpression, + operator: lex().value, + argument: expr, + prefix: false + }; + } + + return expr; + } + + // 11.4 Unary Operators + + function parseUnaryExpression() { + var token, expr; + + token = lookahead(); + if (token.type !== Token.Punctuator && token.type !== Token.Keyword) { + return parsePostfixExpression(); + } + + if (match('++') || match('--')) { + token = lex(); + expr = parseUnaryExpression(); + // 11.4.4, 11.4.5 + if (strict && expr.type === Syntax.Identifier && isRestrictedWord(expr.name)) { + throwErrorTolerant({}, Messages.StrictLHSPrefix); + } + + if (!isLeftHandSide(expr)) { + throwErrorTolerant({}, Messages.InvalidLHSInAssignment); + } + + expr = { + type: Syntax.UpdateExpression, + operator: token.value, + argument: expr, + prefix: true + }; + return expr; + } + + if (match('+') || match('-') || match('~') || match('!')) { + expr = { + type: Syntax.UnaryExpression, + operator: lex().value, + argument: parseUnaryExpression(), + prefix: true + }; + return expr; + } + + if (matchKeyword('delete') || matchKeyword('void') || matchKeyword('typeof')) { + expr = { + type: Syntax.UnaryExpression, + operator: lex().value, + argument: parseUnaryExpression(), + prefix: true + }; + if (strict && expr.operator === 'delete' && expr.argument.type === Syntax.Identifier) { + throwErrorTolerant({}, Messages.StrictDelete); + } + return expr; + } + + return parsePostfixExpression(); + } + + // 11.5 Multiplicative Operators + + function parseMultiplicativeExpression() { + var expr = parseUnaryExpression(); + + while (match('*') || match('/') || match('%')) { + expr = { + type: Syntax.BinaryExpression, + operator: lex().value, + left: expr, + right: parseUnaryExpression() + }; + } + + return expr; + } + + // 11.6 Additive Operators + + function parseAdditiveExpression() { + var expr = parseMultiplicativeExpression(); + + while (match('+') || match('-')) { + expr = { + type: Syntax.BinaryExpression, + operator: lex().value, + left: expr, + right: parseMultiplicativeExpression() + }; + } + + return expr; + } + + // 11.7 Bitwise Shift Operators + + function parseShiftExpression() { + var expr = parseAdditiveExpression(); + + while (match('<<') || match('>>') || match('>>>')) { + expr = { + type: Syntax.BinaryExpression, + operator: lex().value, + left: expr, + right: parseAdditiveExpression() + }; + } + + return expr; + } + // 11.8 Relational Operators + + function parseRelationalExpression() { + var expr, previousAllowIn; + + previousAllowIn = state.allowIn; + state.allowIn = true; + + expr = parseShiftExpression(); + + while (match('<') || match('>') || match('<=') || match('>=') || (previousAllowIn && matchKeyword('in')) || matchKeyword('instanceof')) { + expr = { + type: Syntax.BinaryExpression, + operator: lex().value, + left: expr, + right: parseShiftExpression() + }; + } + + state.allowIn = previousAllowIn; + return expr; + } + + // 11.9 Equality Operators + + function parseEqualityExpression() { + var expr = parseRelationalExpression(); + + while (match('==') || match('!=') || match('===') || match('!==')) { + expr = { + type: Syntax.BinaryExpression, + operator: lex().value, + left: expr, + right: parseRelationalExpression() + }; + } + + return expr; + } + + // 11.10 Binary Bitwise Operators + + function parseBitwiseANDExpression() { + var expr = parseEqualityExpression(); + + while (match('&')) { + lex(); + expr = { + type: Syntax.BinaryExpression, + operator: '&', + left: expr, + right: parseEqualityExpression() + }; + } + + return expr; + } + + function parseBitwiseXORExpression() { + var expr = parseBitwiseANDExpression(); + + while (match('^')) { + lex(); + expr = { + type: Syntax.BinaryExpression, + operator: '^', + left: expr, + right: parseBitwiseANDExpression() + }; + } + + return expr; + } + + function parseBitwiseORExpression() { + var expr = parseBitwiseXORExpression(); + + while (match('|')) { + lex(); + expr = { + type: Syntax.BinaryExpression, + operator: '|', + left: expr, + right: parseBitwiseXORExpression() + }; + } + + return expr; + } + + // 11.11 Binary Logical Operators + + function parseLogicalANDExpression() { + var expr = parseBitwiseORExpression(); + + while (match('&&')) { + lex(); + expr = { + type: Syntax.LogicalExpression, + operator: '&&', + left: expr, + right: parseBitwiseORExpression() + }; + } + + return expr; + } + + function parseLogicalORExpression() { + var expr = parseLogicalANDExpression(); + + while (match('||')) { + lex(); + expr = { + type: Syntax.LogicalExpression, + operator: '||', + left: expr, + right: parseLogicalANDExpression() + }; + } + + return expr; + } + + // 11.12 Conditional Operator + + function parseConditionalExpression() { + var expr, previousAllowIn, consequent; + + expr = parseLogicalORExpression(); + + if (match('?')) { + lex(); + previousAllowIn = state.allowIn; + state.allowIn = true; + consequent = parseAssignmentExpression(); + state.allowIn = previousAllowIn; + expect(':'); + + expr = { + type: Syntax.ConditionalExpression, + test: expr, + consequent: consequent, + alternate: parseAssignmentExpression() + }; + } + + return expr; + } + + // 11.13 Assignment Operators + + function parseAssignmentExpression() { + var token, expr; + + token = lookahead(); + expr = parseConditionalExpression(); + + if (matchAssign()) { + // LeftHandSideExpression + if (!isLeftHandSide(expr)) { + throwErrorTolerant({}, Messages.InvalidLHSInAssignment); + } + + // 11.13.1 + if (strict && expr.type === Syntax.Identifier && isRestrictedWord(expr.name)) { + throwErrorTolerant(token, Messages.StrictLHSAssignment); + } + + expr = { + type: Syntax.AssignmentExpression, + operator: lex().value, + left: expr, + right: parseAssignmentExpression() + }; + } + + return expr; + } + + // 11.14 Comma Operator + + function parseExpression() { + var expr = parseAssignmentExpression(); + + if (match(',')) { + expr = { + type: Syntax.SequenceExpression, + expressions: [ expr ] + }; + + while (index < length) { + if (!match(',')) { + break; + } + lex(); + expr.expressions.push(parseAssignmentExpression()); + } + + } + return expr; + } + + // 12.1 Block + + function parseStatementList() { + var list = [], + statement; + + while (index < length) { + if (match('}')) { + break; + } + statement = parseSourceElement(); + if (typeof statement === 'undefined') { + break; + } + list.push(statement); + } + + return list; + } + + function parseBlock() { + var block; + + expect('{'); + + block = parseStatementList(); + + expect('}'); + + return { + type: Syntax.BlockStatement, + body: block + }; + } + + // 12.2 Variable Statement + + function parseVariableIdentifier() { + var token = lex(); + + if (token.type !== Token.Identifier) { + throwUnexpected(token); + } + + return { + type: Syntax.Identifier, + name: token.value + }; + } + + function parseVariableDeclaration(kind) { + var id = parseVariableIdentifier(), + init = null; + + // 12.2.1 + if (strict && isRestrictedWord(id.name)) { + throwErrorTolerant({}, Messages.StrictVarName); + } + + if (kind === 'const') { + expect('='); + init = parseAssignmentExpression(); + } else if (match('=')) { + lex(); + init = parseAssignmentExpression(); + } + + return { + type: Syntax.VariableDeclarator, + id: id, + init: init + }; + } + + function parseVariableDeclarationList(kind) { + var list = []; + + do { + list.push(parseVariableDeclaration(kind)); + if (!match(',')) { + break; + } + lex(); + } while (index < length); + + return list; + } + + function parseVariableStatement() { + var declarations; + + expectKeyword('var'); + + declarations = parseVariableDeclarationList(); + + consumeSemicolon(); + + return { + type: Syntax.VariableDeclaration, + declarations: declarations, + kind: 'var' + }; + } + + // kind may be `const` or `let` + // Both are experimental and not in the specification yet. + // see http://wiki.ecmascript.org/doku.php?id=harmony:const + // and http://wiki.ecmascript.org/doku.php?id=harmony:let + function parseConstLetDeclaration(kind) { + var declarations; + + expectKeyword(kind); + + declarations = parseVariableDeclarationList(kind); + + consumeSemicolon(); + + return { + type: Syntax.VariableDeclaration, + declarations: declarations, + kind: kind + }; + } + + // 12.3 Empty Statement + + function parseEmptyStatement() { + expect(';'); + + return { + type: Syntax.EmptyStatement + }; + } + + // 12.4 Expression Statement + + function parseExpressionStatement() { + var expr = parseExpression(); + + consumeSemicolon(); + + return { + type: Syntax.ExpressionStatement, + expression: expr + }; + } + + // 12.5 If statement + + function parseIfStatement() { + var test, consequent, alternate; + + expectKeyword('if'); + + expect('('); + + test = parseExpression(); + + expect(')'); + + consequent = parseStatement(); + + if (matchKeyword('else')) { + lex(); + alternate = parseStatement(); + } else { + alternate = null; + } + + return { + type: Syntax.IfStatement, + test: test, + consequent: consequent, + alternate: alternate + }; + } + + // 12.6 Iteration Statements + + function parseDoWhileStatement() { + var body, test, oldInIteration; + + expectKeyword('do'); + + oldInIteration = state.inIteration; + state.inIteration = true; + + body = parseStatement(); + + state.inIteration = oldInIteration; + + expectKeyword('while'); + + expect('('); + + test = parseExpression(); + + expect(')'); + + if (match(';')) { + lex(); + } + + return { + type: Syntax.DoWhileStatement, + body: body, + test: test + }; + } + + function parseWhileStatement() { + var test, body, oldInIteration; + + expectKeyword('while'); + + expect('('); + + test = parseExpression(); + + expect(')'); + + oldInIteration = state.inIteration; + state.inIteration = true; + + body = parseStatement(); + + state.inIteration = oldInIteration; + + return { + type: Syntax.WhileStatement, + test: test, + body: body + }; + } + + function parseForVariableDeclaration() { + var token = lex(); + + return { + type: Syntax.VariableDeclaration, + declarations: parseVariableDeclarationList(), + kind: token.value + }; + } + + function parseForStatement() { + var init, test, update, left, right, body, oldInIteration; + + init = test = update = null; + + expectKeyword('for'); + + expect('('); + + if (match(';')) { + lex(); + } else { + if (matchKeyword('var') || matchKeyword('let')) { + state.allowIn = false; + init = parseForVariableDeclaration(); + state.allowIn = true; + + if (init.declarations.length === 1 && matchKeyword('in')) { + lex(); + left = init; + right = parseExpression(); + init = null; + } + } else { + state.allowIn = false; + init = parseExpression(); + state.allowIn = true; + + if (matchKeyword('in')) { + // LeftHandSideExpression + if (!isLeftHandSide(init)) { + throwErrorTolerant({}, Messages.InvalidLHSInForIn); + } + + lex(); + left = init; + right = parseExpression(); + init = null; + } + } + + if (typeof left === 'undefined') { + expect(';'); + } + } + + if (typeof left === 'undefined') { + + if (!match(';')) { + test = parseExpression(); + } + expect(';'); + + if (!match(')')) { + update = parseExpression(); + } + } + + expect(')'); + + oldInIteration = state.inIteration; + state.inIteration = true; + + body = parseStatement(); + + state.inIteration = oldInIteration; + + if (typeof left === 'undefined') { + return { + type: Syntax.ForStatement, + init: init, + test: test, + update: update, + body: body + }; + } + + return { + type: Syntax.ForInStatement, + left: left, + right: right, + body: body, + each: false + }; + } + + // 12.7 The continue statement + + function parseContinueStatement() { + var token, label = null; + + expectKeyword('continue'); + + // Optimize the most common form: 'continue;'. + if (source[index] === ';') { + lex(); + + if (!state.inIteration) { + throwError({}, Messages.IllegalContinue); + } + + return { + type: Syntax.ContinueStatement, + label: null + }; + } + + if (peekLineTerminator()) { + if (!state.inIteration) { + throwError({}, Messages.IllegalContinue); + } + + return { + type: Syntax.ContinueStatement, + label: null + }; + } + + token = lookahead(); + if (token.type === Token.Identifier) { + label = parseVariableIdentifier(); + + if (!Object.prototype.hasOwnProperty.call(state.labelSet, label.name)) { + throwError({}, Messages.UnknownLabel, label.name); + } + } + + consumeSemicolon(); + + if (label === null && !state.inIteration) { + throwError({}, Messages.IllegalContinue); + } + + return { + type: Syntax.ContinueStatement, + label: label + }; + } + + // 12.8 The break statement + + function parseBreakStatement() { + var token, label = null; + + expectKeyword('break'); + + // Optimize the most common form: 'break;'. + if (source[index] === ';') { + lex(); + + if (!(state.inIteration || state.inSwitch)) { + throwError({}, Messages.IllegalBreak); + } + + return { + type: Syntax.BreakStatement, + label: null + }; + } + + if (peekLineTerminator()) { + if (!(state.inIteration || state.inSwitch)) { + throwError({}, Messages.IllegalBreak); + } + + return { + type: Syntax.BreakStatement, + label: null + }; + } + + token = lookahead(); + if (token.type === Token.Identifier) { + label = parseVariableIdentifier(); + + if (!Object.prototype.hasOwnProperty.call(state.labelSet, label.name)) { + throwError({}, Messages.UnknownLabel, label.name); + } + } + + consumeSemicolon(); + + if (label === null && !(state.inIteration || state.inSwitch)) { + throwError({}, Messages.IllegalBreak); + } + + return { + type: Syntax.BreakStatement, + label: label + }; + } + + // 12.9 The return statement + + function parseReturnStatement() { + var token, argument = null; + + expectKeyword('return'); + + if (!state.inFunctionBody) { + throwErrorTolerant({}, Messages.IllegalReturn); + } + + // 'return' followed by a space and an identifier is very common. + if (source[index] === ' ') { + if (isIdentifierStart(source[index + 1])) { + argument = parseExpression(); + consumeSemicolon(); + return { + type: Syntax.ReturnStatement, + argument: argument + }; + } + } + + if (peekLineTerminator()) { + return { + type: Syntax.ReturnStatement, + argument: null + }; + } + + if (!match(';')) { + token = lookahead(); + if (!match('}') && token.type !== Token.EOF) { + argument = parseExpression(); + } + } + + consumeSemicolon(); + + return { + type: Syntax.ReturnStatement, + argument: argument + }; + } + + // 12.10 The with statement + + function parseWithStatement() { + var object, body; + + if (strict) { + throwErrorTolerant({}, Messages.StrictModeWith); + } + + expectKeyword('with'); + + expect('('); + + object = parseExpression(); + + expect(')'); + + body = parseStatement(); + + return { + type: Syntax.WithStatement, + object: object, + body: body + }; + } + + // 12.10 The swith statement + + function parseSwitchCase() { + var test, + consequent = [], + statement; + + if (matchKeyword('default')) { + lex(); + test = null; + } else { + expectKeyword('case'); + test = parseExpression(); + } + expect(':'); + + while (index < length) { + if (match('}') || matchKeyword('default') || matchKeyword('case')) { + break; + } + statement = parseStatement(); + if (typeof statement === 'undefined') { + break; + } + consequent.push(statement); + } + + return { + type: Syntax.SwitchCase, + test: test, + consequent: consequent + }; + } + + function parseSwitchStatement() { + var discriminant, cases, clause, oldInSwitch, defaultFound; + + expectKeyword('switch'); + + expect('('); + + discriminant = parseExpression(); + + expect(')'); + + expect('{'); + + cases = []; + + if (match('}')) { + lex(); + return { + type: Syntax.SwitchStatement, + discriminant: discriminant, + cases: cases + }; + } + + oldInSwitch = state.inSwitch; + state.inSwitch = true; + defaultFound = false; + + while (index < length) { + if (match('}')) { + break; + } + clause = parseSwitchCase(); + if (clause.test === null) { + if (defaultFound) { + throwError({}, Messages.MultipleDefaultsInSwitch); + } + defaultFound = true; + } + cases.push(clause); + } + + state.inSwitch = oldInSwitch; + + expect('}'); + + return { + type: Syntax.SwitchStatement, + discriminant: discriminant, + cases: cases + }; + } + + // 12.13 The throw statement + + function parseThrowStatement() { + var argument; + + expectKeyword('throw'); + + if (peekLineTerminator()) { + throwError({}, Messages.NewlineAfterThrow); + } + + argument = parseExpression(); + + consumeSemicolon(); + + return { + type: Syntax.ThrowStatement, + argument: argument + }; + } + + // 12.14 The try statement + + function parseCatchClause() { + var param; + + expectKeyword('catch'); + + expect('('); + if (match(')')) { + throwUnexpected(lookahead()); + } + + param = parseVariableIdentifier(); + // 12.14.1 + if (strict && isRestrictedWord(param.name)) { + throwErrorTolerant({}, Messages.StrictCatchVariable); + } + + expect(')'); + + return { + type: Syntax.CatchClause, + param: param, + body: parseBlock() + }; + } + + function parseTryStatement() { + var block, handlers = [], finalizer = null; + + expectKeyword('try'); + + block = parseBlock(); + + if (matchKeyword('catch')) { + handlers.push(parseCatchClause()); + } + + if (matchKeyword('finally')) { + lex(); + finalizer = parseBlock(); + } + + if (handlers.length === 0 && !finalizer) { + throwError({}, Messages.NoCatchOrFinally); + } + + return { + type: Syntax.TryStatement, + block: block, + guardedHandlers: [], + handlers: handlers, + finalizer: finalizer + }; + } + + // 12.15 The debugger statement + + function parseDebuggerStatement() { + expectKeyword('debugger'); + + consumeSemicolon(); + + return { + type: Syntax.DebuggerStatement + }; + } + + // 12 Statements + + function parseStatement() { + var token = lookahead(), + expr, + labeledBody; + + if (token.type === Token.EOF) { + throwUnexpected(token); + } + + if (token.type === Token.Punctuator) { + switch (token.value) { + case ';': + return parseEmptyStatement(); + case '{': + return parseBlock(); + case '(': + return parseExpressionStatement(); + default: + break; + } + } + + if (token.type === Token.Keyword) { + switch (token.value) { + case 'break': + return parseBreakStatement(); + case 'continue': + return parseContinueStatement(); + case 'debugger': + return parseDebuggerStatement(); + case 'do': + return parseDoWhileStatement(); + case 'for': + return parseForStatement(); + case 'function': + return parseFunctionDeclaration(); + case 'if': + return parseIfStatement(); + case 'return': + return parseReturnStatement(); + case 'switch': + return parseSwitchStatement(); + case 'throw': + return parseThrowStatement(); + case 'try': + return parseTryStatement(); + case 'var': + return parseVariableStatement(); + case 'while': + return parseWhileStatement(); + case 'with': + return parseWithStatement(); + default: + break; + } + } + + expr = parseExpression(); + + // 12.12 Labelled Statements + if ((expr.type === Syntax.Identifier) && match(':')) { + lex(); + + if (Object.prototype.hasOwnProperty.call(state.labelSet, expr.name)) { + throwError({}, Messages.Redeclaration, 'Label', expr.name); + } + + state.labelSet[expr.name] = true; + labeledBody = parseStatement(); + delete state.labelSet[expr.name]; + + return { + type: Syntax.LabeledStatement, + label: expr, + body: labeledBody + }; + } + + consumeSemicolon(); + + return { + type: Syntax.ExpressionStatement, + expression: expr + }; + } + + // 13 Function Definition + + function parseFunctionSourceElements() { + var sourceElement, sourceElements = [], token, directive, firstRestricted, + oldLabelSet, oldInIteration, oldInSwitch, oldInFunctionBody; + + expect('{'); + + while (index < length) { + token = lookahead(); + if (token.type !== Token.StringLiteral) { + break; + } + + sourceElement = parseSourceElement(); + sourceElements.push(sourceElement); + if (sourceElement.expression.type !== Syntax.Literal) { + // this is not directive + break; + } + directive = sliceSource(token.range[0] + 1, token.range[1] - 1); + if (directive === 'use strict') { + strict = true; + if (firstRestricted) { + throwErrorTolerant(firstRestricted, Messages.StrictOctalLiteral); + } + } else { + if (!firstRestricted && token.octal) { + firstRestricted = token; + } + } + } + + oldLabelSet = state.labelSet; + oldInIteration = state.inIteration; + oldInSwitch = state.inSwitch; + oldInFunctionBody = state.inFunctionBody; + + state.labelSet = {}; + state.inIteration = false; + state.inSwitch = false; + state.inFunctionBody = true; + + while (index < length) { + if (match('}')) { + break; + } + sourceElement = parseSourceElement(); + if (typeof sourceElement === 'undefined') { + break; + } + sourceElements.push(sourceElement); + } + + expect('}'); + + state.labelSet = oldLabelSet; + state.inIteration = oldInIteration; + state.inSwitch = oldInSwitch; + state.inFunctionBody = oldInFunctionBody; + + return { + type: Syntax.BlockStatement, + body: sourceElements + }; + } + + function parseFunctionDeclaration() { + var id, param, params = [], body, token, stricted, firstRestricted, message, previousStrict, paramSet; + + expectKeyword('function'); + token = lookahead(); + id = parseVariableIdentifier(); + if (strict) { + if (isRestrictedWord(token.value)) { + throwErrorTolerant(token, Messages.StrictFunctionName); + } + } else { + if (isRestrictedWord(token.value)) { + firstRestricted = token; + message = Messages.StrictFunctionName; + } else if (isStrictModeReservedWord(token.value)) { + firstRestricted = token; + message = Messages.StrictReservedWord; + } + } + + expect('('); + + if (!match(')')) { + paramSet = {}; + while (index < length) { + token = lookahead(); + param = parseVariableIdentifier(); + if (strict) { + if (isRestrictedWord(token.value)) { + stricted = token; + message = Messages.StrictParamName; + } + if (Object.prototype.hasOwnProperty.call(paramSet, token.value)) { + stricted = token; + message = Messages.StrictParamDupe; + } + } else if (!firstRestricted) { + if (isRestrictedWord(token.value)) { + firstRestricted = token; + message = Messages.StrictParamName; + } else if (isStrictModeReservedWord(token.value)) { + firstRestricted = token; + message = Messages.StrictReservedWord; + } else if (Object.prototype.hasOwnProperty.call(paramSet, token.value)) { + firstRestricted = token; + message = Messages.StrictParamDupe; + } + } + params.push(param); + paramSet[param.name] = true; + if (match(')')) { + break; + } + expect(','); + } + } + + expect(')'); + + previousStrict = strict; + body = parseFunctionSourceElements(); + if (strict && firstRestricted) { + throwError(firstRestricted, message); + } + if (strict && stricted) { + throwErrorTolerant(stricted, message); + } + strict = previousStrict; + + return { + type: Syntax.FunctionDeclaration, + id: id, + params: params, + defaults: [], + body: body, + rest: null, + generator: false, + expression: false + }; + } + + function parseFunctionExpression() { + var token, id = null, stricted, firstRestricted, message, param, params = [], body, previousStrict, paramSet; + + expectKeyword('function'); + + if (!match('(')) { + token = lookahead(); + id = parseVariableIdentifier(); + if (strict) { + if (isRestrictedWord(token.value)) { + throwErrorTolerant(token, Messages.StrictFunctionName); + } + } else { + if (isRestrictedWord(token.value)) { + firstRestricted = token; + message = Messages.StrictFunctionName; + } else if (isStrictModeReservedWord(token.value)) { + firstRestricted = token; + message = Messages.StrictReservedWord; + } + } + } + + expect('('); + + if (!match(')')) { + paramSet = {}; + while (index < length) { + token = lookahead(); + param = parseVariableIdentifier(); + if (strict) { + if (isRestrictedWord(token.value)) { + stricted = token; + message = Messages.StrictParamName; + } + if (Object.prototype.hasOwnProperty.call(paramSet, token.value)) { + stricted = token; + message = Messages.StrictParamDupe; + } + } else if (!firstRestricted) { + if (isRestrictedWord(token.value)) { + firstRestricted = token; + message = Messages.StrictParamName; + } else if (isStrictModeReservedWord(token.value)) { + firstRestricted = token; + message = Messages.StrictReservedWord; + } else if (Object.prototype.hasOwnProperty.call(paramSet, token.value)) { + firstRestricted = token; + message = Messages.StrictParamDupe; + } + } + params.push(param); + paramSet[param.name] = true; + if (match(')')) { + break; + } + expect(','); + } + } + + expect(')'); + + previousStrict = strict; + body = parseFunctionSourceElements(); + if (strict && firstRestricted) { + throwError(firstRestricted, message); + } + if (strict && stricted) { + throwErrorTolerant(stricted, message); + } + strict = previousStrict; + + return { + type: Syntax.FunctionExpression, + id: id, + params: params, + defaults: [], + body: body, + rest: null, + generator: false, + expression: false + }; + } + + // 14 Program + + function parseSourceElement() { + var token = lookahead(); + + if (token.type === Token.Keyword) { + switch (token.value) { + case 'const': + case 'let': + return parseConstLetDeclaration(token.value); + case 'function': + return parseFunctionDeclaration(); + default: + return parseStatement(); + } + } + + if (token.type !== Token.EOF) { + return parseStatement(); + } + } + + function parseSourceElements() { + var sourceElement, sourceElements = [], token, directive, firstRestricted; + + while (index < length) { + token = lookahead(); + if (token.type !== Token.StringLiteral) { + break; + } + + sourceElement = parseSourceElement(); + sourceElements.push(sourceElement); + if (sourceElement.expression.type !== Syntax.Literal) { + // this is not directive + break; + } + directive = sliceSource(token.range[0] + 1, token.range[1] - 1); + if (directive === 'use strict') { + strict = true; + if (firstRestricted) { + throwErrorTolerant(firstRestricted, Messages.StrictOctalLiteral); + } + } else { + if (!firstRestricted && token.octal) { + firstRestricted = token; + } + } + } + + while (index < length) { + sourceElement = parseSourceElement(); + if (typeof sourceElement === 'undefined') { + break; + } + sourceElements.push(sourceElement); + } + return sourceElements; + } + + function parseProgram() { + var program; + strict = false; + program = { + type: Syntax.Program, + body: parseSourceElements() + }; + return program; + } + + // The following functions are needed only when the option to preserve + // the comments is active. + + function addComment(type, value, start, end, loc) { + assert(typeof start === 'number', 'Comment must have valid position'); + + // Because the way the actual token is scanned, often the comments + // (if any) are skipped twice during the lexical analysis. + // Thus, we need to skip adding a comment if the comment array already + // handled it. + if (extra.comments.length > 0) { + if (extra.comments[extra.comments.length - 1].range[1] > start) { + return; + } + } + + extra.comments.push({ + type: type, + value: value, + range: [start, end], + loc: loc + }); + } + + function scanComment() { + var comment, ch, loc, start, blockComment, lineComment; + + comment = ''; + blockComment = false; + lineComment = false; + + while (index < length) { + ch = source[index]; + + if (lineComment) { + ch = source[index++]; + if (isLineTerminator(ch)) { + loc.end = { + line: lineNumber, + column: index - lineStart - 1 + }; + lineComment = false; + addComment('Line', comment, start, index - 1, loc); + if (ch === '\r' && source[index] === '\n') { + ++index; + } + ++lineNumber; + lineStart = index; + comment = ''; + } else if (index >= length) { + lineComment = false; + comment += ch; + loc.end = { + line: lineNumber, + column: length - lineStart + }; + addComment('Line', comment, start, length, loc); + } else { + comment += ch; + } + } else if (blockComment) { + if (isLineTerminator(ch)) { + if (ch === '\r' && source[index + 1] === '\n') { + ++index; + comment += '\r\n'; + } else { + comment += ch; + } + ++lineNumber; + ++index; + lineStart = index; + if (index >= length) { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + } else { + ch = source[index++]; + if (index >= length) { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + comment += ch; + if (ch === '*') { + ch = source[index]; + if (ch === '/') { + comment = comment.substr(0, comment.length - 1); + blockComment = false; + ++index; + loc.end = { + line: lineNumber, + column: index - lineStart + }; + addComment('Block', comment, start, index, loc); + comment = ''; + } + } + } + } else if (ch === '/') { + ch = source[index + 1]; + if (ch === '/') { + loc = { + start: { + line: lineNumber, + column: index - lineStart + } + }; + start = index; + index += 2; + lineComment = true; + if (index >= length) { + loc.end = { + line: lineNumber, + column: index - lineStart + }; + lineComment = false; + addComment('Line', comment, start, index, loc); + } + } else if (ch === '*') { + start = index; + index += 2; + blockComment = true; + loc = { + start: { + line: lineNumber, + column: index - lineStart - 2 + } + }; + if (index >= length) { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + } else { + break; + } + } else if (isWhiteSpace(ch)) { + ++index; + } else if (isLineTerminator(ch)) { + ++index; + if (ch === '\r' && source[index] === '\n') { + ++index; + } + ++lineNumber; + lineStart = index; + } else { + break; + } + } + } + + function filterCommentLocation() { + var i, entry, comment, comments = []; + + for (i = 0; i < extra.comments.length; ++i) { + entry = extra.comments[i]; + comment = { + type: entry.type, + value: entry.value + }; + if (extra.range) { + comment.range = entry.range; + } + if (extra.loc) { + comment.loc = entry.loc; + } + comments.push(comment); + } + + extra.comments = comments; + } + + function collectToken() { + var start, loc, token, range, value; + + skipComment(); + start = index; + loc = { + start: { + line: lineNumber, + column: index - lineStart + } + }; + + token = extra.advance(); + loc.end = { + line: lineNumber, + column: index - lineStart + }; + + if (token.type !== Token.EOF) { + range = [token.range[0], token.range[1]]; + value = sliceSource(token.range[0], token.range[1]); + extra.tokens.push({ + type: TokenName[token.type], + value: value, + range: range, + loc: loc + }); + } + + return token; + } + + function collectRegex() { + var pos, loc, regex, token; + + skipComment(); + + pos = index; + loc = { + start: { + line: lineNumber, + column: index - lineStart + } + }; + + regex = extra.scanRegExp(); + loc.end = { + line: lineNumber, + column: index - lineStart + }; + + // Pop the previous token, which is likely '/' or '/=' + if (extra.tokens.length > 0) { + token = extra.tokens[extra.tokens.length - 1]; + if (token.range[0] === pos && token.type === 'Punctuator') { + if (token.value === '/' || token.value === '/=') { + extra.tokens.pop(); + } + } + } + + extra.tokens.push({ + type: 'RegularExpression', + value: regex.literal, + range: [pos, index], + loc: loc + }); + + return regex; + } + + function filterTokenLocation() { + var i, entry, token, tokens = []; + + for (i = 0; i < extra.tokens.length; ++i) { + entry = extra.tokens[i]; + token = { + type: entry.type, + value: entry.value + }; + if (extra.range) { + token.range = entry.range; + } + if (extra.loc) { + token.loc = entry.loc; + } + tokens.push(token); + } + + extra.tokens = tokens; + } + + function createLiteral(token) { + return { + type: Syntax.Literal, + value: token.value + }; + } + + function createRawLiteral(token) { + return { + type: Syntax.Literal, + value: token.value, + raw: sliceSource(token.range[0], token.range[1]) + }; + } + + function createLocationMarker() { + var marker = {}; + + marker.range = [index, index]; + marker.loc = { + start: { + line: lineNumber, + column: index - lineStart + }, + end: { + line: lineNumber, + column: index - lineStart + } + }; + + marker.end = function () { + this.range[1] = index; + this.loc.end.line = lineNumber; + this.loc.end.column = index - lineStart; + }; + + marker.applyGroup = function (node) { + if (extra.range) { + node.groupRange = [this.range[0], this.range[1]]; + } + if (extra.loc) { + node.groupLoc = { + start: { + line: this.loc.start.line, + column: this.loc.start.column + }, + end: { + line: this.loc.end.line, + column: this.loc.end.column + } + }; + } + }; + + marker.apply = function (node) { + if (extra.range) { + node.range = [this.range[0], this.range[1]]; + } + if (extra.loc) { + node.loc = { + start: { + line: this.loc.start.line, + column: this.loc.start.column + }, + end: { + line: this.loc.end.line, + column: this.loc.end.column + } + }; + } + }; + + return marker; + } + + function trackGroupExpression() { + var marker, expr; + + skipComment(); + marker = createLocationMarker(); + expect('('); + + expr = parseExpression(); + + expect(')'); + + marker.end(); + marker.applyGroup(expr); + + return expr; + } + + function trackLeftHandSideExpression() { + var marker, expr; + + skipComment(); + marker = createLocationMarker(); + + expr = matchKeyword('new') ? parseNewExpression() : parsePrimaryExpression(); + + while (match('.') || match('[')) { + if (match('[')) { + expr = { + type: Syntax.MemberExpression, + computed: true, + object: expr, + property: parseComputedMember() + }; + marker.end(); + marker.apply(expr); + } else { + expr = { + type: Syntax.MemberExpression, + computed: false, + object: expr, + property: parseNonComputedMember() + }; + marker.end(); + marker.apply(expr); + } + } + + return expr; + } + + function trackLeftHandSideExpressionAllowCall() { + var marker, expr; + + skipComment(); + marker = createLocationMarker(); + + expr = matchKeyword('new') ? parseNewExpression() : parsePrimaryExpression(); + + while (match('.') || match('[') || match('(')) { + if (match('(')) { + expr = { + type: Syntax.CallExpression, + callee: expr, + 'arguments': parseArguments() + }; + marker.end(); + marker.apply(expr); + } else if (match('[')) { + expr = { + type: Syntax.MemberExpression, + computed: true, + object: expr, + property: parseComputedMember() + }; + marker.end(); + marker.apply(expr); + } else { + expr = { + type: Syntax.MemberExpression, + computed: false, + object: expr, + property: parseNonComputedMember() + }; + marker.end(); + marker.apply(expr); + } + } + + return expr; + } + + function filterGroup(node) { + var n, i, entry; + + n = (Object.prototype.toString.apply(node) === '[object Array]') ? [] : {}; + for (i in node) { + if (node.hasOwnProperty(i) && i !== 'groupRange' && i !== 'groupLoc') { + entry = node[i]; + if (entry === null || typeof entry !== 'object' || entry instanceof RegExp) { + n[i] = entry; + } else { + n[i] = filterGroup(entry); + } + } + } + return n; + } + + function wrapTrackingFunction(range, loc) { + + return function (parseFunction) { + + function isBinary(node) { + return node.type === Syntax.LogicalExpression || + node.type === Syntax.BinaryExpression; + } + + function visit(node) { + var start, end; + + if (isBinary(node.left)) { + visit(node.left); + } + if (isBinary(node.right)) { + visit(node.right); + } + + if (range) { + if (node.left.groupRange || node.right.groupRange) { + start = node.left.groupRange ? node.left.groupRange[0] : node.left.range[0]; + end = node.right.groupRange ? node.right.groupRange[1] : node.right.range[1]; + node.range = [start, end]; + } else if (typeof node.range === 'undefined') { + start = node.left.range[0]; + end = node.right.range[1]; + node.range = [start, end]; + } + } + if (loc) { + if (node.left.groupLoc || node.right.groupLoc) { + start = node.left.groupLoc ? node.left.groupLoc.start : node.left.loc.start; + end = node.right.groupLoc ? node.right.groupLoc.end : node.right.loc.end; + node.loc = { + start: start, + end: end + }; + } else if (typeof node.loc === 'undefined') { + node.loc = { + start: node.left.loc.start, + end: node.right.loc.end + }; + } + } + } + + return function () { + var marker, node; + + skipComment(); + + marker = createLocationMarker(); + node = parseFunction.apply(null, arguments); + marker.end(); + + if (range && typeof node.range === 'undefined') { + marker.apply(node); + } + + if (loc && typeof node.loc === 'undefined') { + marker.apply(node); + } + + if (isBinary(node)) { + visit(node); + } + + return node; + }; + }; + } + + function patch() { + + var wrapTracking; + + if (extra.comments) { + extra.skipComment = skipComment; + skipComment = scanComment; + } + + if (extra.raw) { + extra.createLiteral = createLiteral; + createLiteral = createRawLiteral; + } + + if (extra.range || extra.loc) { + + extra.parseGroupExpression = parseGroupExpression; + extra.parseLeftHandSideExpression = parseLeftHandSideExpression; + extra.parseLeftHandSideExpressionAllowCall = parseLeftHandSideExpressionAllowCall; + parseGroupExpression = trackGroupExpression; + parseLeftHandSideExpression = trackLeftHandSideExpression; + parseLeftHandSideExpressionAllowCall = trackLeftHandSideExpressionAllowCall; + + wrapTracking = wrapTrackingFunction(extra.range, extra.loc); + + extra.parseAdditiveExpression = parseAdditiveExpression; + extra.parseAssignmentExpression = parseAssignmentExpression; + extra.parseBitwiseANDExpression = parseBitwiseANDExpression; + extra.parseBitwiseORExpression = parseBitwiseORExpression; + extra.parseBitwiseXORExpression = parseBitwiseXORExpression; + extra.parseBlock = parseBlock; + extra.parseFunctionSourceElements = parseFunctionSourceElements; + extra.parseCatchClause = parseCatchClause; + extra.parseComputedMember = parseComputedMember; + extra.parseConditionalExpression = parseConditionalExpression; + extra.parseConstLetDeclaration = parseConstLetDeclaration; + extra.parseEqualityExpression = parseEqualityExpression; + extra.parseExpression = parseExpression; + extra.parseForVariableDeclaration = parseForVariableDeclaration; + extra.parseFunctionDeclaration = parseFunctionDeclaration; + extra.parseFunctionExpression = parseFunctionExpression; + extra.parseLogicalANDExpression = parseLogicalANDExpression; + extra.parseLogicalORExpression = parseLogicalORExpression; + extra.parseMultiplicativeExpression = parseMultiplicativeExpression; + extra.parseNewExpression = parseNewExpression; + extra.parseNonComputedProperty = parseNonComputedProperty; + extra.parseObjectProperty = parseObjectProperty; + extra.parseObjectPropertyKey = parseObjectPropertyKey; + extra.parsePostfixExpression = parsePostfixExpression; + extra.parsePrimaryExpression = parsePrimaryExpression; + extra.parseProgram = parseProgram; + extra.parsePropertyFunction = parsePropertyFunction; + extra.parseRelationalExpression = parseRelationalExpression; + extra.parseStatement = parseStatement; + extra.parseShiftExpression = parseShiftExpression; + extra.parseSwitchCase = parseSwitchCase; + extra.parseUnaryExpression = parseUnaryExpression; + extra.parseVariableDeclaration = parseVariableDeclaration; + extra.parseVariableIdentifier = parseVariableIdentifier; + + parseAdditiveExpression = wrapTracking(extra.parseAdditiveExpression); + parseAssignmentExpression = wrapTracking(extra.parseAssignmentExpression); + parseBitwiseANDExpression = wrapTracking(extra.parseBitwiseANDExpression); + parseBitwiseORExpression = wrapTracking(extra.parseBitwiseORExpression); + parseBitwiseXORExpression = wrapTracking(extra.parseBitwiseXORExpression); + parseBlock = wrapTracking(extra.parseBlock); + parseFunctionSourceElements = wrapTracking(extra.parseFunctionSourceElements); + parseCatchClause = wrapTracking(extra.parseCatchClause); + parseComputedMember = wrapTracking(extra.parseComputedMember); + parseConditionalExpression = wrapTracking(extra.parseConditionalExpression); + parseConstLetDeclaration = wrapTracking(extra.parseConstLetDeclaration); + parseEqualityExpression = wrapTracking(extra.parseEqualityExpression); + parseExpression = wrapTracking(extra.parseExpression); + parseForVariableDeclaration = wrapTracking(extra.parseForVariableDeclaration); + parseFunctionDeclaration = wrapTracking(extra.parseFunctionDeclaration); + parseFunctionExpression = wrapTracking(extra.parseFunctionExpression); + parseLeftHandSideExpression = wrapTracking(parseLeftHandSideExpression); + parseLogicalANDExpression = wrapTracking(extra.parseLogicalANDExpression); + parseLogicalORExpression = wrapTracking(extra.parseLogicalORExpression); + parseMultiplicativeExpression = wrapTracking(extra.parseMultiplicativeExpression); + parseNewExpression = wrapTracking(extra.parseNewExpression); + parseNonComputedProperty = wrapTracking(extra.parseNonComputedProperty); + parseObjectProperty = wrapTracking(extra.parseObjectProperty); + parseObjectPropertyKey = wrapTracking(extra.parseObjectPropertyKey); + parsePostfixExpression = wrapTracking(extra.parsePostfixExpression); + parsePrimaryExpression = wrapTracking(extra.parsePrimaryExpression); + parseProgram = wrapTracking(extra.parseProgram); + parsePropertyFunction = wrapTracking(extra.parsePropertyFunction); + parseRelationalExpression = wrapTracking(extra.parseRelationalExpression); + parseStatement = wrapTracking(extra.parseStatement); + parseShiftExpression = wrapTracking(extra.parseShiftExpression); + parseSwitchCase = wrapTracking(extra.parseSwitchCase); + parseUnaryExpression = wrapTracking(extra.parseUnaryExpression); + parseVariableDeclaration = wrapTracking(extra.parseVariableDeclaration); + parseVariableIdentifier = wrapTracking(extra.parseVariableIdentifier); + } + + if (typeof extra.tokens !== 'undefined') { + extra.advance = advance; + extra.scanRegExp = scanRegExp; + + advance = collectToken; + scanRegExp = collectRegex; + } + } + + function unpatch() { + if (typeof extra.skipComment === 'function') { + skipComment = extra.skipComment; + } + + if (extra.raw) { + createLiteral = extra.createLiteral; + } + + if (extra.range || extra.loc) { + parseAdditiveExpression = extra.parseAdditiveExpression; + parseAssignmentExpression = extra.parseAssignmentExpression; + parseBitwiseANDExpression = extra.parseBitwiseANDExpression; + parseBitwiseORExpression = extra.parseBitwiseORExpression; + parseBitwiseXORExpression = extra.parseBitwiseXORExpression; + parseBlock = extra.parseBlock; + parseFunctionSourceElements = extra.parseFunctionSourceElements; + parseCatchClause = extra.parseCatchClause; + parseComputedMember = extra.parseComputedMember; + parseConditionalExpression = extra.parseConditionalExpression; + parseConstLetDeclaration = extra.parseConstLetDeclaration; + parseEqualityExpression = extra.parseEqualityExpression; + parseExpression = extra.parseExpression; + parseForVariableDeclaration = extra.parseForVariableDeclaration; + parseFunctionDeclaration = extra.parseFunctionDeclaration; + parseFunctionExpression = extra.parseFunctionExpression; + parseGroupExpression = extra.parseGroupExpression; + parseLeftHandSideExpression = extra.parseLeftHandSideExpression; + parseLeftHandSideExpressionAllowCall = extra.parseLeftHandSideExpressionAllowCall; + parseLogicalANDExpression = extra.parseLogicalANDExpression; + parseLogicalORExpression = extra.parseLogicalORExpression; + parseMultiplicativeExpression = extra.parseMultiplicativeExpression; + parseNewExpression = extra.parseNewExpression; + parseNonComputedProperty = extra.parseNonComputedProperty; + parseObjectProperty = extra.parseObjectProperty; + parseObjectPropertyKey = extra.parseObjectPropertyKey; + parsePrimaryExpression = extra.parsePrimaryExpression; + parsePostfixExpression = extra.parsePostfixExpression; + parseProgram = extra.parseProgram; + parsePropertyFunction = extra.parsePropertyFunction; + parseRelationalExpression = extra.parseRelationalExpression; + parseStatement = extra.parseStatement; + parseShiftExpression = extra.parseShiftExpression; + parseSwitchCase = extra.parseSwitchCase; + parseUnaryExpression = extra.parseUnaryExpression; + parseVariableDeclaration = extra.parseVariableDeclaration; + parseVariableIdentifier = extra.parseVariableIdentifier; + } + + if (typeof extra.scanRegExp === 'function') { + advance = extra.advance; + scanRegExp = extra.scanRegExp; + } + } + + function stringToArray(str) { + var length = str.length, + result = [], + i; + for (i = 0; i < length; ++i) { + result[i] = str.charAt(i); + } + return result; + } + + function parse(code, options) { + var program, toString; + + toString = String; + if (typeof code !== 'string' && !(code instanceof String)) { + code = toString(code); + } + + source = code; + index = 0; + lineNumber = (source.length > 0) ? 1 : 0; + lineStart = 0; + length = source.length; + buffer = null; + state = { + allowIn: true, + labelSet: {}, + inFunctionBody: false, + inIteration: false, + inSwitch: false + }; + + extra = {}; + if (typeof options !== 'undefined') { + extra.range = (typeof options.range === 'boolean') && options.range; + extra.loc = (typeof options.loc === 'boolean') && options.loc; + extra.raw = (typeof options.raw === 'boolean') && options.raw; + if (typeof options.tokens === 'boolean' && options.tokens) { + extra.tokens = []; + } + if (typeof options.comment === 'boolean' && options.comment) { + extra.comments = []; + } + if (typeof options.tolerant === 'boolean' && options.tolerant) { + extra.errors = []; + } + } + + if (length > 0) { + if (typeof source[0] === 'undefined') { + // Try first to convert to a string. This is good as fast path + // for old IE which understands string indexing for string + // literals only and not for string object. + if (code instanceof String) { + source = code.valueOf(); + } + + // Force accessing the characters via an array. + if (typeof source[0] === 'undefined') { + source = stringToArray(code); + } + } + } + + patch(); + try { + program = parseProgram(); + if (typeof extra.comments !== 'undefined') { + filterCommentLocation(); + program.comments = extra.comments; + } + if (typeof extra.tokens !== 'undefined') { + filterTokenLocation(); + program.tokens = extra.tokens; + } + if (typeof extra.errors !== 'undefined') { + program.errors = extra.errors; + } + if (extra.range || extra.loc) { + program.body = filterGroup(program.body); + } + } catch (e) { + throw e; + } finally { + unpatch(); + extra = {}; + } + + return program; + } + + // Sync with package.json. + exports.version = '1.0.4'; + + exports.parse = parse; + + // Deep copy. + exports.Syntax = (function () { + var name, types = {}; + + if (typeof Object.create === 'function') { + types = Object.create(null); + } + + for (name in Syntax) { + if (Syntax.hasOwnProperty(name)) { + types[name] = Syntax[name]; + } + } + + if (typeof Object.freeze === 'function') { + Object.freeze(types); + } + + return types; + }()); + +})); +/* vim: set sw=4 ts=4 et tw=80 : */ + +})(null); +/*! + * falafel (c) James Halliday / MIT License + * https://github.com/substack/node-falafel + */ + +(function(require,module){ +var parse = require('esprima').parse; +var objectKeys = Object.keys || function (obj) { + var keys = []; + for (var key in obj) keys.push(key); + return keys; +}; +var forEach = function (xs, fn) { + if (xs.forEach) return xs.forEach(fn); + for (var i = 0; i < xs.length; i++) { + fn.call(xs, xs[i], i, xs); + } +}; + +var isArray = Array.isArray || function (xs) { + return Object.prototype.toString.call(xs) === '[object Array]'; +}; + +module.exports = function (src, opts, fn) { + if (typeof opts === 'function') { + fn = opts; + opts = {}; + } + if (typeof src === 'object') { + opts = src; + src = opts.source; + delete opts.source; + } + src = src === undefined ? opts.source : src; + opts.range = true; + if (typeof src !== 'string') src = String(src); + + var ast = parse(src, opts); + + var result = { + chunks : src.split(''), + toString : function () { return result.chunks.join('') }, + inspect : function () { return result.toString() } + }; + var index = 0; + + (function walk (node, parent) { + insertHelpers(node, parent, result.chunks); + + forEach(objectKeys(node), function (key) { + if (key === 'parent') return; + + var child = node[key]; + if (isArray(child)) { + forEach(child, function (c) { + if (c && typeof c.type === 'string') { + walk(c, node); + } + }); + } + else if (child && typeof child.type === 'string') { + insertHelpers(child, node, result.chunks); + walk(child, node); + } + }); + fn(node); + })(ast, undefined); + + return result; +}; + +function insertHelpers (node, parent, chunks) { + if (!node.range) return; + + node.parent = parent; + + node.source = function () { + return chunks.slice( + node.range[0], node.range[1] + ).join(''); + }; + + if (node.update && typeof node.update === 'object') { + var prev = node.update; + forEach(objectKeys(prev), function (key) { + update[key] = prev[key]; + }); + node.update = update; + } + else { + node.update = update; + } + + function update (s) { + chunks[node.range[0]] = s; + for (var i = node.range[0] + 1; i < node.range[1]; i++) { + chunks[i] = ''; + } + }; +} + +window.falafel = module.exports;})(function(){return {parse: esprima.parse};},{exports: {}}); +var inBrowser = typeof window !== 'undefined' && this === window; +var parseAndModify = (inBrowser ? window.falafel : require("falafel")); + +(inBrowser ? window : exports).blanket = (function(){ + var linesToAddTracking = [ + "ExpressionStatement", + "BreakStatement" , + "ContinueStatement" , + "VariableDeclaration", + "ReturnStatement" , + "ThrowStatement" , + "TryStatement" , + "FunctionDeclaration" , + "IfStatement" , + "WhileStatement" , + "DoWhileStatement" , + "ForStatement" , + "ForInStatement" , + "SwitchStatement" , + "WithStatement" + ], + linesToAddBrackets = [ + "IfStatement" , + "WhileStatement" , + "DoWhileStatement" , + "ForStatement" , + "ForInStatement" , + "WithStatement" + ], + __blanket, + copynumber = Math.floor(Math.random()*1000), + coverageInfo = {},options = { + reporter: null, + adapter:null, + filter: null, + customVariable: null, + loader: null, + ignoreScriptError: false, + existingRequireJS:false, + autoStart: false, + timeout: 180, + ignoreCors: false, + branchTracking: false, + sourceURL: false, + debug:false, + engineOnly:false, + testReadyCallback:null, + commonJS:false, + instrumentCache:false, + modulePattern: null + }; + + if (inBrowser && typeof window.blanket !== 'undefined'){ + __blanket = window.blanket.noConflict(); + } + + _blanket = { + noConflict: function(){ + if (__blanket){ + return __blanket; + } + return _blanket; + }, + _getCopyNumber: function(){ + //internal method + //for differentiating between instances + return copynumber; + }, + extend: function(obj) { + //borrowed from underscore + _blanket._extend(_blanket,obj); + }, + _extend: function(dest,source){ + if (source) { + for (var prop in source) { + if ( dest[prop] instanceof Object && typeof dest[prop] !== "function"){ + _blanket._extend(dest[prop],source[prop]); + }else{ + dest[prop] = source[prop]; + } + } + } + }, + getCovVar: function(){ + var opt = _blanket.options("customVariable"); + if (opt){ + if (_blanket.options("debug")) {console.log("BLANKET-Using custom tracking variable:",opt);} + return inBrowser ? "window."+opt : opt; + } + return inBrowser ? "window._$blanket" : "_$jscoverage"; + }, + options: function(key,value){ + if (typeof key !== "string"){ + _blanket._extend(options,key); + }else if (typeof value === 'undefined'){ + return options[key]; + }else{ + options[key]=value; + } + }, + instrument: function(config, next){ + //check instrumented hash table, + //return instrumented code if available. + var inFile = config.inputFile, + inFileName = config.inputFileName; + //check instrument cache + if (_blanket.options("instrumentCache") && sessionStorage && sessionStorage.getItem("blanket_instrument_store-"+inFileName)){ + if (_blanket.options("debug")) {console.log("BLANKET-Reading instrumentation from cache: ",inFileName);} + next(sessionStorage.getItem("blanket_instrument_store-"+inFileName)); + }else{ + var sourceArray = _blanket._prepareSource(inFile); + _blanket._trackingArraySetup=[]; + //remove shebang + inFile = inFile.replace(/^\#\!.*/, ""); + var instrumented = parseAndModify(inFile,{loc:true,comment:true}, _blanket._addTracking(inFileName)); + instrumented = _blanket._trackingSetup(inFileName,sourceArray)+instrumented; + if (_blanket.options("sourceURL")){ + instrumented += "\n//@ sourceURL="+inFileName.replace("http://",""); + } + if (_blanket.options("debug")) {console.log("BLANKET-Instrumented file: ",inFileName);} + if (_blanket.options("instrumentCache") && sessionStorage){ + if (_blanket.options("debug")) {console.log("BLANKET-Saving instrumentation to cache: ",inFileName);} + sessionStorage.setItem("blanket_instrument_store-"+inFileName,instrumented); + } + next(instrumented); + } + }, + _trackingArraySetup: [], + _branchingArraySetup: [], + _prepareSource: function(source){ + return source.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/(\r\n|\n|\r)/gm,"\n").split('\n'); + }, + _trackingSetup: function(filename,sourceArray){ + var branches = _blanket.options("branchTracking"); + var sourceString = sourceArray.join("',\n'"); + var intro = ""; + var covVar = _blanket.getCovVar(); + + intro += "if (typeof "+covVar+" === 'undefined') "+covVar+" = {};\n"; + if (branches){ + intro += "var _$branchFcn=function(f,l,c,r){ "; + intro += "if (!!r) { "; + intro += covVar+"[f].branchData[l][c][0] = "+covVar+"[f].branchData[l][c][0] || [];"; + intro += covVar+"[f].branchData[l][c][0].push(r); }"; + intro += "else { "; + intro += covVar+"[f].branchData[l][c][1] = "+covVar+"[f].branchData[l][c][1] || [];"; + intro += covVar+"[f].branchData[l][c][1].push(r); }"; + intro += "return r;};\n"; + } + intro += "if (typeof "+covVar+"['"+filename+"'] === 'undefined'){"; + + intro += covVar+"['"+filename+"']=[];\n"; + if (branches){ + intro += covVar+"['"+filename+"'].branchData=[];\n"; + } + intro += covVar+"['"+filename+"'].source=['"+sourceString+"'];\n"; + //initialize array values + _blanket._trackingArraySetup.sort(function(a,b){ + return parseInt(a,10) > parseInt(b,10); + }).forEach(function(item){ + intro += covVar+"['"+filename+"']["+item+"]=0;\n"; + }); + if (branches){ + _blanket._branchingArraySetup.sort(function(a,b){ + return a.line > b.line; + }).sort(function(a,b){ + return a.column > b.column; + }).forEach(function(item){ + if (item.file === filename){ + intro += "if (typeof "+ covVar+"['"+filename+"'].branchData["+item.line+"] === 'undefined'){\n"; + intro += covVar+"['"+filename+"'].branchData["+item.line+"]=[];\n"; + intro += "}"; + intro += covVar+"['"+filename+"'].branchData["+item.line+"]["+item.column+"] = [];\n"; + intro += covVar+"['"+filename+"'].branchData["+item.line+"]["+item.column+"].consequent = "+JSON.stringify(item.consequent)+";\n"; + intro += covVar+"['"+filename+"'].branchData["+item.line+"]["+item.column+"].alternate = "+JSON.stringify(item.alternate)+";\n"; + } + }); + } + intro += "}"; + + return intro; + }, + _blockifyIf: function(node){ + if (linesToAddBrackets.indexOf(node.type) > -1){ + var bracketsExistObject = node.consequent || node.body; + var bracketsExistAlt = node.alternate; + if( bracketsExistAlt && bracketsExistAlt.type !== "BlockStatement") { + bracketsExistAlt.update("{\n"+bracketsExistAlt.source()+"}\n"); + } + if( bracketsExistObject && bracketsExistObject.type !== "BlockStatement") { + bracketsExistObject.update("{\n"+bracketsExistObject.source()+"}\n"); + } + } + }, + _trackBranch: function(node,filename){ + //recursive on consequent and alternative + var line = node.loc.start.line; + var col = node.loc.start.column; + + _blanket._branchingArraySetup.push({ + line: line, + column: col, + file:filename, + consequent: node.consequent.loc, + alternate: node.alternate.loc + }); + + var updated = "_$branchFcn"+ + "('"+filename+"',"+line+","+col+","+node.test.source()+ + ")?"+node.consequent.source()+":"+node.alternate.source(); + node.update(updated); + }, + _addTracking: function (filename) { + //falafel doesn't take a file name + //so we include the filename in a closure + //and return the function to falafel + var covVar = _blanket.getCovVar(); + + return function(node){ + _blanket._blockifyIf(node); + + if (linesToAddTracking.indexOf(node.type) > -1 && node.parent.type !== "LabeledStatement") { + _blanket._checkDefs(node,filename); + if (node.type === "VariableDeclaration" && + (node.parent.type === "ForStatement" || node.parent.type === "ForInStatement")){ + return; + } + if (node.loc && node.loc.start){ + node.update(covVar+"['"+filename+"']["+node.loc.start.line+"]++;\n"+node.source()); + _blanket._trackingArraySetup.push(node.loc.start.line); + }else{ + //I don't think we can handle a node with no location + throw new Error("The instrumenter encountered a node with no location: "+Object.keys(node)); + } + }else if (_blanket.options("branchTracking") && node.type === "ConditionalExpression"){ + _blanket._trackBranch(node,filename); + } + }; + }, + _checkDefs: function(node,filename){ + // Make sure developers don't redefine window. if they do, inform them it is wrong. + if (inBrowser){ + if (node.type === "VariableDeclaration" && node.declarations) { + node.declarations.forEach(function(declaration) { + if (declaration.id.name === "window") { + throw new Error("Instrumentation error, you cannot redefine the 'window' variable in " + filename + ":" + node.loc.start.line); + } + }); + } + if (node.type === "FunctionDeclaration" && node.params) { + node.params.forEach(function(param) { + if (param.name === "window") { + throw new Error("Instrumentation error, you cannot redefine the 'window' variable in " + filename + ":" + node.loc.start.line); + } + }); + } + //Make sure developers don't redefine the coverage variable + if (node.type === "ExpressionStatement" && + node.expression && node.expression.left && + node.expression.left.object && node.expression.left.property && + node.expression.left.object.name + + "." + node.expression.left.property.name === _blanket.getCovVar()) { + throw new Error("Instrumentation error, you cannot redefine the coverage variable in " + filename + ":" + node.loc.start.line); + } + }else{ + //Make sure developers don't redefine the coverage variable in node + if (node.type === "ExpressionStatement" && + node.expression && node.expression.left && + !node.expression.left.object && !node.expression.left.property && + node.expression.left.name === _blanket.getCovVar()) { + throw new Error("Instrumentation error, you cannot redefine the coverage variable in " + filename + ":" + node.loc.start.line); + } + } + }, + setupCoverage: function(){ + coverageInfo.instrumentation = "blanket"; + coverageInfo.stats = { + "suites": 0, + "tests": 0, + "passes": 0, + "pending": 0, + "failures": 0, + "start": new Date() + }; + }, + _checkIfSetup: function(){ + if (!coverageInfo.stats){ + throw new Error("You must call blanket.setupCoverage() first."); + } + }, + onTestStart: function(){ + if (_blanket.options("debug")) {console.log("BLANKET-Test event started");} + this._checkIfSetup(); + coverageInfo.stats.tests++; + coverageInfo.stats.pending++; + }, + onTestDone: function(total,passed){ + this._checkIfSetup(); + if(passed === total){ + coverageInfo.stats.passes++; + }else{ + coverageInfo.stats.failures++; + } + coverageInfo.stats.pending--; + }, + onModuleStart: function(){ + this._checkIfSetup(); + coverageInfo.stats.suites++; + }, + onTestsDone: function(){ + if (_blanket.options("debug")) {console.log("BLANKET-Test event done");} + this._checkIfSetup(); + coverageInfo.stats.end = new Date(); + + if (inBrowser){ + this.report(coverageInfo); + }else{ + if (!_blanket.options("branchTracking")){ + delete (inBrowser ? window : global)[_blanket.getCovVar()].branchFcn; + } + this.options("reporter").call(this,coverageInfo); + } + } + }; + return _blanket; +})(); + +(function(_blanket){ + var oldOptions = _blanket.options; +_blanket.extend({ + outstandingRequireFiles:[], + options: function(key,value){ + var newVal={}; + + if (typeof key !== "string"){ + //key is key/value map + oldOptions(key); + newVal = key; + }else if (typeof value === 'undefined'){ + //accessor + return oldOptions(key); + }else{ + //setter + oldOptions(key,value); + newVal[key] = value; + } + + if (newVal.adapter){ + _blanket._loadFile(newVal.adapter); + } + if (newVal.loader){ + _blanket._loadFile(newVal.loader); + } + }, + requiringFile: function(filename,done){ + if (typeof filename === "undefined"){ + _blanket.outstandingRequireFiles=[]; + }else if (typeof done === "undefined"){ + _blanket.outstandingRequireFiles.push(filename); + }else{ + _blanket.outstandingRequireFiles.splice(_blanket.outstandingRequireFiles.indexOf(filename),1); + } + }, + requireFilesLoaded: function(){ + return _blanket.outstandingRequireFiles.length === 0; + }, + showManualLoader: function(){ + if (document.getElementById("blanketLoaderDialog")){ + return; + } + //copied from http://blog.avtex.com/2012/01/26/cross-browser-css-only-modal-box/ + var loader = "
"; + loader += " 
"; + loader += "
"; + loader += "
"; + loader += "Error: Blanket.js encountered a cross origin request error while instrumenting the source files. "; + loader += "

This is likely caused by the source files being referenced locally (using the file:// protocol). "; + loader += "

Some solutions include starting Chrome with special flags, running a server locally, or using a browser without these CORS restrictions (Safari)."; + loader += "
"; + if (typeof FileReader !== "undefined"){ + loader += "
Or, try the experimental loader. When prompted, simply click on the directory containing all the source files you want covered."; + loader += "Start Loader"; + loader += ""; + } + loader += "
Close"; + loader += "
"; + loader += "
"; + + var css = ".blanketDialogWrapper {"; + css += "display:block;"; + css += "position:fixed;"; + css += "z-index:40001; }"; + + css += ".blanketDialogOverlay {"; + css += "position:fixed;"; + css += "width:100%;"; + css += "height:100%;"; + css += "background-color:black;"; + css += "opacity:.5; "; + css += "-ms-filter:'progid:DXImageTransform.Microsoft.Alpha(Opacity=50)'; "; + css += "filter:alpha(opacity=50); "; + css += "z-index:40001; }"; + + css += ".blanketDialogVerticalOffset { "; + css += "position:fixed;"; + css += "top:30%;"; + css += "width:100%;"; + css += "z-index:40002; }"; + + css += ".blanketDialogBox { "; + css += "width:405px; "; + css += "position:relative;"; + css += "margin:0 auto;"; + css += "background-color:white;"; + css += "padding:10px;"; + css += "border:1px solid black; }"; + + var dom = document.createElement("style"); + dom.innerHTML = css; + document.head.appendChild(dom); + + var div = document.createElement("div"); + div.id = "blanketLoaderDialog"; + div.className = "blanketDialogWrapper"; + div.innerHTML = loader; + document.body.insertBefore(div,document.body.firstChild); + + }, + manualFileLoader: function(files){ + var toArray =Array.prototype.slice; + files = toArray.call(files).filter(function(item){ + return item.type !== ""; + }); + var sessionLength = files.length-1; + var sessionIndx=0; + var sessionArray = {}; + if (sessionStorage["blanketSessionLoader"]){ + sessionArray = JSON.parse(sessionStorage["blanketSessionLoader"]); + } + + + var fileLoader = function(event){ + var fileContent = event.currentTarget.result; + var file = files[sessionIndx]; + var filename = file.webkitRelativePath && file.webkitRelativePath !== '' ? file.webkitRelativePath : file.name; + sessionArray[filename] = fileContent; + sessionIndx++; + if (sessionIndx === sessionLength){ + sessionStorage.setItem("blanketSessionLoader", JSON.stringify(sessionArray)); + document.location.reload(); + }else{ + readFile(files[sessionIndx]); + } + }; + function readFile(file){ + var reader = new FileReader(); + reader.onload = fileLoader; + reader.readAsText(file); + } + readFile(files[sessionIndx]); + }, + _loadFile: function(path){ + if (typeof path !== "undefined"){ + var request = new XMLHttpRequest(); + request.open('GET', path, false); + request.send(); + _blanket._addScript(request.responseText); + } + }, + _addScript: function(data){ + var script = document.createElement("script"); + script.type = "text/javascript"; + script.text = data; + (document.body || document.getElementsByTagName('head')[0]).appendChild(script); + }, + hasAdapter: function(callback){ + return _blanket.options("adapter") !== null; + }, + report: function(coverage_data){ + if (!document.getElementById("blanketLoaderDialog")){ + //all found, clear it + _blanket.blanketSession = null; + } + coverage_data.files = window._$blanket; + var require = blanket.options("commonJS") ? blanket._commonjs.require : window.require; + + // Check if we have any covered files that requires reporting + // otherwise just exit gracefully. + if (!coverage_data.files || !Object.keys(coverage_data.files).length) { + if (_blanket.options("debug")) {console.log("BLANKET-Reporting No files were instrumented.");} + return; + } + + if (typeof coverage_data.files.branchFcn !== "undefined"){ + delete coverage_data.files.branchFcn; + } + if (typeof _blanket.options("reporter") === "string"){ + _blanket._loadFile(_blanket.options("reporter")); + _blanket.customReporter(coverage_data,_blanket.options("reporter_options")); + }else if (typeof _blanket.options("reporter") === "function"){ + _blanket.options("reporter")(coverage_data,_blanket.options("reporter_options")); + }else if (typeof _blanket.defaultReporter === 'function'){ + _blanket.defaultReporter(coverage_data,_blanket.options("reporter_options")); + }else{ + throw new Error("no reporter defined."); + } + }, + _bindStartTestRunner: function(bindEvent,startEvent){ + if (bindEvent){ + bindEvent(startEvent); + }else{ + window.addEventListener("load",startEvent,false); + } + }, + _loadSourceFiles: function(callback){ + var require = blanket.options("commonJS") ? blanket._commonjs.require : window.require; + function copy(o){ + var _copy = Object.create( Object.getPrototypeOf(o) ); + var propNames = Object.getOwnPropertyNames(o); + + propNames.forEach(function(name){ + var desc = Object.getOwnPropertyDescriptor(o, name); + Object.defineProperty(_copy, name, desc); + }); + + return _copy; + } + if (_blanket.options("debug")) {console.log("BLANKET-Collecting page scripts");} + var scripts = _blanket.utils.collectPageScripts(); + //_blanket.options("filter",scripts); + if (scripts.length === 0){ + callback(); + }else{ + + //check session state + if (sessionStorage["blanketSessionLoader"]){ + _blanket.blanketSession = JSON.parse(sessionStorage["blanketSessionLoader"]); + } + + scripts.forEach(function(file,indx){ + _blanket.utils.cache[file]={ + loaded:false + }; + }); + + var currScript=-1; + _blanket.utils.loadAll(function(test){ + if (test){ + return typeof scripts[currScript+1] !== 'undefined'; + } + currScript++; + if (currScript >= scripts.length){ + return null; + } + return scripts[currScript]; + },callback); + } + }, + beforeStartTestRunner: function(opts){ + opts = opts || {}; + opts.checkRequirejs = typeof opts.checkRequirejs === "undefined" ? true : opts.checkRequirejs; + opts.callback = opts.callback || function() { }; + opts.coverage = typeof opts.coverage === "undefined" ? true : opts.coverage; + if (opts.coverage) { + _blanket._bindStartTestRunner(opts.bindEvent, + function(){ + _blanket._loadSourceFiles(function() { + + var allLoaded = function(){ + return opts.condition ? opts.condition() : _blanket.requireFilesLoaded(); + }; + var check = function() { + if (allLoaded()) { + if (_blanket.options("debug")) {console.log("BLANKET-All files loaded, init start test runner callback.");} + var cb = _blanket.options("testReadyCallback"); + + if (cb){ + if (typeof cb === "function"){ + cb(opts.callback); + }else if (typeof cb === "string"){ + _blanket._addScript(cb); + opts.callback(); + } + }else{ + opts.callback(); + } + } else { + setTimeout(check, 13); + } + }; + check(); + }); + }); + }else{ + opts.callback(); + } + }, + utils: { + qualifyURL: function (url) { + //http://stackoverflow.com/questions/470832/getting-an-absolute-url-from-a-relative-one-ie6-issue + var a = document.createElement('a'); + a.href = url; + return a.href; + } + } +}); + +})(blanket); + +blanket.defaultReporter = function(coverage){ + var cssSytle = "#blanket-main {margin:2px;background:#EEE;color:#333;clear:both;font-family:'Helvetica Neue Light', 'HelveticaNeue-Light', 'Helvetica Neue', Calibri, Helvetica, Arial, sans-serif; font-size:17px;} #blanket-main a {color:#333;text-decoration:none;} #blanket-main a:hover {text-decoration:underline;} .blanket {margin:0;padding:5px;clear:both;border-bottom: 1px solid #FFFFFF;} .bl-error {color:red;}.bl-success {color:#5E7D00;} .bl-file{width:auto;} .bl-cl{float:left;} .blanket div.rs {margin-left:50px; width:150px; float:right} .bl-nb {padding-right:10px;} #blanket-main a.bl-logo {color: #EB1764;cursor: pointer;font-weight: bold;text-decoration: none} .bl-source{ overflow-x:scroll; background-color: #FFFFFF; border: 1px solid #CBCBCB; color: #363636; margin: 25px 20px; width: 80%;} .bl-source div{white-space: pre;font-family: monospace;} .bl-source > div > span:first-child{background-color: #EAEAEA;color: #949494;display: inline-block;padding: 0 10px;text-align: center;width: 30px;} .bl-source .miss{background-color:#e6c3c7} .bl-source span.branchWarning{color:#000;background-color:yellow;} .bl-source span.branchOkay{color:#000;background-color:transparent;}", + successRate = 60, + head = document.head, + fileNumber = 0, + body = document.body, + headerContent, + hasBranchTracking = Object.keys(coverage.files).some(function(elem){ + return typeof coverage.files[elem].branchData !== 'undefined'; + }), + bodyContent = "
results
Coverage (%)
Covered/Total Smts.
"+(hasBranchTracking ? "
Covered/Total Branches
":"")+"
", + fileTemplate = "
{{fileNumber}}.{{file}}
{{percentage}} %
{{numberCovered}}/{{totalSmts}}
"+( hasBranchTracking ? "
{{passedBranches}}/{{totalBranches}}
" : "" )+"
"; + grandTotalTemplate = "
{{rowTitle}}
{{percentage}} %
{{numberCovered}}/{{totalSmts}}
"+( hasBranchTracking ? "
{{passedBranches}}/{{totalBranches}}
" : "" ) + "
"; + + function blanket_toggleSource(id) { + var element = document.getElementById(id); + if(element.style.display === 'block') { + element.style.display = 'none'; + } else { + element.style.display = 'block'; + } + } + + + var script = document.createElement("script"); + script.type = "text/javascript"; + script.text = blanket_toggleSource.toString().replace('function ' + blanket_toggleSource.name, 'function blanket_toggleSource'); + body.appendChild(script); + + var percentage = function(number, total) { + return (Math.round(((number/total) * 100)*100)/100); + }; + + var appendTag = function (type, el, str) { + var dom = document.createElement(type); + dom.innerHTML = str; + el.appendChild(dom); + }; + + function escapeInvalidXmlChars(str) { + return str.replace(/\&/g, "&") + .replace(//g, ">") + .replace(/\"/g, """) + .replace(/\'/g, "'"); + } + + function isBranchFollowed(data,bool){ + var mode = bool ? 0 : 1; + if (typeof data === 'undefined' || + typeof data === null || + typeof data[mode] === 'undefined'){ + return false; + } + return data[mode].length > 0; + } + + var branchStack = []; + + function branchReport(colsIndex,src,cols,offset,lineNum){ + var newsrc=""; + var postfix=""; + if (branchStack.length > 0){ + newsrc += ""; + if (branchStack[0][0].end.line === lineNum){ + newsrc += escapeInvalidXmlChars(src.slice(0,branchStack[0][0].end.column)) + ""; + src = src.slice(branchStack[0][0].end.column); + branchStack.shift(); + if (branchStack.length > 0){ + newsrc += ""; + if (branchStack[0][0].end.line === lineNum){ + newsrc += escapeInvalidXmlChars(src.slice(0,branchStack[0][0].end.column)) + ""; + src = src.slice(branchStack[0][0].end.column); + branchStack.shift(); + if (!cols){ + return {src: newsrc + escapeInvalidXmlChars(src) ,cols:cols}; + } + } + else if (!cols){ + return {src: newsrc + escapeInvalidXmlChars(src) + "",cols:cols}; + } + else{ + postfix = ""; + } + }else if (!cols){ + return {src: newsrc + escapeInvalidXmlChars(src) ,cols:cols}; + } + }else if(!cols){ + return {src: newsrc + escapeInvalidXmlChars(src) + "",cols:cols}; + }else{ + postfix = ""; + } + } + var thisline = cols[colsIndex]; + //consequent + + var cons = thisline.consequent; + if (cons.start.line > lineNum){ + branchStack.unshift([thisline.alternate,thisline]); + branchStack.unshift([cons,thisline]); + src = escapeInvalidXmlChars(src); + }else{ + var style = ""; + newsrc += escapeInvalidXmlChars(src.slice(0,cons.start.column-offset)) + style; + + if (cols.length > colsIndex+1 && + cols[colsIndex+1].consequent.start.line === lineNum && + cols[colsIndex+1].consequent.start.column-offset < cols[colsIndex].consequent.end.column-offset) + { + var res = branchReport(colsIndex+1,src.slice(cons.start.column-offset,cons.end.column-offset),cols,cons.start.column-offset,lineNum); + newsrc += res.src; + cols = res.cols; + cols[colsIndex+1] = cols[colsIndex+2]; + cols.length--; + }else{ + newsrc += escapeInvalidXmlChars(src.slice(cons.start.column-offset,cons.end.column-offset)); + } + newsrc += ""; + + var alt = thisline.alternate; + if (alt.start.line > lineNum){ + newsrc += escapeInvalidXmlChars(src.slice(cons.end.column-offset)); + branchStack.unshift([alt,thisline]); + }else{ + newsrc += escapeInvalidXmlChars(src.slice(cons.end.column-offset,alt.start.column-offset)); + style = ""; + newsrc += style; + if (cols.length > colsIndex+1 && + cols[colsIndex+1].consequent.start.line === lineNum && + cols[colsIndex+1].consequent.start.column-offset < cols[colsIndex].alternate.end.column-offset) + { + var res2 = branchReport(colsIndex+1,src.slice(alt.start.column-offset,alt.end.column-offset),cols,alt.start.column-offset,lineNum); + newsrc += res2.src; + cols = res2.cols; + cols[colsIndex+1] = cols[colsIndex+2]; + cols.length--; + }else{ + newsrc += escapeInvalidXmlChars(src.slice(alt.start.column-offset,alt.end.column-offset)); + } + newsrc += ""; + newsrc += escapeInvalidXmlChars(src.slice(alt.end.column-offset)); + src = newsrc; + } + } + return {src:src+postfix, cols:cols}; + } + + var isUndefined = function(item){ + return typeof item !== 'undefined'; + }; + + var files = coverage.files; + var totals = { + totalSmts: 0, + numberOfFilesCovered: 0, + passedBranches: 0, + totalBranches: 0, + moduleTotalStatements : {}, + moduleTotalCoveredStatements : {}, + moduleTotalBranches : {}, + moduleTotalCoveredBranches : {} + }; + + // check if a data-cover-modulepattern was provided for per-module coverage reporting + var modulePattern = _blanket.options("modulePattern"); + var modulePatternRegex = ( modulePattern ? new RegExp(modulePattern) : null ); + + for(var file in files) + { + fileNumber++; + + var statsForFile = files[file], + totalSmts = 0, + numberOfFilesCovered = 0, + code = [], + i; + + + var end = []; + for(i = 0; i < statsForFile.source.length; i +=1){ + var src = statsForFile.source[i]; + + if (branchStack.length > 0 || + typeof statsForFile.branchData !== 'undefined') + { + if (typeof statsForFile.branchData[i+1] !== 'undefined') + { + var cols = statsForFile.branchData[i+1].filter(isUndefined); + var colsIndex=0; + + + src = branchReport(colsIndex,src,cols,0,i+1).src; + + }else if (branchStack.length){ + src = branchReport(0,src,null,0,i+1).src; + }else{ + src = escapeInvalidXmlChars(src); + } + }else{ + src = escapeInvalidXmlChars(src); + } + var lineClass=""; + if(statsForFile[i+1]) { + numberOfFilesCovered += 1; + totalSmts += 1; + lineClass = 'hit'; + }else{ + if(statsForFile[i+1] === 0){ + totalSmts++; + lineClass = 'miss'; + } + } + code[i + 1] = "
"+(i + 1)+""+src+"
"; + } + totals.totalSmts += totalSmts; + totals.numberOfFilesCovered += numberOfFilesCovered; + var totalBranches=0; + var passedBranches=0; + if (typeof statsForFile.branchData !== 'undefined'){ + for(var j=0;j 0 && + typeof statsForFile.branchData[j][k][1] !== 'undefined' && + statsForFile.branchData[j][k][1].length > 0){ + passedBranches++; + } + } + } + } + } + } + totals.passedBranches += passedBranches; + totals.totalBranches += totalBranches; + + // if "data-cover-modulepattern" was provided, + // track totals per module name as well as globally + if (modulePatternRegex) { + var moduleName = file.match(modulePatternRegex)[1]; + + if(!totals.moduleTotalStatements.hasOwnProperty(moduleName)) { + totals.moduleTotalStatements[moduleName] = 0; + totals.moduleTotalCoveredStatements[moduleName] = 0; + } + + totals.moduleTotalStatements[moduleName] += totalSmts; + totals.moduleTotalCoveredStatements[moduleName] += numberOfFilesCovered; + + if(!totals.moduleTotalBranches.hasOwnProperty(moduleName)) { + totals.moduleTotalBranches[moduleName] = 0; + totals.moduleTotalCoveredBranches[moduleName] = 0; + } + + totals.moduleTotalBranches[moduleName] += totalBranches; + totals.moduleTotalCoveredBranches[moduleName] += passedBranches; + } + + var result = percentage(numberOfFilesCovered, totalSmts); + + var output = fileTemplate.replace("{{file}}", file) + .replace("{{percentage}}",result) + .replace("{{numberCovered}}", numberOfFilesCovered) + .replace(/\{\{fileNumber\}\}/g, fileNumber) + .replace("{{totalSmts}}", totalSmts) + .replace("{{totalBranches}}", totalBranches) + .replace("{{passedBranches}}", passedBranches) + .replace("{{source}}", code.join(" ")); + if(result < successRate) + { + output = output.replace("{{statusclass}}", "bl-error"); + } else { + output = output.replace("{{statusclass}}", "bl-success"); + } + bodyContent += output; + } + + // create temporary function for use by the global totals reporter, + // as well as the per-module totals reporter + var createAggregateTotal = function(numSt, numCov, numBranch, numCovBr, moduleName) { + + var totalPercent = percentage(numCov, numSt); + var statusClass = totalPercent < successRate ? "bl-error" : "bl-success"; + var rowTitle = ( moduleName ? "Total for module: " + moduleName : "Global total" ); + var totalsOutput = grandTotalTemplate.replace("{{rowTitle}}", rowTitle) + .replace("{{percentage}}", totalPercent) + .replace("{{numberCovered}}", numCov) + .replace("{{totalSmts}}", numSt) + .replace("{{passedBranches}}", numCovBr) + .replace("{{totalBranches}}", numBranch) + .replace("{{statusclass}}", statusClass); + + bodyContent += totalsOutput; + }; + + // if "data-cover-modulepattern" was provided, + // output the per-module totals alongside the global totals + if (modulePatternRegex) { + for (var thisModuleName in totals.moduleTotalStatements) { + if (totals.moduleTotalStatements.hasOwnProperty(thisModuleName)) { + + var moduleTotalSt = totals.moduleTotalStatements[thisModuleName]; + var moduleTotalCovSt = totals.moduleTotalCoveredStatements[thisModuleName]; + + var moduleTotalBr = totals.moduleTotalBranches[thisModuleName]; + var moduleTotalCovBr = totals.moduleTotalCoveredBranches[thisModuleName]; + + createAggregateTotal(moduleTotalSt, moduleTotalCovSt, moduleTotalBr, moduleTotalCovBr, thisModuleName); + } + } + } + + createAggregateTotal(totals.totalSmts, totals.numberOfFilesCovered, totals.totalBranches, totals.passedBranches, null); + bodyContent += "
"; //closing main + + + appendTag('style', head, cssSytle); + //appendStyle(body, headerContent); + if (document.getElementById("blanket-main")){ + document.getElementById("blanket-main").innerHTML= + bodyContent.slice(23,-6); + }else{ + appendTag('div', body, bodyContent); + } + //appendHtml(body, ''); +}; + +(function(){ + var newOptions={}; + //http://stackoverflow.com/a/2954896 + var toArray =Array.prototype.slice; + var scripts = toArray.call(document.scripts); + toArray.call(scripts[scripts.length - 1].attributes) + .forEach(function(es){ + if(es.nodeName === "data-cover-only"){ + newOptions.filter = es.nodeValue; + } + if(es.nodeName === "data-cover-never"){ + newOptions.antifilter = es.nodeValue; + } + if(es.nodeName === "data-cover-reporter"){ + newOptions.reporter = es.nodeValue; + } + if (es.nodeName === "data-cover-adapter"){ + newOptions.adapter = es.nodeValue; + } + if (es.nodeName === "data-cover-loader"){ + newOptions.loader = es.nodeValue; + } + if (es.nodeName === "data-cover-timeout"){ + newOptions.timeout = es.nodeValue; + } + if (es.nodeName === "data-cover-modulepattern") { + newOptions.modulePattern = es.nodeValue; + } + if (es.nodeName === "data-cover-reporter-options"){ + try{ + newOptions.reporter_options = JSON.parse(es.nodeValue); + }catch(e){ + if (blanket.options("debug")){ + throw new Error("Invalid reporter options. Must be a valid stringified JSON object."); + } + } + } + if (es.nodeName === "data-cover-testReadyCallback"){ + newOptions.testReadyCallback = es.nodeValue; + } + if (es.nodeName === "data-cover-customVariable"){ + newOptions.customVariable = es.nodeValue; + } + if (es.nodeName === "data-cover-flags"){ + var flags = " "+es.nodeValue+" "; + if (flags.indexOf(" ignoreError ") > -1){ + newOptions.ignoreScriptError = true; + } + if (flags.indexOf(" autoStart ") > -1){ + newOptions.autoStart = true; + } + if (flags.indexOf(" ignoreCors ") > -1){ + newOptions.ignoreCors = true; + } + if (flags.indexOf(" branchTracking ") > -1){ + newOptions.branchTracking = true; + } + if (flags.indexOf(" sourceURL ") > -1){ + newOptions.sourceURL = true; + } + if (flags.indexOf(" debug ") > -1){ + newOptions.debug = true; + } + if (flags.indexOf(" engineOnly ") > -1){ + newOptions.engineOnly = true; + } + if (flags.indexOf(" commonJS ") > -1){ + newOptions.commonJS = true; + } + if (flags.indexOf(" instrumentCache ") > -1){ + newOptions.instrumentCache = true; + } + } + }); + blanket.options(newOptions); + + if (typeof requirejs !== 'undefined'){ + blanket.options("existingRequireJS",true); + } + /* setup requirejs loader, if needed */ + + if (blanket.options("commonJS")){ + blanket._commonjs = {}; + } +})(); +(function(_blanket){ +_blanket.extend({ + utils: { + normalizeBackslashes: function(str) { + return str.replace(/\\/g, '/'); + }, + matchPatternAttribute: function(filename,pattern){ + if (typeof pattern === 'string'){ + if (pattern.indexOf("[") === 0){ + //treat as array + var pattenArr = pattern.slice(1,pattern.length-1).split(","); + return pattenArr.some(function(elem){ + return _blanket.utils.matchPatternAttribute(filename,_blanket.utils.normalizeBackslashes(elem.slice(1,-1))); + //return filename.indexOf(_blanket.utils.normalizeBackslashes(elem.slice(1,-1))) > -1; + }); + }else if ( pattern.indexOf("//") === 0){ + var ex = pattern.slice(2,pattern.lastIndexOf('/')); + var mods = pattern.slice(pattern.lastIndexOf('/')+1); + var regex = new RegExp(ex,mods); + return regex.test(filename); + }else if (pattern.indexOf("#") === 0){ + return window[pattern.slice(1)].call(window,filename); + }else{ + return filename.indexOf(_blanket.utils.normalizeBackslashes(pattern)) > -1; + } + }else if ( pattern instanceof Array ){ + return pattern.some(function(elem){ + return _blanket.utils.matchPatternAttribute(filename,elem); + }); + }else if (pattern instanceof RegExp){ + return pattern.test(filename); + }else if (typeof pattern === "function"){ + return pattern.call(window,filename); + } + }, + blanketEval: function(data){ + _blanket._addScript(data); + }, + collectPageScripts: function(){ + var toArray = Array.prototype.slice; + var scripts = toArray.call(document.scripts); + var selectedScripts=[],scriptNames=[]; + var filter = _blanket.options("filter"); + if(filter != null){ + //global filter in place, data-cover-only + var antimatch = _blanket.options("antifilter"); + selectedScripts = toArray.call(document.scripts) + .filter(function(s){ + return toArray.call(s.attributes).filter(function(sn){ + return sn.nodeName === "src" && _blanket.utils.matchPatternAttribute(sn.nodeValue,filter) && + (typeof antimatch === "undefined" || !_blanket.utils.matchPatternAttribute(sn.nodeValue,antimatch)); + }).length === 1; + }); + }else{ + selectedScripts = toArray.call(document.querySelectorAll("script[data-cover]")); + } + scriptNames = selectedScripts.map(function(s){ + return _blanket.utils.qualifyURL( + toArray.call(s.attributes).filter( + function(sn){ + return sn.nodeName === "src"; + })[0].nodeValue); + }); + if (!filter){ + _blanket.options("filter","['"+scriptNames.join("','")+"']"); + } + return scriptNames; + }, + loadAll: function(nextScript,cb,preprocessor){ + /** + * load dependencies + * @param {nextScript} factory for priority level + * @param {cb} the done callback + */ + var currScript=nextScript(); + var isLoaded = _blanket.utils.scriptIsLoaded( + currScript, + _blanket.utils.ifOrdered, + nextScript, + cb + ); + + if (!(_blanket.utils.cache[currScript] && _blanket.utils.cache[currScript].loaded)){ + var attach = function(){ + if (_blanket.options("debug")) {console.log("BLANKET-Mark script:"+currScript+", as loaded and move to next script.");} + isLoaded(); + }; + var whenDone = function(result){ + if (_blanket.options("debug")) {console.log("BLANKET-File loading finished");} + if (typeof result !== 'undefined'){ + if (_blanket.options("debug")) {console.log("BLANKET-Add file to DOM.");} + _blanket._addScript(result); + } + attach(); + }; + + _blanket.utils.attachScript( + { + url: currScript + }, + function (content){ + _blanket.utils.processFile( + content, + currScript, + whenDone, + whenDone + ); + } + ); + }else{ + isLoaded(); + } + }, + attachScript: function(options,cb){ + var timeout = _blanket.options("timeout") || 3000; + setTimeout(function(){ + if (!_blanket.utils.cache[options.url].loaded){ + throw new Error("error loading source script"); + } + },timeout); + _blanket.utils.getFile( + options.url, + cb, + function(){ throw new Error("error loading source script");} + ); + }, + ifOrdered: function(nextScript,cb){ + /** + * ordered loading callback + * @param {nextScript} factory for priority level + * @param {cb} the done callback + */ + var currScript = nextScript(true); + if (currScript){ + _blanket.utils.loadAll(nextScript,cb); + }else{ + cb(new Error("Error in loading chain.")); + } + }, + scriptIsLoaded: function(url,orderedCb,nextScript,cb){ + /** + * returns a callback that checks a loading list to see if a script is loaded. + * @param {orderedCb} callback if ordered loading is being done + * @param {nextScript} factory for next priority level + * @param {cb} the done callback + */ + if (_blanket.options("debug")) {console.log("BLANKET-Returning function");} + return function(){ + if (_blanket.options("debug")) {console.log("BLANKET-Marking file as loaded: "+url);} + + _blanket.utils.cache[url].loaded=true; + + if (_blanket.utils.allLoaded()){ + if (_blanket.options("debug")) {console.log("BLANKET-All files loaded");} + cb(); + }else if (orderedCb){ + //if it's ordered we need to + //traverse down to the next + //priority level + if (_blanket.options("debug")) {console.log("BLANKET-Load next file.");} + orderedCb(nextScript,cb); + } + }; + }, + cache: {}, + allLoaded: function (){ + /** + * check if depdencies are loaded in cache + */ + var cached = Object.keys(_blanket.utils.cache); + for (var i=0;i -1){ + callback(_blanket.blanketSession[key]); + foundInSession=true; + return; + } + } + } + if (!foundInSession){ + var xhr = _blanket.utils.createXhr(); + xhr.open('GET', url, true); + + //Allow overrides specified in config + if (onXhr) { + onXhr(xhr, url); + } + + xhr.onreadystatechange = function (evt) { + var status, err; + + //Do not explicitly handle errors, those should be + //visible via console output in the browser. + if (xhr.readyState === 4) { + status = xhr.status; + if ((status > 399 && status < 600) /*|| + (status === 0 && + navigator.userAgent.toLowerCase().indexOf('firefox') > -1) + */ ) { + //An http 4xx or 5xx error. Signal an error. + err = new Error(url + ' HTTP status: ' + status); + err.xhr = xhr; + errback(err); + } else { + callback(xhr.responseText); + } + } + }; + try{ + xhr.send(null); + }catch(e){ + if (e.code && (e.code === 101 || e.code === 1012) && _blanket.options("ignoreCors") === false){ + //running locally and getting error from browser + _blanket.showManualLoader(); + } else { + throw e; + } + } + } + } + } +}); + +(function(){ + var require = blanket.options("commonJS") ? blanket._commonjs.require : window.require; + var requirejs = blanket.options("commonJS") ? blanket._commonjs.requirejs : window.requirejs; + if (!_blanket.options("engineOnly") && _blanket.options("existingRequireJS")){ + + _blanket.utils.oldloader = requirejs.load; + + requirejs.load = function (context, moduleName, url) { + _blanket.requiringFile(url); + _blanket.utils.getFile(url, + function(content){ + _blanket.utils.processFile( + content, + url, + function newLoader(){ + context.completeLoad(moduleName); + }, + function oldLoader(){ + _blanket.utils.oldloader(context, moduleName, url); + } + ); + }, function (err) { + _blanket.requiringFile(); + throw err; + }); + }; + } + // Save the XHR constructor, just in case frameworks like Sinon would sandbox it. + _blanket.utils.cacheXhrConstructor(); +})(); + +})(blanket); + +(function(){ +if (typeof QUnit !== 'undefined'){ + //check to make sure requirejs is completed before we start the test runner + var allLoaded = function() { + return window.QUnit.config.queue.length > 0 && blanket.noConflict().requireFilesLoaded(); + }; + + if (!QUnit.config.urlConfig[0].tooltip){ + //older versions we run coverage automatically + //and we change how events are binded + QUnit.begin=function(){ + blanket.noConflict().setupCoverage(); + }; + + QUnit.done=function(failures, total) { + blanket.noConflict().onTestsDone(); + }; + QUnit.moduleStart=function( details ) { + blanket.noConflict().onModuleStart(); + }; + QUnit.testStart=function( details ) { + blanket.noConflict().onTestStart(); + }; + QUnit.testDone=function( details ) { + blanket.noConflict().onTestDone(details.total,details.passed); + }; + blanket.beforeStartTestRunner({ + condition: allLoaded, + callback: QUnit.start + }); + }else{ + QUnit.config.urlConfig.push({ + id: "coverage", + label: "Enable coverage", + tooltip: "Enable code coverage." + }); + + if ( QUnit.urlParams.coverage || blanket.options("autoStart") ) { + QUnit.begin(function(){ + blanket.noConflict().setupCoverage(); + }); + + QUnit.done(function(failures, total) { + blanket.noConflict().onTestsDone(); + }); + QUnit.moduleStart(function( details ) { + blanket.noConflict().onModuleStart(); + }); + QUnit.testStart(function( details ) { + blanket.noConflict().onTestStart(); + }); + QUnit.testDone(function( details ) { + blanket.noConflict().onTestDone(details.total,details.passed); + }); + blanket.noConflict().beforeStartTestRunner({ + condition: allLoaded, + callback: function(){ + if (!(blanket.options("existingRequireJS") && !blanket.options("autoStart"))){ + QUnit.start(); + } + } + }); + }else{ + if (blanket.options("existingRequireJS")){ requirejs.load = _blanket.utils.oldloader; } + blanket.noConflict().beforeStartTestRunner({ + condition: allLoaded, + callback: function(){ + if (!(blanket.options("existingRequireJS") && !blanket.options("autoStart"))){ + QUnit.start(); + } + }, + coverage:false + }); + } + } +} +})(); diff --git a/www/js/hammerjs/tests/unit/assets/jquery.min.js b/www/js/hammerjs/tests/unit/assets/jquery.min.js new file mode 100644 index 0000000..e5ace11 --- /dev/null +++ b/www/js/hammerjs/tests/unit/assets/jquery.min.js @@ -0,0 +1,4 @@ +/*! jQuery v2.1.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l=a.document,m="2.1.1",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!n.isArray(a)&&a-parseFloat(a)>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!j.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=l.createElement("script"),b.text=a,l.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:g.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(e=d.call(arguments,2),f=function(){return a.apply(b||this,e.concat(d.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:k}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+-new Date,v=a.document,w=0,x=0,y=gb(),z=gb(),A=gb(),B=function(a,b){return a===b&&(l=!0),0},C="undefined",D=1<<31,E={}.hasOwnProperty,F=[],G=F.pop,H=F.push,I=F.push,J=F.slice,K=F.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},L="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",N="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=N.replace("w","w#"),P="\\["+M+"*("+N+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+O+"))|)"+M+"*\\]",Q=":("+N+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+P+")*)|.*)\\)|)",R=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),S=new RegExp("^"+M+"*,"+M+"*"),T=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),V=new RegExp(Q),W=new RegExp("^"+O+"$"),X={ID:new RegExp("^#("+N+")"),CLASS:new RegExp("^\\.("+N+")"),TAG:new RegExp("^("+N.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+Q),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+L+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{I.apply(F=J.call(v.childNodes),v.childNodes),F[v.childNodes.length].nodeType}catch(eb){I={apply:F.length?function(a,b){H.apply(a,J.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],!a||"string"!=typeof a)return d;if(1!==(k=b.nodeType)&&9!==k)return[];if(p&&!e){if(f=_.exec(a))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return I.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return I.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=9===k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+qb(o[l]);w=ab.test(a)&&ob(b.parentNode)||b,x=o.join(",")}if(x)try{return I.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function gb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function hb(a){return a[u]=!0,a}function ib(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function jb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function kb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||D)-(~a.sourceIndex||D);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function lb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function nb(a){return hb(function(b){return b=+b,hb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function ob(a){return a&&typeof a.getElementsByTagName!==C&&a}c=fb.support={},f=fb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fb.setDocument=function(a){var b,e=a?a.ownerDocument||a:v,g=e.defaultView;return e!==n&&9===e.nodeType&&e.documentElement?(n=e,o=e.documentElement,p=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){m()},!1):g.attachEvent&&g.attachEvent("onunload",function(){m()})),c.attributes=ib(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ib(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(e.getElementsByClassName)&&ib(function(a){return a.innerHTML="
",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=ib(function(a){return o.appendChild(a).id=u,!e.getElementsByName||!e.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==C&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c=typeof a.getAttributeNode!==C&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==C?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==C&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(e.querySelectorAll))&&(ib(function(a){a.innerHTML="",a.querySelectorAll("[msallowclip^='']").length&&q.push("[*^$]="+M+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+M+"*(?:value|"+L+")"),a.querySelectorAll(":checked").length||q.push(":checked")}),ib(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+M+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ib(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",Q)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===v&&t(v,a)?-1:b===e||b.ownerDocument===v&&t(v,b)?1:k?K.call(k,a)-K.call(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],i=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:k?K.call(k,a)-K.call(k,b):0;if(f===g)return kb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?kb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},e):n},fb.matches=function(a,b){return fb(a,null,null,b)},fb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fb(b,n,null,[a]).length>0},fb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&E.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fb.selectors={cacheLength:50,createPseudo:hb,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+M+")"+a+"("+M+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==C&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?hb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=K.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:hb(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?hb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:hb(function(a){return function(b){return fb(a,b).length>0}}),contains:hb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:hb(function(a){return W.test(a||"")||fb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:nb(function(){return[0]}),last:nb(function(a,b){return[b-1]}),eq:nb(function(a,b,c){return[0>c?c+b:c]}),even:nb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:nb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:nb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:nb(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function rb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function sb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function tb(a,b,c){for(var d=0,e=b.length;e>d;d++)fb(a,b[d],c);return c}function ub(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function vb(a,b,c,d,e,f){return d&&!d[u]&&(d=vb(d)),e&&!e[u]&&(e=vb(e,f)),hb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||tb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ub(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ub(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?K.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ub(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):I.apply(g,r)})}function wb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=rb(function(a){return a===b},h,!0),l=rb(function(a){return K.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>i;i++)if(c=d.relative[a[i].type])m=[rb(sb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return vb(i>1&&sb(m),i>1&&qb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&wb(a.slice(i,e)),f>e&&wb(a=a.slice(e)),f>e&&qb(a))}m.push(c)}return sb(m)}function xb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=G.call(i));s=ub(s)}I.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&fb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?hb(f):f}return h=fb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xb(e,d)),f.selector=a}return f},i=fb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&ob(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qb(j),!a)return I.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&ob(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ib(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ib(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||jb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ib(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||jb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ib(function(a){return null==a.getAttribute("disabled")})||jb(L,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fb}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return g.call(b,a)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:l,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=l.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=l,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};A.prototype=n.fn,y=n(l);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?g.call(n(a),this[0]):g.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(C[a]||n.unique(e),B.test(a)&&e.reverse()),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return n.each(a.match(E)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(b=a.memory&&l,c=!0,g=e||0,e=0,f=h.length,d=!0;h&&f>g;g++)if(h[g].apply(l[0],l[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,h&&(i?i.length&&j(i.shift()):b?h=[]:k.disable())},k={add:function(){if(h){var c=h.length;!function g(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&g(c)})}(arguments),d?f=h.length:b&&(e=c,j(b))}return this},remove:function(){return h&&n.each(arguments,function(a,b){var c;while((c=n.inArray(b,h,c))>-1)h.splice(c,1),d&&(f>=c&&f--,g>=c&&g--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],f=0,this},disable:function(){return h=i=b=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,b||k.disable(),this},locked:function(){return!i},fireWith:function(a,b){return!h||c&&!i||(b=b||[],b=[a,b.slice?b.slice():b],d?i.push(b):j(b)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!c}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(H.resolveWith(l,[n]),n.fn.triggerHandler&&(n(l).triggerHandler("ready"),n(l).off("ready"))))}});function I(){l.removeEventListener("DOMContentLoaded",I,!1),a.removeEventListener("load",I,!1),n.ready()}n.ready.promise=function(b){return H||(H=n.Deferred(),"complete"===l.readyState?setTimeout(n.ready):(l.addEventListener("DOMContentLoaded",I,!1),a.addEventListener("load",I,!1))),H.promise(b)},n.ready.promise();var J=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};n.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function K(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=n.expando+Math.random()}K.uid=1,K.accepts=n.acceptData,K.prototype={key:function(a){if(!K.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=K.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=c,n.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if("string"==typeof b)f[b]=c;else if(n.isEmptyObject(f))n.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(E)||[])),c=d.length;while(c--)delete g[d[c]]}},hasData:function(a){return!n.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var L=new K,M=new K,N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(O,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}M.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return M.hasData(a)||L.hasData(a)},data:function(a,b,c){return M.access(a,b,c)},removeData:function(a,b){M.remove(a,b) +},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=n.camelCase(a);if(f&&void 0===b){if(c=M.get(f,a),void 0!==c)return c;if(c=M.get(f,d),void 0!==c)return c;if(c=P(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=M.get(this,d);M.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&M.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){M.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=L.get(a,b),c&&(!d||n.isArray(c)?d=L.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return L.get(a,c)||L.access(a,c,{empty:n.Callbacks("once memory").add(function(){L.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthx",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U="undefined";k.focusinBubbles="onfocusin"in a;var V=/^key/,W=/^(?:mouse|pointer|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return l.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof n!==U&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(E)||[""],j=b.length;while(j--)h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.hasData(a)&&L.get(a);if(r&&(i=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&(delete r.handle,L.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,m,o,p=[d||l],q=j.call(b,"type")?b.type:b,r=j.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||l,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+n.event.triggered)&&(q.indexOf(".")>=0&&(r=q.split("."),q=r.shift(),r.sort()),k=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=r.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},e||!o.trigger||o.trigger.apply(d,c)!==!1)){if(!e&&!o.noBubble&&!n.isWindow(d)){for(i=o.delegateType||q,X.test(i+q)||(g=g.parentNode);g;g=g.parentNode)p.push(g),h=g;h===(d.ownerDocument||l)&&p.push(h.defaultView||h.parentWindow||a)}f=0;while((g=p[f++])&&!b.isPropagationStopped())b.type=f>1?i:o.bindType||q,m=(L.get(g,"events")||{})[b.type]&&L.get(g,"handle"),m&&m.apply(g,c),m=k&&g[k],m&&m.apply&&n.acceptData(g)&&(b.result=m.apply(g,c),b.result===!1&&b.preventDefault());return b.type=q,e||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!n.acceptData(d)||k&&n.isFunction(d[q])&&!n.isWindow(d)&&(h=d[k],h&&(d[k]=null),n.event.triggered=q,d[q](),n.event.triggered=void 0,h&&(d[k]=h)),b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(L.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(g.namespace))&&(a.handleObj=g,a.data=g.data,e=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(a.result=e)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||"click"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>=0:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]*)\/>/gi,bb=/<([\w:]+)/,cb=/<|&#?\w+;/,db=/<(?:script|style|link)/i,eb=/checked\s*(?:[^=]|=\s*.checked.)/i,fb=/^$|\/(?:java|ecma)script/i,gb=/^true\/(.*)/,hb=/^\s*\s*$/g,ib={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ib.optgroup=ib.option,ib.tbody=ib.tfoot=ib.colgroup=ib.caption=ib.thead,ib.th=ib.td;function jb(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function kb(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function lb(a){var b=gb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function mb(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",!b||L.get(b[c],"globalEval"))}function nb(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&&(f=L.access(a),g=L.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=n.extend({},h),M.set(b,i))}}function ob(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function pb(a,b){var c=b.nodeName.toLowerCase();"input"===c&&T.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}n.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=ob(h),f=ob(a),d=0,e=f.length;e>d;d++)pb(f[d],g[d]);if(b)if(c)for(f=f||ob(a),g=g||ob(h),d=0,e=f.length;e>d;d++)nb(f[d],g[d]);else nb(a,h);return g=ob(h,"script"),g.length>0&&mb(g,!i&&ob(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,o=a.length;o>m;m++)if(e=a[m],e||0===e)if("object"===n.type(e))n.merge(l,e.nodeType?[e]:e);else if(cb.test(e)){f=f||k.appendChild(b.createElement("div")),g=(bb.exec(e)||["",""])[1].toLowerCase(),h=ib[g]||ib._default,f.innerHTML=h[1]+e.replace(ab,"<$1>")+h[2],j=h[0];while(j--)f=f.lastChild;n.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));k.textContent="",m=0;while(e=l[m++])if((!d||-1===n.inArray(e,d))&&(i=n.contains(e.ownerDocument,e),f=ob(k.appendChild(e),"script"),i&&mb(f),c)){j=0;while(e=f[j++])fb.test(e.type||"")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f=n.event.special,g=0;void 0!==(c=a[g]);g++){if(n.acceptData(c)&&(e=c[L.expando],e&&(b=L.cache[e]))){if(b.events)for(d in b.events)f[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);L.cache[e]&&delete L.cache[e]}delete M.cache[c[M.expando]]}}}),n.fn.extend({text:function(a){return J(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=jb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=jb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(ob(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&mb(ob(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(ob(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return J(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!db.test(a)&&!ib[(bb.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(ab,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(ob(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(ob(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,m=this,o=l-1,p=a[0],q=n.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&eb.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(c=n.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=n.map(ob(c,"script"),kb),g=f.length;l>j;j++)h=c,j!==o&&(h=n.clone(h,!0,!0),g&&n.merge(f,ob(h,"script"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,n.map(f,lb),j=0;g>j;j++)h=f[j],fb.test(h.type||"")&&!L.access(h,"globalEval")&&n.contains(i,h)&&(h.src?n._evalUrl&&n._evalUrl(h.src):n.globalEval(h.textContent.replace(hb,"")))}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),n(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qb,rb={};function sb(b,c){var d,e=n(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:n.css(e[0],"display");return e.detach(),f}function tb(a){var b=l,c=rb[a];return c||(c=sb(a,b),"none"!==c&&c||(qb=(qb||n("